;********************************************** ;* Leslie Controller Version 1.0 * ;********************************************** ; Version vom 10.01.95 ; Entwicklungsvorgaben ; -------------------- ; RAM initialisieren------------fertig ; MIDI initialisieren-----------fertig ; Stack festlegen---------------fliessend oberhalb Variable ; Registerbank festlegen--------Bank 0 ; Routine On--------------------fertig ; Routine Depth-----------------fertig ; Routine Time------------------fertig ; MIDI-Kanal einlesen-----------fertig ; Routine MIDI Out--------------fertig ; Aenderungen: ; ------------ ; V1.0 - Laufaehige Erstfassung .registers reg51.inc ; 8051 SF-Register ; ------Variablen Internes RAM -------------------------------------------- .var_org $08 ; Variablen-PC unterhalb Bitbereich setzen status: .ds.b 1 ; MIDI-Byte Prg.Chg. + Chan. out: .ds.b 1 ; letzter gesendeter Wert max: .ds.b 1 ; Maximum fuer Modulation d75: .ds.b 1 ; Wert fuer Depth 75 Prozent tim1: .ds.b 1 ; Wert Anlauf fuer Time kurz tim2: .ds.b 1 ; Wert Anlauf fuer Time lang tim3: .ds.b 1 ; Wert Auslauf fuer Time kurz tim4: .ds.b 1 ; Wert Auslauf fuer Time lang time_1: .ds.b 1 ; aktuelle Anlaufzeit time_2: .ds.b 1 ; aktuelle Auslaufzeit .var_org $30 ; Variablen-PC oberhalb Bitbereich setzen stack: .ds.b 1 ; Rest fuer Stack .text_org $0 ; ROM-Bereich ; Verwendung der Ports ; -------------------- ; P1.0 -Sw. Chan. #0 P3.0 ; P1.1 -Sw. Chan. #1 P3.1 -TxD ; P1.2 -Sw. Chan. #2 P3.2 -LED Depth ; P1.3 -Sw. Chan. #3 P3.3 -LED Time ; P1.4 -Sw. Time P3.4 -LED On ; P1.5 -Sw. Depth P3.5 ; P1.6 -Sw. On P3.6 ; P1.7 P3.7 ; Verwendung der Register R0 - R7: ; -------------------------------- ; R0 Zaehler ; R1 Zaehler ; R2 nicht verwendet ; R3 nicht verwendet ; R4 nicht verwendet ; R5 nicht verwendet ; R6 nicht verwendet ; R7 nicht verwendet reset: ljmp start int0: reti .ds.b 7 timer0: reti .ds.b 7 int1: reti .ds.b 7 timer1: reti .ds.b 7 serial: reti ; ----- EPROM-Info -------------------------------------------------------- .dc.b "+++" .dc.b " Leslie Controller V1.0 / EPROM 8751" .dc.b " / (C) Stefan Harasim 01/1995 " .dc.b "+++" ; ----- Stack einrichten / Registerbank festlegen ------------------------- start: mov SP,#stack ; Stack einrichten clr PSW.3 ; Registerbank 0 clr PSW.4 ; ----- Serielle Schnittstelle initialisieren ----------------------------- 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 ; ----- Ausgaenge loeschen ------------------------------------------------ mov P1,#$FF ; Port 1 loeschen mov P3,#$FF ; Port 3 loeschen ; ----- RAM initialisieren ------------------------------------------------ mov d75,#90 ; Depth Wert 75 Prozent setzen variabel !! mov tim1,#25 ; Time Wert Anlauf kurz setzen variabel !! mov tim3,#120 ; Time Wert Anlauf lang setzen variabel !! mov tim2,#40 ; Time Wert Auslauf kurz setzen variabel !! mov tim4,#170 ; Time Wert Auslauf lang setzen variabel !! mov status,#$B0 ; Control Change auf Kanal 1 mov R0,#$08 ; Pointer auf MIDI-Kanal mov A,P1 ; eingestellten Kanal holen xchd A,@R0 ; und abspeichern ; ----- Schalter einlesen, LEDs setzen ------------------------------------ jnb P1.5,depthi1 ; Schalter nicht gedrueckt ? mov max,#126 ; dann Maximum auf 126 setzen setb P3.2 ; LED loeschen sjmp timei0 ; und weiter mit Abfrage Time depthi1: mov max,d75 ; sonst Maximum auf Wert 75 Prozent setzen clr P3.2 ; und LED setzen timei0: jnb P1.4,timei1 ; Schalter nicht gedrueckt ? mov time_1,tim1 ; dann Time auf Werte kurz setzen mov time_2,tim3 setb P3.3 ; LED loeschen sjmp oni0 ; und weiter mit Abfrage On timei1: mov time_1,tim2 ; sonst Time auf Werte lang setzen mov time_2,tim4 clr P3.3 ; und LED setzen oni0: jnb P1.6,oni1 ; Schalter nicht gedrueckt ? mov out,#0 ; dann letzten gesendeten Wert auf 0 setzen setb P3.4 ; LED loeschen acall midiout ; Wert senden sjmp haupt ; und zur Hauptschleife oni1: mov out,max ; sonst letzen gesendeten Wert auf Maximum setzen setb P3.4 ; LED setzen acall midiout ; und Wert senden ; ----- Hauptschleife ----------------------------------------------------- haupt: acall on ; zur Subroutine Schalter On acall depth ; zur Subroutine Schalter Depth acall time ; zur Subroutine Schalter Time sjmp haupt ; ----- Subroutine On ----------------------------------------------------- on: jnb P1.6,on_on1 ; Taster nicht gedrueckt ? setb P3.4 ; dann LED loeschen mov A,out ; letzter gesendeter Wert 0 ? jnz on_off1 ret ; dann zurueck on_off1: mov R0,#255 ; dann Wert fuer Verzoegerung Auslauf laden mov R1,time_2 on_off2: djnz R0,! ; und warten djnz R1,on_off2 subb A,#2 ; letzten gesendeten Wert um 2 verringern mov out,A ; Wert sichern acall midiout ; senden ret ; und zurueck on_on1: clr P3.4 ; sonst LED setzen mov A,out ; letzter gesendeter Wert gleich oder groesser cjne A,max,on_on2 ; als Maximum ? on_on2: jc on_on3 ret ; dann zurueck on_on3: mov R0,#255 ; sonst Wert fuer Verzoegerung Anlauf laden mov R1,time_1 on_on4: djnz R0,! ; und warten djnz R1,on_on4 add A,#2 ; letzten gesendeten Wert um 2 vergroessern mov out,A ; Wert sichern acall midiout ; senden ret ; und zurueck ; ----- Subroutine Depth -------------------------------------------------- depth: jnb P1.5,depth1 ; Schalter nicht gedrueckt ? mov max,#126 ; dann Maximum auf 126 setzen setb P3.2 ; LED loeschen ret ; und zurueck depth1: mov max,d75 ; sonst Maximum auf Wert 75 Prozent setzen clr P3.2 ; und LED setzen ret ; und zurueck ; ----- Subroutine Time --------------------------------------------------- time: jnb P1.4,time1 ; Schalter nicht gedrueckt ? mov time_1,tim1 ; dann Time auf Werte kurz setzen mov time_2,tim3 setb P3.3 ; LED loeschen ret ; und zurueck time1: mov time_1,tim2 ; sonst Time auf Werte lang setzen mov time_2,tim4 clr P3.3 ; und LED setzen ret ; und zurueck ; ----- MIDI OUT Routine -------------------------------------------------- midiout: mov SBUF,status ; Control Change senden jnb SCON.1,! clr SCON.1 mov SBUF,#1 ; Modulation Wheel senden jnb SCON.1,! clr SCON.1 mov SBUF,out ; Value senden jnb SCON.1,! clr SCON.1 ret ; und zurueck