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 ... } }
Gast
#2132468
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. ...
Gast
#2133394
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.