;********************************************** ;* MIDI Note Trigger MNT Version 1.1 * ;********************************************** ; ; Version vom 11.01.00 fuer 80C31 und Eprom 2732 ; oder AT89C2051 ; Aenderungen: ; V1.1 - Erste lauffaehige Version ; Entwicklungsvorgaben ; -------------------- ; RAM initialisieren------------fertig ; MIDI initialisieren-----------fertig ; Registerbank festlegen--------Bank 0 ; Hauptschleife-----------------fertig ; Portbelegungen ; -------------- ; P1.0 -Sw. Data P3.0 ; P1.1 -Sw. Data P3.1 -TxD ; P1.2 -Sw. Data P3.2 ; P1.3 -Sw. Data P3.3 -Sw. MIDI Chan./Velocity ; P1.4 -Sw. Data P3.4 -Trigger ; P1.5 -Sw. Data P3.5 -Sw. Note No. ; P1.6 -Sw. Data P3.6 ; P1.7 P3.7 ; Registerbelegungen ; ------------------ ; R0 ; R1 Statusbyte ; R2 Note No. ; R3 ; R4 Verzoegerung ; R5 Verzoegerung ; R6 Verzoegerung ; R7 .registers reg51.inc ; 8051 SF-Register .var_org $20 ; Variablen-PC setzen merker: .ds.b 1 ; Merker fuer Sendestatus stack: ; Rest fuer Stack .text_org $0000 ; ROM-Bereich ; ----- Interruptbereich -------------------------------------------------- reset: ljmp start ; normaler Systemstart int0: reti ; alle Interrupt abgeschaltet .ds.b 7 timer0: reti .ds.b 7 int1: reti .ds.b 7 timer1: reti .ds.b 7 serial: reti ; ----- Serielle Schnittstelle initialisieren ----------------------------- start: mov SP,#stack ; Stack einrichten clr PSW.3 ; Registerbank 0 clr PSW.4 mov TMOD,#%00100000 ; Timer 1 Baudrate, Timer 2 aus mov TCON,#%01000000 ; Timer 1 laeuft... mov TH1,#$FF ; Timer 1 Reload fuer Baudrate 31250 mov SCON,#%01111100 ; Init. serielle Schnittstelle mov IE,#0 ; alle Interrupt verbieten clr SCON.1 ; TI loeschen ; ----- Ports loeschen ---------------------------------------------------- mov P1,#$FF ; Port 1 loeschen mov P3,#$FF ; Port 3 loeschen ; ----- Register initialisieren ------------------------------------------- mov merker,#0 ; Merker loeschen mov R1,#$90 ; Statusbyte auf NOTE ON setzen mov R2,#0 ; Notennummer initialisieren mov R4,#0 ; Werte fuer Verzoegerung laden mov R5,#0 ; ca. 3 Sekunden mov R6,#32 ; ----- Einschwingvorgaenge abwarten -------------------------------------- v1: djnz R4,! ; und troedeln djnz R5,v1 djnz R6,v1 ; ----- Hauptschleife ----------------------------------------------------- haupt: jnb P3.4,trg_on ; Triggersignal vorhanden, dann zur Notenausgabe jnb merker.0,haupt ; war Note noch nicht abgeschaltet? mov SBUF,R1 ; dann Statusbyte senden jnb SCON.1,! ; und Sendevorgang abwarten clr SCON.1 mov SBUF,R2 ; Note No. senden jnb SCON.1,! ; und Sendevorgang abwarten clr SCON.1 mov SBUF,#0 ; Velocity=0 senden clr merker.0 ; Merker loeschen jnb SCON.1,! ; und Sendevorgang abwarten clr SCON.1 sjmp haupt ; und von vorn trg_on: jb merker.0,haupt ; war Note noch nicht eingeschaltet? clr P3.3 ; dann Byte mit MIDI Kanal und Velocity holen mov A,P1 setb P3.3 mov R3,A ; Byte fuer Velocity-Berechnung sichern anl A,#%00001111 ; MIDI Kanal isolieren orl A,#$90 ; Status NOTE ON hinzufuegen mov SBUF,A ; Statusbyte senden mov R1,A ; und fuer NOTE OFF sichern clr P3.5 ; Note No. holen mov A,P1 setb P3.5 clr ACC.7 ; Bit 7 ausblenden mov R2,A ; fuer NOTE OFF sichern jnb SCON.1,! ; und Sendevorgang abwarten clr SCON.1 mov SBUF,R2 ; Note No. senden mov A,R3 ; gesichertes Byte mit Velocity holen anl A,#%01110000 ; Velocity isolieren orl A,#$0F ; Velocity ist Vielfaches von 15 jnb SCON.1,! ; und Sendevorgang abwarten clr SCON.1 mov SBUF,A ; Velocity senden setb merker.0 ; Merker setzen jnb SCON.1,! ; Sendevorgang abwarten clr SCON.1 ajmp haupt ; und von vorn