Hallo,
ich versuche schon seit einigen Stunden einen ATMega ind PWM-Modus 14 zu
versetzen, aber das haut irgendwie nicht hin. Hier meine Testroutine:
\\\
.include "m32def.inc" ;Binding Definitionsfile for Processortype
.def Temp = R16
;Interruptvector-Table
.org 0x00
RJMP Reset ;Reset
.org ICP1addr
RJMP TIMER1_Capt ;Interrupt Timer1 Capture
.org OC1Aaddr
RJMP TIMER1_CompA ;Interrupt Timer1 Compare Match A
.org OC1Baddr
RJMP TIMER1_CompB ;Interrupt Timer1 Compare Match B
.org OVF1addr
RJMP TIMER1_Overflow ;Interrupt Timer1 Capture
Reset:
;Stack
LDI temp, HIGH(RAMEND)
OUT SPH, temp
LDI temp, LOW(RAMEND)
Timer1_Init:
;Mode 14, no prescaling
LDI Temp, 1<<WGM11 | 1<<COM1A0 | 1<<COM1A1 | 1<<COM1B0 | 1<<COM1B1
OUT TCCR1A, temp
LDI Temp, 1<<WGM13 | 1<<WGM12 | 1<<CS10
OUT TCCR1B, temp
LDI Temp, 0x20
OUT OCR1AL, Temp
LDI Temp, 0x40
OUT OCR1BL, Temp
LDI Temp, 0x60
OUT ICR1L, Temp
;Enable Timer1 interrupts
LDI Temp, 1<<TOIE1 | 1<<TICIE1 | 1<<OCIE1A | 1<<OCIE1B
OUT TIMSK, temp
SEI ;Enable Interupts
MainLoop:
RJMP MainLoop
TIMER1_Capt:
RETI
TIMER1_CompA:
RETI
TIMER1_CompB:
RETI
TIMER1_Overflow:
RETI
///
1.) Problem: Sobald die MainLoop erreicht wird, wird der Interrupt
OC1Aaddr gefeuert. Der Timer-Counter steht aber erst bei 0x000E.
2.) Problem: Wenn ich die Dokumentation zum ATMega32 richtig gelesen
habe, sollte beim Erreichen des Wertes in ICR1 der Timer zurückgestetzt
werden und der Overflow-Interrupt gefeuert werden. Beides tritt nicht
ein.
Die Register habe ich jetzt schon mehrfach überprüft und dort scheint
alles so zu sein, wie es im Datenblatt steht.
Danke für jeden Tipp.
--
Gruß Scotty
Karsten Sosna schrieb: > 1.) Problem: Sobald die MainLoop erreicht wird, wird der Interrupt > > OC1Aaddr gefeuert. Der Timer-Counter steht aber erst bei 0x000E. Das Problem ist gelöst. Man muss erst die Register laden und dann die Flags setzen. Jedoch steht die Lösung für das zweite Problem noch aus, verzweifele noch. -- Gruß Scotty
Hi Falls du das im Simulator testest: PWM-Modes ohne festen Top-Wert werden nur mangelhaft unterstützt. MfG Spess
Winfried J. schrieb: > interrupt enable flag für timer gesetzt ? Hallo Winfried, nein, ist es nicht. -- Gruß Scotty
spess53 schrieb: > Falls du das im Simulator testest: PWM-Modes ohne festen Top-Wert werden > > nur mangelhaft unterstützt Hallo Spess, ja ich teste das im Simulator. Was bedeutet festen Top-Wert? Meinst Du die Modes 0, 1, 2, 3, 5, 6, 7? Das wäre ärgerlich, weil ich die Register während des Laufs ändern muss. -- Gruß Scotty
Hi >Meinst Du die Modes 0, 1, 2, 3, 5, 6, 7? Ja. >Das wäre ärgerlich, weil ich die Register während des Laufs ändern muss. Dann teste es doch mal im Controller. Leds an die Pins, Vorteiler auf 1024 und die anderen Werte auch entsprechend höher gesetzt. Dann kannst du das visuell probieren. Bei mir funktioniert allerdings im Simulator (ATMega48) der Overflow-Interrupt vom Timer1 im Mode 14. MfG Spess
>> Falls du das im Simulator testest: PWM-Modes ohne festen Top-Wert werden >> nur mangelhaft unterstützt > > ja ich teste das im Simulator. Was bedeutet festen Top-Wert? Meinst Du > die Modes 0, 1, 2, 3, 5, 6, 7? > Das wäre ärgerlich, weil ich die Register während des Laufs ändern muss. Ok, habe gerade mal die Testanwendung geladen(etwas geändert, damit ich auch was sehen kann), dann mit dem Oszilloskop gemessen. Scheint zu funktionieren, sprich der Overflow-Interrupt wird gefeuert. Jetzt muss ich mal die Zeiten anpassen, verzerrt ja doch alles etwas, ist aber nicht weiter tragisch. Aber trotzdem Danke, ich habe mir hier schon "einen Wolf gesucht". ;=) -- Gruß Scotty
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.