Forum: Mikrocontroller und Digitale Elektronik ATmega328PB LED rgb PWM


von Fleur (Gast)


Lesenswert?

Hallo,

kann mir vielleicht einer helfen?
Ich weiß einfach nicht, warum die grüne LED nicht angehen möchte.. 
Selbst wenn ich Sie in den ersten Case reinsetze.
Rot und blau funktionieren..
Hab ich was mit den Timern falsch gemacht?
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <avr/pgmspace.h>
5
#include <avr/interrupt.h>
6
#include "lookup.dat"
7
8
#define LED_RED_init()       DDRB |= (1<<DDB1)
9
#define RED()                OCR1A = w;     OCR1B = 0; OCR2A = 0;
10
             
11
12
#define LED_BLUE_init()      DDRB |= (1<<DDB3)
13
#define BLUE()               OCR1A = 0; OCR1B = 0; OCR2A = w;
14
15
16
#define LED_GREEN_init()     DDRB |= (1<<DDB2)
17
#define GREEN()              OCR1A = 0; OCR1B = w; OCR2A = 0;
18
19
#define WHITE_init()         DDRB |= ( (1<<DDB1) | (1<<DDB2) | (1<<DDB3) )
20
#define WHITE()              OCR1A = x; OCR1B = x; OCR2A = x;
21
22
#define BREAK()              OCR1A = 0; OCR1B = 0; OCR2A = 0;  
23
24
25
// Globale Variablen
26
volatile int intensitaet = 0;
27
volatile char farbe = 0;
28
volatile char w;
29
volatile char x; 
30
31
enum
32
{
33
    RED, BREAK1, GREEN, BREAK2, WHITE, BREAK3
34
} ;
35
//   0     1       2      3       4      5
36
37
void init_rgb(void)  
38
{
39
LED_BLUE_init();
40
LED_RED_init();
41
LED_GREEN_init();
42
WHITE_init();
43
44
}
45
46
void init_timer(void)
47
{       
48
    //Timer 0
49
    TCCR0B |= (1<<CS02) | (1<<CS00);    // Prescaler 1024
50
    TCCR0A |= (1<<WGM00);               // Phase Correct Mode 1
51
    TCCR0A |= (1<<COM0A1);              // Non-inverting Mode, CM0A1 --> 1
52
    OCR0A = 121;   
53
    
54
    //Timer 1
55
    TCCR1B |= (1<<CS12);                // Prescaler 256
56
    TCCR1A |= (1<<WGM10);               // Mode 1
57
    TCCR1A |= (1<<COM1A1) | (COM1B1);
58
    
59
    //Timer 2
60
    TCCR2B |= (1<<CS22) | (1<<CS21);    // Prescaler 256
61
    TCCR2A |= (1<<WGM20);               // Mode 1
62
    TCCR2A |= (1<<COM2A1);
63
}
64
65
ISR(TIMER0_COMPA_vect)
66
{
67
    intensitaet++;
68
}
69
70
void programm(void)
71
{  
72
  
73
74
       
75
    switch(farbe)           
76
    {           
77
        case RED: 
78
            RED ();           
79
            if(intensitaet==255)
80
            {
81
                intensitaet = 0;
82
                farbe = BREAK1;   
83
            }
84
            break;
85
            
86
        case BREAK1:
87
            BREAK();              
88
            if(intensitaet==255)
89
            {
90
                intensitaet = 0;
91
                farbe = GREEN;   
92
            }
93
            break;
94
            
95
        case GREEN:          
96
            GREEN();            
97
            if(intensitaet==255)
98
            {
99
                intensitaet = 0;
100
                farbe = BREAK2;   
101
            }
102
            break;
103
            
104
        case BREAK2:
105
            BREAK();           
106
            if(intensitaet==255)
107
            {              
108
                farbe = WHITE;   
109
            }
110
            break;
111
            
112
        case WHITE:          
113
            WHITE();            
114
            if(intensitaet==0)
115
            {          
116
                farbe = BREAK3;   
117
            }
118
            break;
119
            
120
        case BREAK3:
121
            BREAK();           
122
            if(intensitaet==255)
123
            {
124
                intensitaet = 0;
125
                farbe = RED;   
126
            }
127
            break;            
128
    }
129
}
130
131
int main(void)
132
{
133
    init_rgb();
134
    init_timer();
135
    sei();     
136
    TIMSK0 |= (1<<OCIE0A);
137
    intensitaet = 0;    
138
         
139
    while (1)
140
    {        
141
        programm();
142
      
143
        w = pgm_read_byte_near(lookup + intensitaet); 
144
        x = pgm_read_byte_near(lookup +255 -intensitaet);         
145
    }
146
}

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


Lesenswert?

Fleur schrieb:
> Ich weiß einfach nicht, warum die grüne LED nicht angehen möchte..
Leuchtet die LED, wenn du den Pin statisch auf "EIN" setzt?

Das Programm an sich hat aber auch noch ein paar kleine Ecken, die 
einige Stunden Fehlersuche kosten können...

Denn es ist generell eine ganz üble Sache, einen Zähler von 
verschiedenen Stellen aus zu manipulieren:
1
volatile int intensitaet = 0;    -- warum eigentlich ein int, 
2
                                 -- wenn doch nur 8 Bit gezählt werden?
3
4
ISR(TIMER0_COMPA_vect)
5
{
6
    intensitaet++;                    -- Zähler wird geändert
7
}
8
9
void programm(void)
10
{  
11
    switch(farbe)           
12
    {           
13
        case RED: 
14
            RED ();           
15
            if(intensitaet==255)
16
            {   
17
                intensitaet = 0;     -- Zähler wird geändert


Und was passiert hier:
1
            if(intensitaet==255)
wenn es der Zähler "zufällig" schafft, durch einen Interrupt auf 256 zu 
kommen?

BTW: bitte fürderhin die [c] Tags selber einfügen!

von Fleur (Gast)


Lesenswert?

Wenn ich den statisch auf ein setze, dann leuchtet es ja.
Habe ihn jetzt auf ein char gesetzt, hatte da nicht genau drüber 
nachgedacht.
also muss ich alle OCR Werte für blau rot und grün schon auf 255 setzen 
bei White, damit er dann runterzählt?

Zum Zähler, sollte ich in der ISR dann ein if einbauen für den Zähler?

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.