Forum: Mikrocontroller und Digitale Elektronik PWM will nicht


von Björn R. (sushi)


Angehängte Dateien:

Lesenswert?

Ich versuche seit Stunden 3 PWM-Kanäle an einem ATTiny45 zum Laufen zu 
bringen, aber es funktioniert nichts. Das Ganze soll eine RGB-LED 
ansteuern, der Schaltplan ist im Anhang. Das Programm was ich im Moment 
habe soll erstmal nur einen Kanal, nämlich den roten, immer heller 
werden lassen, bis die maximale Helligkeit erreicht ist, und danach 
wieder von vorne anfangen. Die Tabelle mit den exponentiellen Werten ist 
aus dem LED-Fade Artikel hier von der Seite.

Hier mein Code:
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
#include <util/delay.h>
4
5
6
uint8_t pwmtable[32] PROGMEM = {0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11,
7
                                    13, 16, 19, 23, 27, 32, 38, 45, 54, 64, 76,
8
                                    91, 108, 128, 152, 181, 215, 255};
9
10
int main()
11
{
12
  uint8_t r=0;  //rot-wert, 0-31
13
  uint8_t g=0;  //grün-wert, 0-31
14
  uint8_t b=0;  //blau-wert, 0-31
15
  
16
  //Timer 0
17
  TCCR0A=(1<<COM0A1)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00);    //Verhalten der OC0A und OC0B Pins=>nicht invertierend, Fast-PWM
18
  TCCR0B=(1<<CS00)|(1<<CS02);    //Prescaler = 1024
19
  OCR0A=0;              //roter Kanal, Pin OC0A
20
  OCR0B=0;              //grüner Kanal, Pin OC0B
21
  
22
  //Timer 1
23
  TCCR1=(1<<CS10)|(1<<CS11)|(1<<CS13);          //Prescaler=1024
24
  GTCCR=(1<<PWM1B)|(1<<COM1B1);        //nicht invertierende PWM an OC1B
25
  OCR1C=255;              
26
  OCR1B=0;              //blauer Kanal, Pin OC1B
27
  DDRB=(1<<PB0)|(1<<PB1)|(1<<PB4);  //Pins OC0A, OC0B und OC1B =>Ausgänge, Rest Eingänge
28
  
29
  //Hauptschleife
30
  while(1)
31
  {
32
    OCR0A=pwmtable[r];
33
    OCR0B=pwmtable[g];
34
    OCR1B=pwmtable[ b];
35
    r=r+1;
36
    if(r==32)r=0;
37
    
38
    
39
    _delay_ms(20);
40
    
41
  }
42
}

Weiß jemand, was ich da vergessen habe?
Vielen Dank im Voraus, Björn

PS: das Leerzeichen vor dem  b als Index habe ich eingefügt, da die 
Forensoftware sonst meint ich spamme.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> aber es funktioniert nichts.
Was genau tut nicht? Alles dunkel, alles hell? Nur Rot?
Das hast du leider nicht beschrieben.

von Björn R. (sushi)


Lesenswert?

Oh Entschuldingung...
Das ist das, was ich mir am wenigsten erklären kann: nur die Blaue LED 
leuchtet, und das dauerhaft. Ich bin gerade auch schon in der FH 
gewesen, um mit dem Oszilloskop nachzumessen: Da kommt gar nichts, nur 
bei der blauen. Aber auch da ist nichts getaktet oder so.

LG, Björn

von Björn R. (sushi)


Lesenswert?

Nur mal so: die Interrupts muss man doch wohl im PWM-Modus nicht 
einschalten, oder?

von Christian L. (lorio)


Lesenswert?

Ohne den Code nachvollzogen zu haben:
1
OCR0A=pwmtable[r];
2
OCR0B=pwmtable[g];
3
OCR1B=pwmtable[ b];

ändern in
1
OCR0A=pgm_read_byte(&pwmtable[r]);
2
OCR0B=pgm_read_byte(&pwmtable[g]);
3
OCR1B=pgm_read_byte(&pwmtable[ b]);

von Björn R. (sushi)


Lesenswert?

Das ist schonmal ein guter Tipp. Kommt vom Copy&paste, da ich noch nie 
mit dem Programmspeicher in der Form gearbeitet habe.
Der Rest ist allerdings von mir ersonnen, und wahrscheinlich auch der 
Grund, warum es nicht tut. Die Änderungen brachten jedenfalls keine 
Verbesserung.
Wäre nett wenn ihr euch das nochmal anschauen könntet. kann ja 
eigentlich nur an der Timer-Initialisierung liegen...

LG, Björn

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.