PWM-Problem (PINs beim Tiny13 zeigen keine Reaktion)

OP #2132342
Lesenswert?

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 ...
}
}
OP #2133110
Lesenswert?

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
#2133156
Lesenswert?

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
Lesenswert?

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.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren