Forum: Mikrocontroller und Digitale Elektronik wald vor bäumen: attiny45 und pwm;


von claudia h. (Gast)


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

von leo (Gast)


Lesenswert?

claudia h. schrieb:
> //Timer initialisieren
>   init_timer0;

Das ist kein Funktionsaufruf. Warum ignorierst du Compilerwarnungen?
Warum mixt du Portnummern und Namen zur maximalen Unleserlichkeit?

leo

von claudia h. (Gast)


Lesenswert?

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!

von leo (Gast)


Lesenswert?

claudia h. schrieb:
> Es gab keine Compilerwarnung...

Dann wird es Zeit diese einzuschalten. E.g. bei gcc mit -Wall:
1
f.c:6:3: warning: statement with no effect [-Wunused-value]
2
   f;

leo

von Holger L. (max5v)


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

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.