Hallo Leute,
da ich mich lange mit den Tiny13 und PWM aufgehalten habe, solls jetzt mit den
Tiny2313 weiter gehen.
Hierbei habe ich mein Wissen mit dem relativ einfachen Timer0 nochmal
aufgefrischt.
Ich hielt es für sinnvoll, einen neuen Thread zur eröffnen.
Vielleicht ist es was für Anfänger.
Die Aufgabenstellung ist rel. einfach. Habe es aus reiner Selbstüberlegung,
d.h. ohne Bücher geschafft.
Mit PUSH und POP stehe ich noch etwas auf dem Schlauch.
So, hier der Quellcode in Assembler:
Grüße
Rolf
da ich mich lange mit den Tiny13 und PWM aufgehalten habe, solls jetzt mit den
Tiny2313 weiter gehen.
Hierbei habe ich mein Wissen mit dem relativ einfachen Timer0 nochmal
aufgefrischt.
Ich hielt es für sinnvoll, einen neuen Thread zur eröffnen.
Vielleicht ist es was für Anfänger.
Die Aufgabenstellung ist rel. einfach. Habe es aus reiner Selbstüberlegung,
d.h. ohne Bücher geschafft.
Mit PUSH und POP stehe ich noch etwas auf dem Schlauch.
So, hier der Quellcode in Assembler:
Code:
; Projekt-Name: Projekt01 Datum: 26.07.2012
; Datei: Timertest01.asm
; PORTB,PB0-PB2 = Output
; Aufgabe: zu Beginn alle 3 Pins=High
; 5 Sec.PB2=Low / 5 Sec.PB1=Low / 5 Sec.PB0=Low /
; 5 Sec. Beginn>> loop:
; Zeit bei 1,2 MHz= 1/f =0,833ysx1024x256=0,218 Sec.
; zu 5 Sec = 5/0,218 = aufgerundet 23 dezimal = 0x17 hex.
; AVR: Tiny2313 (Systemtakt = 1,2 MHz)
.INCLUDE "tn2313def.inc" ; Deklaration für Tiny2313
.def akku=r16
.def pause=r17
rjmp reset ; Reseteinsprung
.ORG OVF0addr ; Interrupt-Vektor
rjmp TIMER0_OVF ; Sprung zur ISR
reset: ldi akku,0x07 ; Bitmuster 0000 0111
out DDRB,akku ; Datenricht. PB0 - PB2=Output
; Timer0 initialisieren:
ldi akku,(1<<CS02)|(1<<CS00) ; Pr.= 1024
out TCCR0B,akku
ldi akku,(1<<TOIE0) ; Register TIMSK (Bit1=1)
out TIMSK,akku
sei ; Timer frei
loop: ldi akku,(1<<PB2)|(1<<PB1)|(1<<PB0)
out PORTB,akku ; PB0 - PB2 = High
rcall zeit5
ldi akku,(1<<PB1)|(1<<PB0)
out PORTB,akku ; PB0 - PB1 = High
rcall zeit5
ldi akku,(1<<PB0)
out PORTB,akku ; PB0 = High
rcall zeit5
ldi akku,0
out PORTB,akku ; PORTB =Low
rcall zeit5
rjmp loop
zeit5: ldi pause,0x17 ; r17<<<23
pause5: tst pause ; test r17 auf Null
brne pause5 ; wenn r17 keine 0 nach pause5
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 pause ;Dekrement (r17-1)
out SREG,r2 ;Inhalt von r2 ins SREG laden
pop r2 ;SP+1, danach vom Stack in r2 laden
reti
.EXIT
Rolf