Ich werde gleich wahnsinnig. Ich nutze den Timer0 zur FastPWM und würde gerne in den ISR der entsprechenden Interrupts das Output Compare Register auf einen neuen Wert setzen. Leider springe ich nie in die ISRs. Es ist sicher irgendwas blödes, aber ich bin wohl grade betriebsblind. Ich habe ein Testprogramm eingefügt. In dem Testprogramm setze ich nicht das OCR neu, sondern einen Port Pin auf high. int main(void) { cli(); /* OC0A is PIN PB2= PIN 14 */ DDRB = 0xFF; DDRD = 0xFF; TCCR0A =0; /* Clear OC0A on Compare Match, set OC0A at BOTTOM --> non inverting mode*/ TCCR0A |= (1<<COM0A1); /*Fast PWM*/ TCCR0A |= (1<<WGM00); TCCR0A |= (1<<WGM01); TCCR0B=0; /* clkI/O/1024 (From prescaler) */ TCCR0B |= (1 << CS02); TCCR0B |= (1 << CS00); TIMSK=0; /* Timer/Counter0 Output Compare Match A Interrupt Enable */ TIMSK |= (1 << OCIE0A); /* Timer/Counter0 Overflow Interrupt Enable */ TIMSK |= (1 << TOIE0); /* half of the time on and half of the time off */ OCR0A = 128; /*PORTD |= (1 << PORTD6);*/ sei(); } ISR(TIMER0_COMPA_vect) { PORTD |= (1 << PORTD6); } ISR(TIMER0_OVF_vect) { PORTD |= (1 << PORTD6) ; }
Und wo ist das while(1); damit der niemals die main() verlässt? So kann das ja nix werden, weil er dann die 2k Speicher wohl schneller durchrennt als er die ISR aufruft und sich somit immerwieder neu initialisiert.
Nach dem "sei()" in "main" werden die Interrupts abgeschaltet und der Controller bettet sich zur Ruhe, indem er auf der Stelle trampelt, bis ihm der Saft abgedreht wird oder er kaputt geht. Wo ist deine Hauptprogrammschleife? mfg.
...wusste ichs doch, dass es was blödes ist. :-) Danke Jungs.
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.