Hallo, ich habe immer noch ein Problem mit PWM, ich will es einfach
verstehen, 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 Overflow
Reset:
;Stack
LDI temp, HIGH(RAMEND)
OUT SPH, temp
LDI temp, LOW(RAMEND)
OUT SPL, temp
LDI temp, 0xFF
OUT DDRC, temp
Timer1_Init:
;Mode 14, no prescaling
LDI temp, 0x20
OUT OCR1AL, temp
LDI temp, 0x40
OUT OCR1BL, temp
LDI temp, 0x60
OUT ICR1L, temp
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
;Enable Timer1 interrupts
LDI temp, 1<<TICIE1 |1<<TOV1| 1<<OCIE1A | 1<<OCIE1B
OUT TIMSK, temp
SEI ;Enable Interupts
MainLoop:
RJMP MainLoop
TIMER1_Capt:
LDI temp, 0x04
Out PORTC, temp
RETI
TIMER1_CompA:
LDI temp, 0x01
Out PORTC, temp
RETI
TIMER1_CompB:
LDI temp, 0x02
Out PORTC, temp
RETI
TIMER1_OverFlow:
LDI temp, 0x08
Out PORTC, temp
RETI
///
Erwartet hätte ich jetz das nach 32 Takten, der Timer1 Compare Match A
Interrupt gefeuert wird, Nach weiteren 32 Takten der Timer1 Compare
Match B Interrupt und letzendlich nach weiteren 32 Takten der Timer
Capture Interrupt. Dabach sollte der Timer eigentlich zurückgesetzt
werden aber das passiert nicht, da der Timer Overflow Interrupt auch
gefeuert wird. Irgendwas haut da überhaupt nicht hin.
Hier vielleicht was ich erreichen will.
Alle 32 Takte soll ein Interrupt gefeuert werden. Ich brauche aber 3
Interrupts, so das ich 3 mal hintereinander alle 32 Takte ein Interrupt
bekomme, sprich nach 96 Takten der Vorgang von neuem beginnt. Was
vielleicht noch anzumerken ist: Die 32 Takte sind jetzt nur als Beispiel
gedacht. Später ist das Eintreten des 1. Interrupts variabel, der
Zeitpunkt der beiden anderen Interrupts ist dann dementsprechend zu
verschieben. Erstmal will ich aber überhaupt die drei Schaltpunkte
haben.
Danke für jede Hilfe und ggf. Korrektur meiner Testanwendung.
--
Gruß Karsten
Hi >da der Timer Overflow Interrupt auch gefeuert wird. Der Overflow-Interrupt wird beim erreichen des Top-Wertes ausgelöst. Und das ist beim Timermode 14 ICR1. > Dabach sollte der Timer eigentlich zurückgesetzt werden aber das passiert >nicht,... Falls du den Simulator benutzt, da funktioniert das wirklich nicht. Es Werden nur PWM-Modi mit fester Top-Adresse unterstützt. Also 8-Bit,9-bit und 10-Bit. MfG Spess
>>da der Timer Overflow Interrupt auch gefeuert wird. > Der Overflow-Interrupt wird beim erreichen des Top-Wertes ausgelöst. Und > das ist beim Timermode 14 ICR1. Es war halt verwirrend, das der Overflow-Interrupt auch gefeuert wird. Habe Ihn jetzt disabled(brauche ich ja eignetlich auch nicht), war nur zu Testzwecken enabled um zu sehen was da kommt. Das mit dem Simulator hattest Du mir schon gepostet. Also scheinen meine Einstellungen doch so weit zu stimmen, dann habe ich bestimmt noch einen Bug in meiner Anwendung, bestimmt wieder irgendwo ein Register falsch geladen. Danke -- 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.