Forum: Mikrocontroller und Digitale Elektronik PWM-Problem (PINs beim Tiny13 zeigen keine Reaktion)


von Mad M. (madang)


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 ...
}
}

von Spanner (Gast)


Lesenswert?

Gibt es einen speziellen Grund weshalb du PWM auf die Art machst (mit 
Interrupt Routinnen)?

von Mad M. (madang)


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

von Hannes L. (hannes)


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.

...

von Spanner (Gast)


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.

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
Noch kein Account? Hier anmelden.