Und du hast vergessen das, wenn der Timer Hochgezäht hat wieder von 0 anfängt und nicht mehr bei 34286 , das muss der aber wissen, also schreib die Timervorgabe nochmals in die Interruptroutine, dann müsstes passen
Druckbare Version
Und du hast vergessen das, wenn der Timer Hochgezäht hat wieder von 0 anfängt und nicht mehr bei 34286 , das muss der aber wissen, also schreib die Timervorgabe nochmals in die Interruptroutine, dann müsstes passen
Ich hab es jetzt mal so gemacht wie teslanikola vorgeschlagen hat und hab dem Timer die Werte nocheinmal übergeben. Aber es hat sich leider nicht geändert, die Sekunde ist immer noch zu lang.
Code:.include"m16def.inc"
.def isreg = r15
.def wr0 = r16
.def iwr0 = r17
.def prescaler = r18
.def second = r19
.list
rjmp init
.org OC1Aaddr
rjmp Timerinterrupt
Timerinterrupt:
ldi wr0, 1<<WGM12^1<<CS12 ; Festlegen des Teilers 265
out TCCR1B, wr0
ldi wr0, high( 34286 ) ;Festlegen des Timervorgabewertes
out ocr1ah, wr0
ldi wr0, low( 34286 ) ;Festlegen des Timervorgabewertes
out ocr1al, wr0
out tcnt1l, wr0
inc second
reti
init:
ldi wr0, 0xFF
out ddrb, wr0
ldi wr0, high( ramend )
out sph, wr0
ldi wr0, low( ramend )
out spl, wr0
ldi wr0, 1<<WGM12^1<<CS12 ; Festlegen des Teilers 265
out TCCR1B, wr0
ldi wr0, high( 34286 ) ;Festlegen des Timervorgabewertes
out ocr1ah, wr0
ldi wr0, low( 34286 ) ;Festlegen des Timervorgabewertes
out ocr1al, wr0
out tcnt1l, wr0
ldi wr0, 1<<OCIE1A
out TIMSK, wr0
sei
main:
ldi second, 0
_mai1:
cpi second, 60
breq main
out PORTB, second
rjmp _mai1
@Michael
Mit dem was du geschrieben hast, kann ich leider nichts anfangen. Kannst du mir erklären was du meinst?
teste mal nur ob die Interrupt zeitig aufgerufen wird und lass das MAIN mal wech, der interrupt müsste jede sekunde kommen, dh wenn du ne LED blinken läst blinkt die 1 mal in 2 sek ( 1sec an 1 sec aus )
PS haste ICQ? wen ja suche nach XXXXXXXXXXXXXXXXX, das bin ich und komm online
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 ;-)
mfG TimCode:;-------------------------------------------------------------
;-- --
;-- 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
Bitte bitte, ich findes wichtig ASM-Anfängern zu helfen obwohl ich selbst no Anfänger bin, ASM ist fürn anfang etwas gewöhnungsbedürftig, aber eine der besten Sprachen ever!