wald vor bäumen: attiny45 und pwm;

Gast #6074171
Lesenswert?

Hallo,
nach langer Zeit ohne Mikrocontroller wollte ich mal schnell ne PWM mit 
nem ATTINY45 über Timer0 an PB0 und PB1 erzeugen,und ich kriegs nicht 
hin, kann aber den Fehler nicht finden - die LEDS bleiben einfach 
dunkel. Mein Probeaufbau läuft, wenn ich die die Pins als Ports direkt 
auf eins setze, leuchten die LEDS, übers OCR0A/B-Register gehts aber 
nicht. Hab lange im Datenblatt alles fünffach gegengecheckt und auch im 
Netz recherchiert, meiner Meinung nach mache ich alles richtig, aber 
offensichtlich nicht.Wenn da irgendwer mal rüberschauen könnte, wäre ich 
sehr dankbar, ich seh es einfach nicht.
Oben kurz die meine Initialisierung des Timers, darunte das komplette 
Programm, was so funktioniert, nur eben die PWM-Ausgabe nicht...
Danke an alle helfende Augen!


****TIMER_INIT****

void init_timer0()
{
//timer_0, fast PWM, clear on compare match
TCCR0A |= (1<<COM0A1) | (1 << COM0B1) |(1<<WGM01)|(1<<WGM00);
// no prescaling
TCCR0B |=   (1 << CS00);
}


****KOMPLETTES PROGRAMM****
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>




#define button_down (!(PINB & (1 << PINB2)))
#define gruen_pin  PB0
#define rot_pin    PB1
#define blau_pin  PB4
#define poti_pin  PB3




void init_timer0()
{
  //timer_0, fastPWM, clear on compare match
  TCCR0A |= (1<<COM0A1) | (1 << COM0B1) |(1<<WGM01)|(1<<WGM00);
  // no prescaling
        TCCR0B |=   (1 << CS00);
}


void rot_mode()
{
  OCR0A = 255;
  OCR0B = 0;
  PORTB = (1 << blau_pin);
}

void gruen_mode()
{
  OCR0A = 255;
  OCR0B = 0;
  PORTB |= (1 << blau_pin);
}

void fade_mode()
{
  OCR0A = 100;
  OCR0B = 100;
  PORTB &= ~(1 << blau_pin);
}

void blink_mode()
{
  OCR0A = 0;
  OCR0B = 0;

}

int main(void)
{
  ////Ausgänge
  DDRB |= (1 << rot_pin) | (1 << gruen_pin) | (1 << blau_pin);

  ////Eingänge
  //Taster
  DDRB &= ~(1 << PINB2);
  //POTI
  DDRB &= ~(1 << PINB3);

  //interne Pullups hoch
  PORTB |= (1 << PB2);

  //Timer initialisieren
  init_timer0;

  uint8_t flag_mode = 0;

  while(1)
  {
    if (button_down)
    {
      while (button_down)
      {

      }
      flag_mode++;
      if (flag_mode == 4)
      {
        flag_mode = 0;
      }
    }


    switch(flag_mode)
    {
      case 0:    rot_mode();  break;
      case 1:    gruen_mode();  break;
      case 2:    fade_mode();  break;
      case 3:    blink_mode();  break;
      default:      break;
    }
  }
}
#6074210
Lesenswert?

Sollte es eigentlich nicht der PWM Modus 7 mit Top OCRA sein?

Der if (button_down) Teil kann funktionieren, muß aber nicht wenn der 
Taster anfängt zu prellen.

Wenn kein Taster gedrückt wird, wird switch(flag_mode) immer wieder 
aufgerufen und die dementsprechende Funktion, welche immer wider OCRA 
und den Pin einstellt. Nicht schön...

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