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.