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
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?
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!
Lesezeichen