Austausch der alten Steuerung duch neue Elektronik.
;****** Kaeshofsteuerung 1.1 (c) Oliver Mezger 9.4.2009 .include "tn26def.inc" ;********* Hardware-Verbindungen ;*** PortA .equ Lrot = 3 .equ Lgelb = 2 .equ Lgruen = 1 .equ Lblau = 0 .equ Relais = 4 .equ VUdouble1 = 6 ;Verdoppeln der VU-Empfindlichkeit per Jumper .equ VUdouble2 = 7 ;*** PortB .equ Sstart = 4 .equ Stuer = 5 ;.equ selfTest = 3 ;********* Software .def stat = R3 ;Speichern des Status waehrend Interrupt .def itempL = R4 ;Temoraere Register fuer Interrupts .def temp = R16 ;Temp-Register zum Arbeiten .def temp2 = R17 .def itemp = R20 ;Temoraere Register fuer Interrupts .def itemp2 = R21 .def sysTick = R22 ;Zaehlt die Timer1 Ueberlaeufe .def sysTime = R23 ;Interne Zeit in Sekunden .def state = R24 ;Prozesstatus .set cpuClock = 1 ;Frequenz 1 MHz .set timePrescale = 64 .set timeBase = timePrescale / cpuClock .set sysTimeDiv = 500000 / 256 / timeBase ; damit SysTime im Halb-Sekundentakt rjmp init ;Reset reti ;INT0 reti ;I/O Pins reti ;T1 Compare A reti ;T1 Compare B rjmp T1_Over ;T1 Overflow reti ;T0 Overflow reti ;USI Start reti ;USI Overflow reti ;EEPROM Ready reti ;Analog Comparator rjmp ADC_Finish ;ADC Conversation Complete init: ldi temp,0b00011111 ;PortA als Ausgaenge out DDRA,temp ldi temp,0b11100000 ;PortA PullUps out PORTA,temp ldi temp,0b00001111 ;PortB PullUps out PORTB,temp ldi temp,RAMEND ;Oberste RAM-Adresse holen out SP, temp ;Stack-Pointer initialisieren ldi temp,7 out TCCR1B,temp ;PreScaler /64 ldi temp,0b00000100 ;Timer1 Overflow Interupt Flag out TIMSK,temp ;Timer-Interrupt freigeben ldi temp, 0b10101001;ADC Kanal9 out ADMUX,temp ldi temp, 0b01101011;ADC laeuft frei out ADCSR, temp sei ;Interrupts global freigeben (I-Bit) sbis PINB,0 ;PB0 auf GND rjmp vu_test ;Test des ADC rjmp start vu_test: sbi ADCSR,7 ;VU-Meter ein sbi ADCSR,6 vu_testloop: rjmp vu_testloop T1_Over: in stat,SREG ;Statusregister retten inc sysTick ; cpi sysTick,sysTimeDiv brmi t1over1 clr sysTick inc sysTime ;eine halbe Sekunde ist vergangen t1over1: out SREG,stat ;Statusregister herstellen reti ADC_Finish: in stat,SREG ;Statusregister retten in itemp,ADCL ;lade ADC Ergebnis in itemp,ADCH sbic PINA,VUdouble1;doppelte Empfindlichkeit lsr itemp sbic PINA,VUdouble2;doppelte Empfindlichkeit lsr itemp cpi itemp,2 brmi VU_Meter clr sysTime ;Timer fuer auswarten zuruecksetzen VU_Meter: sbrc itemp,3 rjmp A_Red sbrc itemp,2 rjmp A_Gelb sbrc itemp,1 rjmp A_Green A_Ausgabe: in itemp2,PORTA andi itemp2,$F0 or itemp2,itemp out PORTA,itemp2 out SREG,stat ;Statusregister herstellen reti A_Red: ldi itemp,15 rjmp A_Ausgabe A_Gelb: ldi itemp,7 rjmp A_Ausgabe A_Green: ldi itemp,3 rjmp A_Ausgabe start: ;Einschaltverzoegerung wegen PIR-Melder sbi PORTA,Lblau ;blaue LED leuchtet clr sysTime ;Timer auf null start2: sbic PINB,Sstart ;wenn 1 rjmp keinAnfang ;dann kein Anfang rcall wait ;wenn 0 warten sbic PINB,Sstart ;wenn 1 rjmp keinAnfang ;dann kein Anfang rjmp anfang ;sonst zu Anfang keinAnfang: cpi sysTime,2*30 ;Zeit bis Ruhezustand brmi start2 ;noch warten ruheinit: in temp,PORTA andi temp,0b11100000;alle Ausgaenge 0 out PORTA,temp ruhe: sbrc sysTime,1 ;wenn Bit 1 gesetzt rjmp ma_setled ;setze Leds cbi PORTA,Lblau ;sonst loesche Leds rjmp ruhe2 ma_setled: sbi PORTA,Lblau ;LED leuchtet ruhe2: in temp,PINB com temp andi temp,0b00110000;Tuere oder Start breq ruhe rcall wait in temp,PINB com temp andi temp,0b00110000;Tuere oder Start breq ruhe sbrc temp,Sstart ;wenn Starttaste gedrueckt rjmp anfang ;direkt zum Anfang springen cbi PORTA,Lblau sbi PORTA,Lgruen clr sysTime ;Timer auf null beginwarten: sbic PINB,Stuer ;wenn Tuere rjmp ruheinit cpi sysTime,2*10 ;Zeit bis Ausloesung brmi beginwarten ;noch warten anfang: cbi PORTA,Lblau cbi PORTA,Lgruen sbi PORTA,Lgelb sbi PORTA,Relais clr sysTime ;Timer auf null anfangwarten: cpi sysTime,2*60 ;Zeit bis warten auf Stille brmi anfangwarten ;noch warten ;*** auf Stille warten clr sysTime ;Timer auf null sbi ADCSR,7 ;VU-Meter ein sbi ADCSR,6 auswarten: cpi sysTime,2*6 ;Sekunden der Stille brmi auswarten ;*** ausschalten cbi ADCSR,7 ;VU-Meter aus sbi PORTA,Lrot cbi PORTA,Relais ;cbi PORTA,Lgelb clr sysTime totwarten: cpi sysTime,2*30 ;Totzeit brmi totwarten rjmp ruheinit wait: ldi temp,100 ;aeusseren Zaehler laden 100 ms wl1: ldi temp2,250 ;inneren Zaehler 1ms bei 1Mhz wl2: nop dec temp2 ;temp2-- brne wl2 ;Sprung wenn nicht null dec temp ;temp-- brne wl1 ;Sprung wenn nicht null ret