wald vor bäumen: attiny45 und pwm;

Gast #6074171
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;
    }
  }
}
Gast
leo schrieb:
> Das ist kein Funktionsaufruf. Warum ignorierst du Compilerwarnungen?

DANKE! Es gab keine Compilerwarnung... Und ja, die Benennung mach ich 
nochmal vernünftig! Danke fürs rüberschauen trotz der maximalen 
Unlesbarkeit!
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.