Forum: Mikrocontroller und Digitale Elektronik PWM auf OCR0A und OCR1A


von Niine (Gast)


Lesenswert?

Hey,

ich hab 2 LEDS die ich beide mit PWM ansteuern will.

OCR0A ini ich ja so:

    TCCR0A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1); TCCR0B = (1<<CS10);

Nun will ich aber OCR1A auch initialisieren. Was muss ich den dann genau 
ändern?

Dazu soll gesagt sein, das ich noch einen anderen Timer nutze um jede 
Sek zu zählen und die LEDS alle 6sek eine Stufe hoch machen will. Code 
sieht so aus:
1
// Interrupt Service Routine fuer Timer1
2
ISR(TIMER1_OVF_vect) {  
3
  
4
    TCNT1 = 49911; 
5
    sek = sek + 1;
6
    ledwechsel;
7
    if (sek == 60) {sek=0; min = min + 1;}
8
      if (min==60) {min=0; hour = hour + 1;}
9
        //
10
         //Startvorgang  
11
     
12
           if ((OCR0A < 255) && (sek % 6 == 0))
13
           {
14
             sek = sek + 1;
15
             OCR0A = OCR0A + 1; 
16
             OCR1A = OCR1A + 1;
17
            ledwechsel; 
18
           }
19
  
20
     
21
  
22
  
23
        // Endvorgang
24
         if ((OCR0A <= 255) && (sek % 6 == 0) && (hour == 8))
25
           {
26
             sek = sek + 1;
27
             OCR0A = OCR0A - 1; 
28
             OCR1A = OCR1A -1;
29
            ledwechsel; 
30
           }
31
        
32
     
33
     
34
}     
35
36
37
int main(void){
38
39
  DDRB = 0b00011100;
40
  DDRD = 0b00000000;
41
       
42
 
43
  
44
    sei(); //Interrupts ermoeglichen
45
        
46
    
47
    // fuer Timer:     
48
    TIMSK |= (1<<TOIE1);
49
    TCCR1B |= (1<<CS11) |  (1<<CS10);     //Prescaler = 64
50
    TCNT1 = 0xFFFF;         //Zaehlregister vorladen mit FFFF zum Sofortstart 
51
     
52
    TCCR0A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1); TCCR0B = (1<<CS10);
53
54
     
55
   OCR0A = 0; 
56
   
57
    while(1){
58
59
    }

Danke für eure Hilfe!!!


Lg Niine

von Karl H. (kbuchegg)


Lesenswert?

Niine schrieb:
> Hey,
>
> ich hab 2 LEDS die ich beide mit PWM ansteuern will.
>
> OCR0A ini ich ja so:
>
>     TCCR0A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1); TCCR0B = (1<<CS10);
>
> Nun will ich aber OCR1A auch initialisieren. Was muss ich den dann genau
> ändern?

OCR0A   arbeitet mit dem Timer 0
OCR1A   arbeitet mit dem Timer 1

Löse dich von der Vorstellung, dass du die Einstellung für den Timer 0 
mehr oder weniger für den Timer 1, mit kleinen Änderungen weiterbenutzen 
kannst. Schnapp dir das Datenblatt, schlage das Kapitel über den Timer 1 
auf und lies nach, wie man den konfiguriert, dass er eine PWM an einem 
Pin erzeugt. Vieles vom Timer 0 wird dir zwar bekannt vorkommen, aber es 
ist auch nicht so, dass man das alles 1:1 übernehmen kann.

Generell ist IMMER das Datenblatt deine Bibel.

>
> Dazu soll gesagt sein, das ich noch einen anderen Timer nutze um jede
> Sek zu zählen und die LEDS alle 6sek eine Stufe hoch machen will. Code
> sieht so aus:

Dann musst du eben die beiden Dinge unter einen Hut kriegen. Wobei du 
dich gleich mal von der Vorstellung lösen solltest, dass du den Timer so 
einstellst, dass er die genau alle 1 Sekunde einen Interrupt erzeugt. 
Jetzt musst du dich nach der PWM richten. Und wenn das bedeutet, dass du 
alle 5 Millisekunden einen Interrupt kriegst, dann musst du eben bis 200 
zählen ( denn 5 * 200 ergibt 1000 Millisekunden) bis 1 Sekunde um ist.

von Niine (Gast)


Lesenswert?

Danke für deine Hinweise. Ich werd es mir mal anschauen.

Lg Niine

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.