Problem mit PWM für RGB Streifen Atmega644

OP #2632304
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
}
Gast
>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.
OP
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.
Gast
>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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.