ATMega16 und Timer Verständnisproblem
Hallo,
ich versuche seite 2, 3 Tagen einen Timer mit einem ATMega16 auf die Beine zu stellen, der jede Sekunde eine Zahl verändert. Wie ich es mit Zyklen machen kann hab ich schon so einigermaßen hin bekommen, aber für meine Zwecke wäre eine Interruptlösung besser, da ich die aktuelle Zahl besser ausgeben kann. Einige Ansätze dazu hab ich auch schon gefunden, aber nichts was mir so weitergeholfen hat, das ich es auch verstanden hab was der Code bewirkt, und wo ich die Zeitabstände einstellen kann.
Im Basiswissen unter Timer/Counter (Avr) hab ich schon was gelesen wie es Theoretisch abläuft, aber wie gesagt, die Umsätzung fehlt mir. Das Einzigste was ich jetzt so am groben Ansatz hab ist, das ich den Interrupt definieren muß. Irgenwie mit TCCR0 TCNT0 und so weiter. Kann mir das jemand mal so Schritt für Schritt erklären?
Danke schon mal für euer Bemühen....
mfG Tim
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,
nach dem sich teslanikola sich bereit erklärt gestern seinen Nachmittag zu opfern, konnte mein Problem gelöst werden. Die Codes die ich oben gepostet habe, haben nicht viel mit einem normalen Timer zu tun, da sie mehr für PWM gedacht sind.
Ich danke allen die sich bei der Lösung des Problems beteiligt haben, aber vor allem teslanikola ;-)
Ich hoffe den Code den ich anhänge kann jedem Helfen, der auch mit den Gleichen Problemen zu kämpfen hat wie ich ;-)
Code:
;-------------------------------------------------------------
;-- --
;-- Assembler-Code für einen 16Bit-Timer für den ATMega16 --
;-- --
;-- dieser Timer ist für eine Taktfrequenz von 1MHz --
;-- ausgelegt ( interne Taktung des ATMega16 ) --
;-- --
;-------------------------------------------------------------
.include"m16def.inc" ; Einbinden der Definitionsdatei
.def tmp = r16 ; Festlegen des Arbeitsregisters
.equ Timervorgabewert = 49911 ; Festlegung des Timervorgabewertes
.list
rjmp init
.org OVF1addr
rjmp Timerinterrupt
;-- Initalisierung ------------------------
init:
ldi tmp, 0xFF
out ddrb, tmp
ldi tmp, high( ramend )
out sph, tmp
ldi tmp, low( ramend )
out spl, tmp
ldi tmp, 1<<CS11^1<<CS10 ; Festlegen des Teilers 64
out TCCR1B, tmp
ldi tmp, high( Timervorgabewert ) ;Festlegen des Timervorgabewertes
out tcnt1h, tmp
ldi tmp, low( Timervorgabewert ) ;Festlegen des Timervorgabewertes
out tcnt1l, tmp
ldi tmp, 1<<TOIE1
out TIMSK, tmp
ldi tmp, 0x00
out DDRD, tmp
sei
;-- Hauptroutine ----------------
main: rjmp main ; Hauptroutine ausgeführt als Endlosschleife
;-- Timerinterruptroutine -------
Timerinterrupt:
;-- Erneute wertübergabe dan den Timer
ldi tmp, high( Timervorgabewert ) ;Festlegen des Timervorgabewertes
out tcnt1h, tmp
ldi tmp, low( Timervorgabewert ) ;Festlegen des Timervorgabewertes
out tcnt1l, tmp
;---
;---------------------------------------
;-- Hier kommt das rein was durch den --
;-- Timer ausgelöster werden soll --
;---------------------------------------
;-- Beispiel: Veränderung einer LED
sbis PinB,0
rjmp SetLED
rjmp ResLED
;---
;---------------------------------------
;-- Unterroutinen für die LED-Veränderung --
;-- Pin Setzen -----------------
SetLED:
sbi PORTB,0
reti
;-- Pin Rücksetzen -------------
ResLED:
cbi PORTB,0
reti
mfG Tim