wieder gefunden
einen schönen Gruß von mir.
Ich habe das Programm vom Treppenhausautomaten auf einen alten Stick wieder gefunden.
Das Programm ist noch aus meiner Programmieranfangszeit heute würde ich es anders machen
aber was soll es es funktioniert. Ich versuche mal es hier einzufügen und hoffe das es klappt.
Gruß Ernst
CodeBox Assembler
;|--------------------------------------------------------------------------
;| Title : Treppenhausautomat
;| Funktion :
;|Starten des Treppenhausautomaten:
;|
;|Wird Treppenlichttaster ca 1 Sekunde lange betätigt, Tasterled leuchtet
;|und Treppenhausautomat schaltet Kurzzeitlicht je nach Stellungen der
;|Codierschalter (1 bis 4) ein. Ist kein Codierschalter eingeschaltet
;|schaltet der Treppehausautomat nach Ablauf von 10 Sekunden (Testzeit)
;|um auf Nachlaufzeit ( halbe Helligkeit durch Poty einstellbar) um dann
;|nach Ablauf der Nachlaufzeit (15 Sekunden) die Beleuchtung auszuschalten.
;|
;|Wird der Treppenhaustaster beim Starten 2 Sekunden lang betätigt
;|schaltet der Treppenhausautomat von Kurzzeitlicht auf Dauerlicht um
;|das jedoch auf 15 Minuten begrenzt ist danach beginnt noch für 15 Sekunden
;|Die Nachlaufzeit mit halber Helligkeit.
;|
;|Treppenhaustaster Betätigung während des Zeitablaufes:
;|
;|Wird der Treppenhaustaster während des Zeitablaufes (Kurzzeitlicht oder
;|Dauerlicht) betätigt dann kann man damit die Beleuchtung sofort ausschalten.
;|Wird der Treppenhaustaster während der Nachlaufzeit betätigt startet
;|der Treppenhausautomat erneut mit Kurzeitlicht oder bei längerer
;|Betätigung des Tasters mit Dauerlicht
;|
;|Achtung, wird der Treppenhaustaster länger als 4 Sekunden lang betätigt
;|wertet das der Treppenhausautomat als Blockierung des Treppenhaustasters
;|aus. Das Licht wird ausgeschaltet die Led Treppenhaustaster beginnt zu
;|blinken bis Störung beseitigt ist.
;|
;|Bedienung der Codierschalter:
;|S1 ein = 0,5 Minuten
;|S2 ein = 1 Minute
;|S3 ein = 2 Minuten
;|S4 ein = 4 Minuten
;|Durch Kompination der 4 Codierschalter können belibige Zeiten eingestellt
;|werden.
;|
;|Codierschalter S5 ein = Dauerlicht unbegrenzt ein. Led Dauerlicht leuchtet
;|Led Taster blinkt bis S5 wieder ausgeschaltet wird
;|
;|
;| Schaltung : Eingang Port D2 Schiebeschalter 1
;| : Eingang Port D3 Schiebeschalter 2
;| : Eingang Port D4 Schiebeschalter 3
;| : Eingang Port D5 Schiebeschalter 4
;| : Eingang Port D6 Schiebeschalter Reserve
;| : Eingang Port D7 Schiebeschalter Reserve
;| : Eingang Port B0 Schiebeschalter Dauerlicht
;| : Eingang Port C4 Lichttaster Treppenhaus über OC 3
;| : Ausgang Port B1 Licht halbe Helligkeit über OC 2
;| : Ausgang Port B2 LED 1 Kurzzeitlicht + OC 1 über D1
;| : Ausgang Port B3 LED 2 Dauerlicht
;| : + OC 1 über D2
;| : Ausgang Port B4 LED 3 Nachlaufzeit
;| : Ausgang Port B5 LED 4 Taster Treppenhaus
;+----------------------------------------------------------------------
;| Prozessor : ATmega8
;| Takt : 3,6864 MHz
;| Sprache : Assembler
;| Datum : 13.06. 2012
;| Autor : Ernst
;+----------------------------------------------------------------------
.include "AVR.H"
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
rjmp time ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (IC) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out ioSPL,r16
ldi r16,hi8(RAMEND)
out ioSPH,r16
rcall Wd
;--- Port Eingänge + Pullup ---
cbi ioDDRD,2
sbi ioPORTD,2
cbi ioDDRD,2
sbi ioPORTD,2
cbi ioDDRD,2
sbi ioPORTD,3
cbi ioDDRD,3
sbi ioPORTD,4
cbi ioDDRD,4
sbi ioPORTD,5
cbi ioDDRD,5
sbi ioPORTD,6
cbi ioDDRD,6
sbi ioPORTD,7
cbi ioDDRD,7
sbi ioPORTB,0
cbi ioDDRB,0
sbi ioPORTD,2
cbi ioDDRC,4
sbi ioPORTC,4
;--- Port Ausgänge ---
sbi ioDDRB,1
sbi ioDDRB,2
sbi ioDDRB,3
sbi ioDDRB,4
sbi ioDDRB,5
;--- Alle Ausgänge auschalten ---
cbi PORTB,1
cbi PORTB,2
cbi PORTB,3
cbi PORTB,4
cbi PORTB,5
ldi r16,0b00000101
out TCCR1B,r16
ldi r24,0xf1
ldi r25,0xf0
out TCNT1H,r24
out TCNT1L,r25
ldi r16,0b00000101
out TIMSK,r16
cli ;Timer sperren
;------------------------------------------------------------------------
mainloop: wdr
cli ;Timer sperren
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
;------------------------------------------------------------------------
;--- warte auf Treppenhaustaster betätigt ---
Warteschleife: wdr
;------------------------------------------------------------------------
;---Schalter für Dauerlicht abfragen ---
cbi PORTB,5 ;Tasterled aus
sbis ioPINB,0 ;Codierschalter Dauerlicht ein?
rjmp Dauerlicht_ein ;ja, dann Dauerlicht ein
sbic ioPINB,0 ;Codierschalter Dauerlicht aus?
rcall Dauerlicht_aus ;nein,dann Dauerlicht aus
;------------------------------------------------------------------------
;--- warte auf Treppenhaustaster betätigt ---
sbis ioPINC,4 ;Treppenhaustaster betätigt?
sbi PORTB,5 ;ja, dann LED Taster ein
sbis ioPINC,4 ;Treppenhaustaster betätigt?
rjmp weiter ;ja, dann weiter
rjmp Warteschleife ;sonst zurück zur Warteschleife
weiter: rcall Licht_ein ;Kurzzeitlicht ein
rcall warte ;warte kurz
sbic ioPINC,4 ;Treppenhaustaster betätigt?
cbi PORTB,5 ;nein, dann Tasterled aus
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
sbis ioPINC,4 ;Treppenhaustaster immer noch
rjmp wieder_weiter ;betätigt dann wieder weiter ansonsten
;Codierschalter Zeit abfragen
rjmp Codierscalter_abfragen
;------------------------------------------------------------------------
;--- Umschaltung von Kurzzeitlicht auf Dauerlicht begrenzt ---
wieder_weiter:
rcall Dauerlicht_Zeit_ein ; umschalten auf Dauerlicht Zeit
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
rcall warte ;warte kurz
;------------------------------------------------------------------------
;--- prüfen ob Treppenhaustaster blockiert ist ---
Taster_blockiert:
sbic ioPINC,4 ;Treppenhaustaster blockiert?
cbi PORTB,5 ;nein, dann Tasterled aus
sbis ioPINC,4 ;Treppenhaustaster blockiert?
rjmp Tasterled_blinkend ;ja, dann zum Blinkprogramm
;Tasterled
rjmp Zeitablauf_Dauerlicht ;nein, dann weiter zum
;Zeitablauf Dauerlicht begrenzt
;------------------------------------------------------------------------
;--- Codierschalter für Zeiteinstellung abfragen ---
Codierscalter_abfragen:
ldi r21,0 ;Register für Zeit auf 0 setzen
sbis ioPIND,2 ;Codierschalter 0,5 Minuten ein?
rcall s1 ;ja, springe zum Unterprogramm
;und lade Zeit eine halbe Minute
sbis ioPIND,3 ;Codierschalter 1 Minute ein?
rcall s2 ;ja, springe zum Unterprogramm
;und lade Zeit eine Minute
sbis ioPIND,4 ;Codierschalter 2 Minuten ein?
rcall s3 ;ja, springe zum Unterprogramm
;und lade Zeit zwei Minuten
sbis ioPIND,5 ;Codierschalter 4 Minuten ein?
rcall s4 ;ja, springe zum Unterprogramm
;und lade Zeit vier Minuten
cpi r21,0 ;ist schon eine Zeit vorgegeben?
brne Zeitablauf_Licht ;ja, dann springe zum Zeitablauf
;Kurzzeitlicht
ldi r21,2 ;nein, dann lade Testzeit 10 Sekunden
;------------------------------------------------------------------------
;--- starte Kurzzeitlicht ---
Zeitablauf_Licht:
cbi PORTB,5 ;Tasterled aus
ldi r22,0 ;Timer auf 0 setzten
sei ;Timer freigeben
Zeitschleife_Licht_1:
sbis ioPINC,4 ;Treppenhaustaster betätigt?
sbi PORTB,5 ;dann Tasterled ein
sbis ioPINC,4
rcall alles_aus ;und alles auschalten und
sbis ioPINC,4
rjmp mainloop ;zum Programmanfang zurück
wdr
cpi r22,5
brne Zeitschleife_Licht_1
ldi r22,0 ;Timer auf 0 setzen
dec r21
cpi r21,0
brne Zeitschleife_Licht_1
cli ;Timer sperren
ldi r22,0 ;Timer auf 0 setzen
rcall Licht_aus ;Kurzzeitlicht auschalten
rjmp Zeitablauf_Nachlauf ;und weiter zur Nachlaufzeit
;------------------------------------------------------------------------
;--- starte begrenztes Dauerlicht ---
Zeitablauf_Dauerlicht:
ldi r21,180 ;lade 180 ins Register für Zeit
;(180 x 5 Sekunden = 15 Minuten)
ldi r22,0 ;Timer auf 0 setzten
sei ;Timer freigeben
Zeitschleife_Dauerlicht_1:
sbis ioPINC,4 ;Treppenhaustaster betätigt?
sbi PORTB,5 ;dann Tasterled ein
sbis ioPINC,4
rcall alles_aus ;und alles auschalten und
sbis ioPINC,4
rjmp mainloop ;zum Programmanfang zurück
wdr
cpi r22,5
brne Zeitschleife_Dauerlicht_1
ldi r22,0 ;Timer auf 0 setzen
dec r21
cpi r21,0
brne Zeitschleife_Dauerlicht_1
cli ;Timer sperren
ldi r22,0 ;Timer auf 0 setzen
rcall Dauerlicht_Zeit_aus ;Dauerlicht Zeit ausschalten
rjmp Zeitablauf_Nachlauf ;und weiter zur Nachlaufzeit
;------------------------------------------------------------------------
;--- starte Nachlaufzeit ---
Zeitablauf_Nachlauf:
rcall Nachlauf_ein
ldi r21,3 ;lade 3 ins Register für Zeit
;(3 x 5 Sekunden = 15 Sekunden)
ldi r22,0 ;Timer auf 0 setzen
sei ;Timer freigeben
Zeitschleife_Nachlauflicht_1:
rcall Nachlauf_ein
sbis ioPINC,4 ;Treppenhaustaster betätigt?
sbi PORTB,5 ;dann Tasterled ein und
sbis ioPINC,4
rjmp weiter ;und zurück zur Schleife "weiter"
wdr
cpi r22,5
brne Zeitschleife_Nachlauflicht_1
ldi r22,0 ;Timer auf 0 setzen
dec r21
cpi r21,0
brne Zeitschleife_Nachlauflicht_1
cli ;Timer sperren
ldi r22,0 ;Timer auf 0 setzen
rcall Nachlauf_aus ;Nachlauflicht ausschalten
rjmp mainloop ;zurück zu Programmanfang
;------------------------------------------------------------------------
;--- Zeiteinstellungen von Codierschaltern abfragen
;--- 0,5 Minuten ---
s1:
ldi r20,6 ;lade 6 in Register 20
add r21,r20 ;addiere es zum Zeitregister
ret
;------------------------------------------------------------------------
;--- 1 Minute ---
s2:
ldi r20,12 ;lade 12 in Register 20
add r21,r20 ;addiere es zum Zeitregister
ret
;------------------------------------------------------------------------
;--- 2 Minuten ---
s3:
ldi r20,24 ;lade 24 in Register 20
add r21,r20 ;addiere es zum Zeitregister
ret
;------------------------------------------------------------------------
;--- 4 Minuten ---
s4:
ldi r20,48 ;lade 48 in Register 20
add r21,r20 ;addiere es zum Zeitregister
ret
;------------------------------------------------------------------------
;--- Dauerlicht ein ---
Dauerlicht_ein:
sbi PORTB,3 ;LED Dauerlicht + OC 1 ein
sbi PORTB,1 ;Optokoppler 2 ein
cbi PORTB,2 ;LED Kurzzeitlicht aus
cbi PORTB,4 ;LED Nachlauf aus
sbi PORTB,5 ;LED Taster ein
rcall warte ;zum blinken der Taster LED
cbi PORTB,5 ;LED Taster aus
rcall warte ;zum blinken der Taster LED
rjmp Warteschleife
;------------------------------------------------------------------------
;--- Dauerlicht aus ---
Dauerlicht_aus:
cbi PORTB,3 ;LED Dauerlicht + OC 1 aus
cbi PORTB,1 ;Optokoppler 2 aus
cbi PORTB,5 ;LED Taster aus
ret
;------------------------------------------------------------------------
;--- OC 2 ein, Led Kurzzeit + OC 1 ein ---
Licht_ein:
sbi PORTB,2 ;LED Kurzzeitlicht + OC 1 ein
sbi PORTB,1 ;Optokoppler 2 ein
cbi PORTB,3 ;LED Dauerlicht + OC 1 aus
cbi PORTB,4 ;LED Nachlauf aus
ret
;------------------------------------------------------------------------
;--- Led Kurzzeit + OC 1 aus ---
Licht_aus:
cbi PORTB,3 ;LED Dauerlicht + OC 1 aus
cbi PORTB,2 ;LED Kurzzeitlicht + OC 1 aus
ret
ret
;------------------------------------------------------------------------
;--- OC 2 ein, Led Dauerlicht Zeit + OC 1 ein ---
Dauerlicht_Zeit_ein:
sbi PORTB,3 ;LED Dauerlicht + OC 1 ein
sbi PORTB,1 ;Optokoppler 2 ein
cbi PORTB,2 ;LED Kurzzeitlicht + OC 1 aus
ret
;------------------------------------------------------------------------
;--- Led Dauerlicht Zeit + OC 1 aus, Led Nachlauf ein ---
Dauerlicht_Zeit_aus:
cbi PORTB,3 ;LED Dauerlicht + OC 1 aus
ret
;------------------------------------------------------------------------
;--- LED Nachlaufzeit ein ---
Nachlauf_ein:
sbi PORTB,4 ;LED Nachlauf ein
ret
;------------------------------------------------------------------------
;--- LED Nachlaufzeit aus ---
Nachlauf_aus:
cbi PORTB,4 ;LED Nachlauf aus
cbi PORTB,1 ;Optokoppler 2 aus
ret
;------------------------------------------------------------------------
;--- alles ausschalten ---
alles_aus:
cbi PORTB,2 ;LED Kurzzeitlicht + OC 1 aus
cbi PORTB,3 ;LED Dauerlicht + OC 1 aus
cbi PORTB,1 ;Optokoppler 2 aus
cbi PORTB,4 ;LED Nachlauf aus
ret
;------------------------------------------------------------------------
;--- Tasterled blinken Anzeige Treppenhaustaster blockiert ---
Tasterled_blinkend:
wdr
sbi PORTB,5 ;Tasterled ein
rcall warte
cbi PORTB,5 ;Tasterled aus
rcall warte
rcall alles_aus
sbis ioPINC,4 ;Treppenhaustaster ein damm weiter
rjmp Tasterled_blinkend
rjmp Taster_blockiert
;------------------------------------------------------------------------
;--- Warteroutine im Sekundenbereich
warte: push r16 ;r16 retten
push r17 ;r17 retten
push r18 ;r18 retten
ldi r16,30 ;Laufvariable loop1
loop1: ldi r17,100 ;Laufvariable loop2
loop2: ldi r18,100 ;Laufvariable loop3
wdr
loop3: dec r18 ;Zähler 3 -1
brne loop3 ;Solange nicht NULL
dec r17 ;Zähler 2 -1
brne loop2 ;Solange nicht NULL
dec r16 ;Zähler1 -1
brne loop1 ;Solange nicht NULL
pop r18 ;r18 wiederherstellen
pop r17 ;r17 wiederherstellen
pop r16 ;r16 wiederherstellen
ret ;Rücksprung
;------------------------------------------------------------------------
;--- Timer Zeit ein Sekundentakt ---
time: push r16
push r24
push r25
in r16,SREG
push r16
inc r22
ldi r24,0xf1
ldi r25,0xf0
out TCNT1H,r24
out TCNT1L,r25
pop r16
ldi r26,0x53
out TCNT0,r26
out SREG,r16
pop r25
pop r24
pop r16
reti
;------------------------------------------------------------------------
;--- Wadchdog starten ---
Wd: push r17
wdr
ldi r17,0b00011000
out WDTCR,r17
ldi r17,0b00001111
out WDTCR,r17
pop r17
ret