Moin liebe Gemeinde, ich habe im Rahmen eines Projektes ein Autonomes Modellfahrzeug zu programmieren, einen Fehler in meinem Porgramm. Ich bin noch am Anfang, also nicht wundern. Das Problem ist bisher nur, dass keine ISR beim Timerüberlauf ausgelöst wird. Es handelt sich um einen AtMega128 mit 16bit Timer. ---------------------------------------------------------------- void main(){ //---------------------------------------------------------------------- -------- // Timer Initialisierung //---------------------------------------------------------------------- -------- // SETUP für 16bit Timer [NEUES BOARD] TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0) | (0<<COM1B1)| (0<<COM1B0)| (0<<COM1C1)| (0<<COM1C0) ; TCCR1B |= (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12); //Prescaler Setup [001=1 | 010=8 | 011=64 | 100=256 | 101=1024] // 16000000MHZ/256=62500 Hz // 65536/62500 =1.048576 seconds TCCR1B |= (1<<CS12) | (0<<CS11) | (0<<CS10); TCCR1B = (0<<FOC1A) | (0<<FOC1B) | (0<<FOC1C); //Timer Interrupt Enable TIMSK |= ( 1 << TOIE0 ); TIMSK1 = 0x01; // enabled global and timer overflow interrupt; TCCR1A = 0x00; // normal operation page 148 (mode0); TCCR1B = 0x04; // start timer/ set clock // 16bit counter start register // start at 3036 -> overflow every second // 16000000MHz/256=62500 Hz // (65536-3036)/62500 =1.00 second TCNT1 = 3036; //Global Interrupt Enable sei(); while(1); } ------------------------------------------------------------------- Zurzeit besteht die ISR nur aus reseten des Timers. Mein Ziel ist es, bei jeder ISR ein PWM-Signal mit dem Oszilloskopen auszugeben. Ich bedanke mich jetzt schon einmal für eure Hilfe.
Hallo! > TCCR1B |= (1<<CS12) | (0<<CS11) | (0<<CS10); > TCCR1B = (0<<FOC1A) | (0<<FOC1B) | (0<<FOC1C); Das schieben von Nullen bringt nicht das, was du denkst.
Und TCCR1B nach dem Setzen des Vorteilers mit 0 zu überschreiben, löscht dann auch das gesetzte Vorteiler-Bit wieder. Manchmal ist weniger einfach mehr! Vor allen Dingen dann, wenn man vor lauter 0-en und 1-en und genutzten bzw. nicht genutzten Möglichkeiten den Überblick verliert, welche Konfiguration am Timer eigentlich hergestellt werden soll.
Karl Heinz Buchegger schrieb: > Und TCCR1B nach dem Setzen des Vorteilers mit 0 zu überschreiben, löscht > dann auch das gesetzte Vorteiler-Bit wieder. Ooops. Und 3 Zeilen weiter heißt es dann TCCR1B = 0x04; // start timer/ set clock Ach komm! Mach doch deinen Code erst mal übersichtlich. So hat das doch keinen Sinn.
Apropos AtMega128 Die M103 Fuse hast du gelöscht? Die ist standardmässig gesetzt und bewirkt, dass du einen Mega103 vor dir hast und keinen Mega128. Ist das der Fall und compilierst du für einen Mega128, dann geht der erste Funktionsaufruf (kann natürlich auch ein ISR AUfruf sein), kräftig in die Hose.
andy kkkkkk schrieb: > TCCR1A = 0x00; // normal operation page 148 (mode0); > > TCCR1B = 0x04; // start timer/ set clock Über diese beiden Zeilen solltest du nochmal gründlich nachdenken. Oliver
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.