;*********Einzelsteuergerät************ ;++++++++++++++++++include Datei und Stack initialisieren ;+++++++++ interrupt routinen ************ ;V_1.04 umbau Ausgänge auf inventiert und Eingänge inventiert ;V_1.04.1 mit internen pullups ;V_1.05 umbau auf action_list .include "2313def.inc" .def count1 = r19 .def count2 = r21 .def flags = r22 .def temp = r16 .def temp2 = r17 .def switch = r18 .equ faktor = 8 .equ time_short = 5 .equ time_long = 120 .org 0x00 rjmp reset .org INT0addr reti ;External Interrupt0 Vector Address .org INT1addr reti ;External Interrupt1 Vector Address .org ICP1addr reti ;Input Capture1 Interrupt Vector Address .org OC1addr reti ;Output Compare1 Interrupt Vector Address .org OVF1addr reti ;Overflow1 Interrupt Vector Address .org OVF0addr rjmp timer0 ;Overflow0 Interrupt Vector Address .org URXCaddr reti ;UART Receive Complete Interrupt Vector Address .org UDREaddr reti ;UART Data Register Empty Interrupt Vector Address .org UTXCaddr reti ;UART Transmit Complete Interrupt Vector Address .org ACIaddr reti ;Analog Comparator Interrupt Vector Address reset: ldi temp,RAMEND ;ramend in den out SPL,temp ;stackpointer laden ldi temp,255 out DDRd,temp ;port d auf Ausgang schalten ldi temp,0xff out portd,temp ;Ausgang auf high stellen, ldi temp,0 out DDRb,temp ;port b auf Eingang schalten ldi temp,0xff out portb,temp ;pullup widerstände einschalten ldi temp,1<<(TOIE0) ;Interrup freigeben out TIMSK,temp ;für Timer 0 ldi temp,1<<(CS00)^1<<(cs02) ;Teiler einstellen auf 1024 out tccr0,temp ;und Timer starten clr flags clr switch sei ;interrup allgemein freigeben mainloop: mov temp,switch clr temp2 ldi ZL, Low(action_list<<1) ;Zeiger auf ldi ZH,High(action_list<<1) ;action_list add ZL,temp adc ZH,temp2 ; Offset addieren lpm ; action-Nummer holen mov temp,r0 dec temp ; um bei 0 anzufangen ldi ZL, Low(action_jmp) ; Adresse ldi ZH,High(action_jmp) ; Sprungtabelle add ZL,temp ; aktion-Nummer adc ZH,temp2 ; addieren icall rjmp mainloop action_list: .db 6,1,2,5,3,3,3,3,4,4,4,4,5,5,5,5 action_jmp: rjmp action1 rjmp action2 rjmp action3 rjmp action4 rjmp action5 rjmp action6 ;************************************************************************** action1: ;timeab ;prüfen ob Jal auf ein ist das ist Ausgang Pin0 port d sbis portd,0 ;überspringt den nächsten Befehl wenn das bit "1 "also high ist rcall wait ;wir warten ca 0,5-1 sec zum umschalten der Relais ldi temp,0b11111001 ;die Bits 1 und 2 für Jal ab und wenden vorbereiten out portd,temp ;und in den portd (ausgang) laden sbrc flags,0 ;prüfen ob flag 1 gesetzt ret ;wird übersprugen wenn bit 0 null ist ldi flags,1 ;flag setzen clr count2 ret ;*************************************************************************** action2: ;timeauf ;prüfen ob Jal ab ein ist das ist Ausgang Pin1 und2 für wenden port d sbis portd,pd1 ;überspringt den nächsten Befehl wenn das bit high ist rcall wait ;wir warten ca 0,5-1 sec zum umschalten der Relais sbis portd,pd2 ;überspringt den nächsten Befehl wenn das bit high ist rcall wait ;wir warten ca 0,5-1 sec zum umschalten der Relais ; ldi temp,0b11111110 ;das Bit 0 für Jal auf vorbereiten out portd,temp ;und in den portd (ausgang) laden sbrc flags,0 ;prüfen ob flag gesetzt ret ;wird übersprugen wenn bit 0 null ist ldi flags,1 ;flag setzen clr count2 ret ;*************************************************************************** action3: ;totmannab: ;prüfen ob Jal auf ein ist das ist Ausgang Pin0 für wenden port d sbis portd,pd0 ;überspringt den nächsten Befehl wenn das bit high ist rcall wait ;wir warten ca 0,5-1 sec zum umschalten der Relais clr flags cbi portd,pd1 ret ;*************************************************************************** action4: ;totmannauf: ;prüfen ob Jal ab ein ist das ist Ausgang Pin1 und2 für wenden port d sbis portd,pd1 ;überspringt den nächsten Befehl wenn das bit high ist rcall wait ;wir warten ca 0,5-1 sec zum umschalten der Relais sbis portd,pd2 ;überspringt den nächsten Befehl wenn das bit high ist rcall wait ;wir warten ca 0,5-1 sec zum umschalten der Relais clr flags cbi portd,pd0 ret ;*******************+******************************************************* action5: ;nichterlaubt: ldi temp,0xff ;bei nicht erlaubt Ausgänge auf high stellen out portd,temp clr flags ret ;*************************************************************************** ;nicht erlaubt action6: ;nullstellung: sbi portd,2 ;wenden auf high stellen cpi flags,1 breq t_short ;sprung wird nur ausgeführt wenn Werte gleich cpi flags,2 brsh t_long ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind ldi temp,0xff out portd,temp ret t_short: cpi count2,time_short brsh t_long ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind clr flags ldi temp,0xff out portd,temp ret t_long: ldi flags,2 ;flags auf 2 setzen damit sek3 übersprungen wird cpi count2,time_long ;count2 mit 240 vergleichen,120sec durch ca 0,5 sec brsh turnoff ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind ret turnoff: clr flags ldi temp,0xff out portd,temp ret ;++++++++++++++++++++++++++++++++++++++++++++++++++ wait: ldi temp,0xff ;zuerst die Ausgänge auf high out portd,temp mov temp,count2 ;count2 in temp laden inc temp ;um 1 erhöhen inc temp ;nocheinmal loop1: cpse temp,count2 ;vergleich überspringt den nächsten Befehl wenn gleich rjmp loop1 ; wir warten bis gleich ret ;++++++++++++++++++Interrupprogramm++++++++++++++++ timer0: push temp in temp,Sreg push temp inc count1 ;count1 um eins erhöhen in switch, pinb com switch andi switch,0x0F cpi count1,faktor ;count1 wird mit faktor verglichen brne weiter ;wenn nicht gleich dann sprung zu weiter inc count2 clr count1 ;incounter auf null stellen pop temp out sreg,temp pop temp reti weiter: pop temp out sreg,temp pop temp reti ;**************Ende der ISR***********************