Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM für RGB Streifen Atmega644


von Jan H. (cod1ac)


Lesenswert?

Ich habe jetzt schon mehrere Tutorials für AVRs durchgearbeitet und 
wollte mich nun mal an eigenen Code wagen. Leider funktioniert mein 
Programm nicht ich vermute es ist ein simpler Fehler den ich aber leider 
nicht finden kann. es wäre schön wenn mir jemand helfen kann.

hier mein Programm:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <math.h>
4
#include <avr/pgmspace.h>
5
6
uint16_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
11
int main(void)
12
{
13
  DDRD = 0xFF; //Alles auf Ausgang
14
  DDRB = 0xFF; //Alles auf Ausgang
15
  PORTD = 0x00; 
16
  PORTD = 0x00;
17
  DDRA = 0x00;
18
  PORTA = 0x00;
19
  
20
  uint8_t valuered = 0;
21
  uint8_t valueblue = 0;
22
  uint8_t valuegreen = 0;
23
  uint8_t adcvalue = 0;
24
  uint8_t step = 1;
25
  uint8_t stepsize = 1;
26
  
27
  // PWM 0
28
  // 8-bit PWM, Phase correct
29
  // 8 bits give us 256 levels of brightness
30
  TCCR0A |= (1<<WGM00);
31
32
  // Clear OC0A/OC0B on Compare Match
33
  // Set OC0A/OC0B at BOTTOM (non-inverting mode)
34
  TCCR0A |= (1<<COM0A1);
35
36
  // Set prescaler to 8
37
  // 1 MHz / 8*256 = ~490 Hz PWM frequency
38
  TCCR0B |= (1<<CS01);
39
  
40
41
  // PWM 1
42
43
  // 8-bit PWM, Phase correct
44
  // 8 bits give us 256 levels of brightness
45
  TCCR1A |= (1<<WGM10);
46
47
  // Clear OC0A/OC0B on Compare Match
48
  // Set OC0A/OC0B at BOTTOM (non-inverting mode)
49
  TCCR1A |= (1<<COM1A1);
50
51
  // Set prescaler to 8
52
  // 1 MHz / 8*256 = ~490 Hz PWM frequency
53
  TCCR1B |= (1<<CS11);
54
55
  while(1)
56
  {
57
58
    if(adcvalue = 191)adcvalue=0;
59
    adcvalue++;
60
    
61
    if(adcvalue<32){
62
      valuered = 32;
63
      valueblue = 0;
64
      valuegreen = adcvalue;
65
    }
66
    if(31<adcvalue<64){
67
      valuered = 32 - adcvalue;
68
      valueblue = 0;
69
      valuegreen = 32;
70
    }
71
    if(63<adcvalue<96){
72
      valuered = 0;
73
      valueblue = adcvalue;
74
      valuegreen = 32;
75
    }
76
    if(95<adcvalue<128){
77
      valuered = 0;
78
      valueblue = 32;
79
      valuegreen = 32 - adcvalue;
80
    }
81
    if(127<adcvalue<160){
82
      valuered = adcvalue;
83
      valueblue = 32;
84
      valuegreen = 0;
85
    }
86
    if(159<adcvalue<192){
87
      valuered = 32;
88
      valueblue = 32 - adcvalue;
89
      valuegreen = 0;
90
    }
91
    
92
    OCR1A = pwmtable[valuered];
93
    OCR1B = pwmtable[valuegreen];
94
    OCR0A = pwmtable[valueblue];    
95
    _delay_ms(40);
96
  }
97
98
  return 0;
99
}

von holger (Gast)


Lesenswert?

>Leider funktioniert mein
>Programm nicht ich vermute es ist ein simpler Fehler den ich aber leider
>nicht finden kann. es wäre schön wenn mir jemand helfen kann.

Wenn du mal sagen würdest was dein Problem ist, dann könnte
man vieleicht auch eine Antwort darauf geben.

von Jan H. (cod1ac)


Lesenswert?

Ich möchte eine dreikanal hardware PWM realisieren für einen RGB strip 
für jede farbe ein Kanal. Aktuell möchte ich einfach nur alle farben 
einmal durchlaufen lassen. Dafür die vielen if Abfragen. Später möchte 
ich mit einem Poti über den ADC den Wert adcvalue ändern um mit dem Poti 
die farbe manuell einstellen können. aktuell durchläuft der adcvalue den 
bereich von 0 bis 192 und fängt wieder von vorne an. Leider bekomme ich 
an den PWM ausgängen keine messbare Spannung bzw. meine test Leds 
leuchten nicht ich kann ausschließen das ein fehler bei der beschaltung 
vorliegt. Ich vermute, dass ich einfach Register falsch gesetzt habe.

von holger (Gast)


Lesenswert?

if(adcvalue = 191)adcvalue=0;
    adcvalue++;

Man kann adcvalue auch einfacher dauerhaft auf 1 setzen;)

von holger (Gast)


Lesenswert?

Und wer Warnings ignoriert hat es echt nicht besser verdient.

von holger (Gast)


Lesenswert?

>      valueblue = 32 - adcvalue;

Was kommt eigentlich bei 32 - 160 raus;)

von holger (Gast)


Lesenswert?

>uint16_t pwmtable[32]  PROGMEM = {0, 1, 2, 2, 2, 3, 3

    OCR1A = pwmtable[valuered];

So holt man keinen Wert aus PROGMEM.

>ich vermute es ist ein simpler Fehler

Nö, das ganze Programm ist ein kompletter Fehler.

von Jan H. (cod1ac)


Lesenswert?

Alles klar ich leg am besten nochmal von vorne los danke für die Hilfe. 
Werde wohl erstmal möglichst einfach anfangen und das Programm dann 
erweitern.

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.