;*************Einzelsteuergerät************ ;++++++++++++++++++include Datei und Stack initialisieren ;+++++++++ interrupt routinen ************ ;V 1_04 umbau Ausgänge auf inventiert und Eingänge inventiert ;21.11.2010 mit internen pullups .include "2313def.inc" .def temp = r16 .def incounter = r17 .def excounter = r18 .def takt = r21 .def flags = r22 .def M1 = r19 .def M2 = r23 .def M3 = r2 .def M4 = r3 .def uebergabe = r20 .equ teilzahl = 8 .equ dreisekunden = 46 ;46 mal 65ms sind ca 3sec .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,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 incounter; ;incounter sicher auf null stellen ;ldi temp,0xdd ;********diese zwei zeilen nur um das simulieren schneller ;out tcnt0,temp ;********zu machen wir laden den timercounter vor clr flags clr m1 clr m2 clr m3 clr m4 clr takt ldi M1,0 out DDRb,M1 ;port b auf Eingang schalten ldi temp,0xff out portb,temp ;pullup widerstände einschalten sei ;interrup allgemein freigeben ;´+++++++++++++++++++Ende Resetteil ;+++++++++++++++Hauptprogramm++++++++++++++++++ main: ;++++++++++++übergabe wird auf nicht erlaubt geprüft+++++++++++ cpi uebergabe,3 breq nichterlaubt ;sprung wird nur ausgeführt wenn Werte gleich sind cpi uebergabe,12 brsh nichterlaubt ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind ;+++++++++++übergabe wird auf time ab und totmann wenden geprüft++++++++++++++++++ cpi uebergabe,1 breq timeab ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf time auf geprüft+++++++++++++++++++++++++++++++++++++ cpi uebergabe,2 breq timeauf ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf totmann auf geprüft+++++++++++++++++++++++++++++++++++++ cpi uebergabe,4 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,5 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,6 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,7 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf totmann ab geprüft+++++++++++++++++++++++++++++++++++++ cpi uebergabe,8 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,9 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,10 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,11 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf null geprüft+++++++++++++++++++++++++++++++++++++ cpi uebergabe,0 breq nullstellung ;sprung wird nur ausgeführt wenn Werte gleich rjmp main ;****************Ende Hauptprogramm**************** ;++++++++++++++++++*****************************++++++++++++++++++++++++++++ ;*******************+******************************************************* nichterlaubt: ldi temp,0xff ;bei nicht erlaubt Ausgänge auf high stellen out portd,temp clr flags rjmp main ;*************************************************************************** timeab: ;prüfen ob Jal auf ein ist das ist Ausgang Pin0 port d sbis portd,pd0 ;überspringt den nächsten Befehl wenn das bit "1 "also high ist rcall warten ;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 cpi flags,1 ;prüfen ob flag gesetzt breq main ;sprung wird nur ausgeführt wenn Werte gleich ldi flags,1 ;flag setzen clr takt clr excounter rjmp main ;*************************************************************************** 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 warten ;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 warten ;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 cpi flags,1 ;prüfen ob flag gesetzt breq main ;sprung wird nur ausgeführt wenn Werte gleich ldi flags,1 ;flag setzen clr takt clr excounter rjmp main ;*************************************************************************** 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 warten ;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 warten ;wir warten ca 0,5-1 sec zum umschalten der Relais clr flags cbi portd,pd0 rjmp main ;*************************************************************************** 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 warten ;wir warten ca 0,5-1 sec zum umschalten der Relais clr flags cbi portd,pd1 rjmp main ;*************************************************************************** nullstellung: sbi portd,2 ;wenden auf high stellen cpi flags,1 breq sekunden3 ;sprung wird nur ausgeführt wenn Werte gleich cpi flags,2 brsh minuten2 ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind ldi temp,0xff out portd,temp rjmp main sekunden3: cpi takt,dreisekunden brsh minuten2 ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind clr flags ldi temp,0xff out portd,temp rjmp main minuten2: ldi flags,2 ;flags auf 2 setzen damit 3sekunden übersprungen wird cpi excounter,240 ;excounter mit 240 vergleichen,120sec durch ca 0,5 sec brsh ausschalten ;sprung wird nur ausgeführt wenn Werte gleich oder höher sind rjmp main ausschalten: clr flags ldi temp,0xff out portd,temp rjmp main ;++++++++++++++++++++++++++++++++++++++++++++++++++ warten: ldi temp,0xff ;zuerst die Ausgänge auf null out portd,temp mov temp,excounter ;excounter in temp laden inc temp ;excounter um 1 erhöhen inc temp ;nocheinmal loop1: cpse temp,excounter ;vergleich überspringt den nächsten Befehl wenn gleich rjmp loop1 ; wir warten bis gleich ret ;++++++++++++++++++Interrupprogramm++++++++++++++++ ;alle 0,5 Sekunden wird excounter um eins erhöht timer0: push temp in temp,Sreg push temp inc incounter ;incounter um eins erhöhen inc takt ;takt wird alle 65ms um eins erhöht in M1, pinb com m1 mov uebergabe,m1 clr m1 ;ldi temp,0xdd ;************schneller zum simulieren wie oben ;out tcnt0,temp ;*********diese zwei zeilen weg cpi incounter,teilzahl ;incounter wird mit teilzahl verglichen brne weiter ;wenn nicht gleich dann weiter inc excounter ;hier gehts weiter wenn gleich r2 um eins erhöhen clr incounter ;incounter auf null stellen pop temp out sreg,temp pop temp reti weiter: pop temp out sreg,temp pop temp reti ;**************Ende der ISR***********************