; Projekt: Projekt01
; Datei: contener03.asm Datum: 07.06.2012
; PORTB: Ausg�nge (SFR-Register)
; PB0 = Relais d1 (rechts/links-ab)
; PB1 = Relais d2 (rechts/links-auf)
; PB2 = Relais d3 (Rechtslauf)
; PB3 = Relais d4 (Linkslauf)
; PIND: Eing�nge (SFR-Register)
; PD0 = read1 (Readkontakt auf der Schiene)
; PD1 = read2 (Readkontakt rechts am Container-Terminal)
;AVR: Tiny 2313
.INCLUDE "tn2313def.inc" ; Deklarationen f�r Tiny2313
.EQU takt = 1200000 ; Systemtakt 1,2 MHz
rjmp reset
.ORG OVF0addr ; Interrupt Vektoren
rjmp TIMER0_OVF ; Sprung zur ISR
.DEF akku=r16 ; Register in akku benannt
;Stack initialisieren, PortB=Outp./ PortD=Inp.
reset: ldi akku,LOW (RAMEND);Stapel anlegen
out SPL,akku
ldi akku,0xFF ; Bitmuster 1111 1111
out DDRB,akku ; Port B = Output
ldi akku,0x00 ; Bitmuster 0000 0000
out DDRD,akku ; Port D = Input
; externe Widerst�nde (10K) vorhanden
;Timer0 initialisieren
ldi akku,1<<CS02|1<<CS00 ; Prescale = 1024
out TCCR0B,akku ; r16 in Steuerreg. TCCR0B
ldi akku,1<<TOIE0 ; r16< 1 = Interrupt-Freigabe
out TIMSK,akku ; TIMSK = Timer Interrupt MaSK Register
sei ; I-Bit im Statusregister SREG
; 0 = Interrupt gesperrt
; 1 = " " freigegeben
;Arbeitsbeginn
ldi akku,0
out PORTB,akku ; alle Motoren=AUS
read1: sbic PIND,PD0 ; springe, wenn PD0 = Low
rjmp read1
rcall zeit2 ; Verz�gerung ca. 2 Sec.
rcall linksauf ; Laufzeit ca. 5 Sec.
rcall zeit5 ; Verz�gerung ca. 5 Sec.
rcall rechtslauf ; �nderung, Zeit auf 30 Sec.
rcall zeit5
rcall rechtsab ; bis Kontakt read2
rcall zeit5
rcall rechtsauf ; Laufzeit ca. 5 Sec.
rcall zeit5
rcall linkslauf ; Laufzeit ca. 24 Sec.
rcall zeit5
rcall linksab ; Laufzeit ca. 2 Sec.
loop: rjmp loop ; verbleibt hier in der Schleife
; Linksauf-Fahrt / Halt
linksauf: ldi akku,0b00000010 ; PB1
out PORTB,akku ; Linksauf-Fahrt
rcall zeit5
ldi akku,0
out PORTB,akku ; Linksauf-Halt
ret
;----------------------------------------------------------
; Rechtslauf-Fahrt / Halt
rechtslauf:ldi akku,0b00000100 ; PB2
out PORTB,akku ; Rechtslauf-Fahrt
rcall zeit30
ldi akku,0
out PORTB,akku ; Rechtslauf-Halt
ret
;----------------------------------------------------------
; Rechtsab-Fahrt / Halt
rechtsab: ldi akku,0b00000001 ; PB0
out PORTB,akku ; Rechtsab-Fahrt
read2: sbic PIND,PD1 ; springe, wenn PD1=LOW
rjmp read2
ldi akku,0
out PORTB,akku ; Rechtsab-Halt
ret
;----------------------------------------------------------
; Rechtsauf-Fahrt / Halt
rechtsauf: ldi akku,0b00000010 ; PB1
out PORTB,akku ; Rechtsauf-Fahrt
rcall zeit5
ldi akku,0
out PORTB,akku ; Rechtsauf-Halt
ret
;----------------------------------------------------------
; Linkslauf-Fahrt / Halt
linkslauf: ldi akku,0b00001000 ; PB3
out PORTB,akku ; Linkslauf-Fahrt
rcall zeit24
ldi akku,0
out PORTB,akku ; Linkslauf-Halt
ret
;----------------------------------------------------------
; Linksab-Fahrt / Halt
linksab: ldi akku,0b00000001 ; PB0
out PORTB,akku ; Linksab-Fahrt
rcall zeit2
ldi akku,0
out PORTB,akku ; Linksab-Halt
ret
;----------------------------------------------------------
; Pausenzeiten
zeit2:
ldi r17,0b00000011 ; Zeit ca. <2 Sec.(Dez.=3)
pause2: tst r17 ; teste r17 auf Null
brne pause2 ; wenn keine Null nach pause2
ret
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
zeit5:
ldi r17,0b00010100 ; Zeit ca. 5 Sec.(hex=14/Dez.=20)
pause5: tst r17 ; teste r17 auf Null
brne pause5 ; wenn keine Null nach pause5
ret
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
zeit24:
ldi r17,0b01011100 ; Zeit gemessen 24 Sec.(hex=5C/Dez.=92)
pause24: tst r17 ; teste r17 auf Null
brne pause24 ; wenn keine Null nach pause24
ret
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
zeit30:
ldi r17,0b01111000 ; Zeit gemessen 30 Sec.(hex=78/Dez.=120)
pause30: tst r17 ; teste r17 auf Null
brne pause30 ; wenn keine Null nach pause30
ret
; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
;Interrupt-ISR
TIMER0_OVF:push r2 ; Kopie r2 auf den Stack, danach SP-1
in r2,SREG ; Inhalt vom Statusregister in r2 laden
dec r17 ; ISR Abarbeitung (z.B. dec r17)
out SREG,r2 ; Inhalt von r2 ins SREG laden
pop r2 ; SP+1, danach vom Stack in r2 laden
reti
.EXIT