Brauche wieder einmal eure Hilfe! Irgendwie funktioniert dieser Code nicht so richtig. Die Pin's reagieren nicht. Nur wenn ich den "IRQs enable" ausschalte, dann geht's plötzlich. Was mache ich falsch? Danke! Lg Mad Anbei mein Code: #include <avr/interrupt.h> #include <avr/wdt.h> #include <avr/io.h> #include <avr/eeprom.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h> #include <stdbool.h> /* Software PWM mit 8-Bit Timer 0 * * Dimmt eine LED an PB3 * Prescaler: 1/256 */ // Timer/Counter0 Overflow ISR (TIMER0_OVF_vect) { PORTB |= (1 << PB3); // PB3 ein } // Timer/Counter0 Compare Match ISR (TIMER0_COMP_vect) { PORTB &= ~(1 << PB3); // PB3 aus } int main() { DDRB |= (1 << PB3); // PORTB is OUTPUT PORTB |= (1 << PB3); // Pullup OFF TIMSK0 |= (1 << TOIE0) | (1 << OCIE0A); // IRQ bei Überlauf TCCR0B |= (1 << CS02); // Prescaler: 1/256 OCR0A = 168; // Vergleichswert (0 = dunkel 255 = hell); sei(); // IRQs enable while (1) // endlos { // Code ... } }
Gibt es einen speziellen Grund weshalb du PWM auf die Art machst (mit Interrupt Routinnen)?
Hallo Spanner,
nein, es gibt keinen speziellen Grund, warum ich diese Art der PWM
gewählt habe. Blicke bei dieser Sache nicht ganz durch. Vielleicht
kannst du mir das Programm ("Grundkonfig." so abändern, damit ich jeden
Pin (sind ja nur 8 einschließlich Spg.-Vers.) Pin als Ausgang verwenden
kann. Mir fehlt das Grundverständnis. Danke Mad
Madang Madang schrieb: > Irgendwie funktioniert dieser Code Selbstgeschrieben oder irgendwo "gefunden"? > nicht so richtig. Wo funktioniert er nicht, im Tiny13 oder im Simulator? > Die Pin's reagieren > nicht. Wieso "Pins", es wird doch nur ein Pin angesprochen? > Nur wenn ich den "IRQs enable" ausschalte, dann geht's plötzlich. Was geht plötzlich? (Simulation? Realer Tiny13?) Wie erkannt? (Oszilloskop? Frequenzmesser? LED? ...?) > Was mache ich falsch? Du gibst vermutlich zuwenig Infos. ...
Ich schreib dir nicht dein Programm. Aber falls deine Absicht ist eine LED auf eine bestimmte Helligkeit einzustellen per PWM, dann lösche deine Interrupt Routinen, benutze einfach einen Timer im "Fast PWM" Modus. That's it. Keine Interrupts benötigt und das sei() kannst du dir dann auch sparen.
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.