Guten Tag. Probiere jetzt schon einige Zeit, mit dem Mega 8 mit P FastPWM Mode 14, das er bei Top, also bei ICR1 in den TimerOverflow springt, damit ich da Register verändern kann. Ist das überhaupt möglich? Programmiere in Assembler mit dem AVRStudio. Da das AVRStudio ja den Mode 14 nicht korrekt anzeigt, (Zeigt ja 10 Bit PWM an) kann man das irgendwie garnicht testen, ob es funktioniert. Kann mir da jemand weiterhelfen? Dankeschön:-)
Hallo Stefan, der overflow-Interrupt wird nur ausgelöst, wenn der Timer überläuft (überlaufen heißt, dass der maximal mögliche Wert erreicht wird). In deinem Fall passiert das nicht, weil der maximale Wert nicht erreicht wirrd, denn der Timer läuft nur bis zum Wert in ICR1. Der interrupt, den du hier aber beim "pseudo-überlaufen" benzutzen kannst ist der Input-capture intterupt, der in deinem Fall ausgelöst wird, wenn der Timer-Wert vom Wert in ICR1 zum Wert 0x0000 wechselt. Gruß, Yaro
Also setze ich einfa TICIE1 auf 1 und dann springt er bei bottom auf Timer1 Capt? Passt das so? Das Studio zeigt das ja leider nicht richtig an.
Yaroslav schrieb: > der overflow-Interrupt wird nur ausgelöst, wenn der Timer überläuft > (überlaufen heißt, dass der maximal mögliche Wert erreicht wird). In > deinem Fall passiert das nicht, weil der maximale Wert nicht erreicht > wirrd, denn der Timer läuft nur bis zum Wert in ICR1. Falsch! Manual (FastPWM Timer1): "The Timer/Counter Overflow Flag (TOV1) is set each time the counter reaches TOP. In addition the OCF1A or ICF1 Flag is set at the same timer clock cycle as TOV1 is set when either OCR1A or ICR1 is used for defining the TOP value. If one of the interrupts are enabled, the interrupt handler routine can be used for updating the TOP and compare values." Wenn AVR Studio den 14er Mode nicht korrekt anzeigt, dann wird da auch der Fehler liegen.
Also ich das Programm jetzt so: .include"m8def.inc" .def temp1 = r16 .def temp2 = r17 .equ timer = 20000 .equ servo = 1500 rjmp init timer1_ovf: reti init: ldi temp1, low(ramend) out spl, temp1 ldi temp1, high(ramend) out sph, temp1 ldi temp1, 1<<com1a1 | 1<<wgm11 out tccr1a, temp1 ldi temp1, 1<<wgm13 | 1<<wgm12 | 1<<cs10 out tccr1b, temp1 ldi temp1, high(timer) out icr1h, temp1 ldi temp1, low(timer) out icr1l, temp1 ldi temp1, high(servo) out ocr1ah, temp1 ldi temp1, low(servo) out ocr1al, temp1 ldi temp1, 0x02 out ddrb, temp1 ldi temp1, 0b00100100 out timsk, temp1 sei main: rjmp main funktioniert aber leider nicht
Hab schon länger nichts mehr mit Assembler gemacht aber 1) Sicher dass die ISR Vektor Tabelle stimmt? Habe da ein *2 in Erinnerung wegen der Speichereinteilung bei AVRs. 2) Du aktivierst den Timer 1 Input Capture und hast keine ISR dazu. (warum schreibst du beim TIMSK nicht mehr übersichtlich mit shiften?) 3) Sicher, dass TCCR1A, usw nicht groß geschrieben gehört? Habe damals einen anderen anderen compiler verwendet, da waren die defines wie üblich alle groß geschrieben. 4) Definiere funktionniert nicht.
Danke für die Infos. Aber kann man jetzt irgendeinen Fehler entdecken?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.