Forum: Mikrocontroller und Digitale Elektronik Atmega32 PWM will nicht so ganz


von Kuba (Gast)


Lesenswert?

Hallo, ich wusste jetzt nicht so recht wie ich die Überschrift benennen 
sollte aber sei es drum.

Ich wollte die 4 Pwm Ausgänge des Atmegas32 nutzen.

Timer0 Funktioniert einwandfrei.

Timer1 im Prinzip ja auch.  Nur das der Ausgang immer auf High ist, wenn 
ich kein PWM Signal drauf gebe.

Mit dem Timer2 hab ich noch ein anderes Problem, aber wollte erstmal 
wissen was mit dem Timer1 ist. Ich hab jetzt so nix gefunden und auch 
eigentlich alles richtig eingestellt... Fast-Pwm 8bit ( Mode 5 ) 
(non-inverting mode)
1
void PWM_Int(){  
2
  
3
  TCCR0 = (1<<WGM01) | (1<<WGM00) | (1<<CS00) | /*(1<<CS02) |*/ (1<<COM01); //Fast PWM //Zählt von 0 bis OCR0    
4
  
5
   TCCR1A = (1<<WGM10)| (1<<WGM12) |(1<<COM1A1) |(1<<COM1B1)  ;    // Set up the two Control registers of Timer1. Wave Form Generation is Fast PWM 8 Bit
6
                      
7
   TCCR1B = (1<<WGM12)|(1<<CS12) |(1<<CS10);    // OC1A and OC1B are cleared on compare match and set at BOTTOM. Clock Prescaler is 1024
8
}
9
                           
10
11
12
13
14
//Wert: Zwischen 0 - 255
15
16
//0= 0%
17
18
//255= 100%
19
  
20
//      Wert
21
//Vout=  ------ x 5v
22
//        255
23
24
void PWM_Output(uint8_t wert){
25
    OCR0=wert;      
26
    OCR1A=wert;
27
    OCR1B=wert;
28
}

von Ingo (Gast)


Lesenswert?

Kuba schrieb:
> Nur das der Ausgang immer auf High
Ach DER Ausgang? Hast du irgendwo die IOs auf Output gestellt?

von Kuba (Gast)


Lesenswert?

JA, wieso denn auch nicht ? Sage ja nicht das der Ausgang High sein soll 
?

        DDRB = 0xff;
  DDRD = 0x00;
  DDRA = 0x00;
  DDRC = 0x03;

  DDRD |= 0x30;  <-----------Aber ohne funktioniert es nicht

von Kuba (Gast)


Lesenswert?

Anyone..?

von Karl H. (kbuchegg)


Lesenswert?

Da
1
   TCCR1A = (1<<WGM10)| (1<<WGM12) |(1<<COM1A1) |(1<<COM1B1)  ;    // Set up the two Control registers of Timer1. Wave Form Generation is Fast PWM 8 Bit
2
                      
3
   TCCR1B = (1<<WGM12)|(1<<CS12) |(1<<CS10);    // OC1A and OC1B are cleared on compare ma
kann was nicht stimmen.
WGM12 kann nicht sowohl in TCCR1A als auch in TCCR1B sein.

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Karl Heinz schrieb:
> WGM12 kann nicht sowohl in TCCR1A als auch in TCCR1B sein.

Da WGM12 der Zahl 3 entspricht, kann das überall sein!

z.B. DDRB |= (1<<WGM12)

: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

Aber da die 3, die mit WGM12 gemeint ist, im TCCR1B sitzt, ist es nicht 
so toll mit der 3 TCCR1A anzusprechen. Dort setzt du damit das FOC1A 
bit(Force Output Compare]

von Karl H. (kbuchegg)


Lesenswert?

Route 66 schrieb:
> Karl Heinz schrieb:
>> WGM12 kann nicht sowohl in TCCR1A als auch in TCCR1B sein.
>
> Da WGM12 der Zahl 3 entspricht, kann das überall sein!
>
> z.B. DDRB |= (1<<WGM12)

Ja, natürlich. Aber darum gehts mir nicht.
Mir gehts darum, das rein aus formalen Gründen, in
1
   TCCR1A = ....  (1<<WGM12) .....;
2
   TCCR1B = ....  (1<<WGM12) .....;
etwas nicht stimmen KANN, und das er das eigentlich hätte sehen müssen, 
wenn er sagt
> ...  und auch eigentlich alles richtig eingestellt ....


Es ist also ein Appell an 'mehr Sorgfalt', ohne ihn mit der Nase auf das 
Problem (ein mögliches Problem) zu stossen.

von Route_66 H. (route_66)


Lesenswert?

Karl Heinz schrieb:
> Mir gehts darum, das rein aus formalen Gründen, in   TCCR1A = ....
> (1<<WGM12) .....;
>    TCCR1B = ....  (1<<WGM12) .....;
> etwas nicht stimmen KANN, und das er das eigentlich hätte sehen müssen,

Mir war schon klar, was Du meintest.
Meine zugegeben ketzerische Erwiderung sollte "Kuba" nur zeigen, dass 
dieser offensichtliche Tippfehler weder vom Präprozessor noch vom 
Compiler erkannt und bemängelt wird. Selbst das Datenrichtungsregister 
lässt sich so umprogrammieren...

von Kuba (Gast)


Lesenswert?

Hab das "Problem" gelöst, muss im Hauptprogramm jeglich sagen das er auf 
Low sein soll, war davon ausgegangen das er selbst auf Low ist da ich 
den Ausgang ja nicht ansteuere.

Mein anderes Problem ist dass die LED's am Timer1 PWM Ausgang leicht 
flimmern. Bei so ca. unter 3,5V.

Bei TCCR1A möchte ich den Mode 5 haben Fast-PWM 8bit. Dafür müssen WGM12 
auf 1 und WGM10 auf 1.

Nun, habe ich mal Mode 1 für TCCR1A genommen. PWM, Phase Correct, 8-bit.
Würde ich aber bei TCCR1B Mode 1 nehmen flackern die LED's stark.
1
TCCR0 = (1<<WGM01) | (1<<WGM00) | (1<<CS00)  |(1<<COM01)   ;      
2
  
3
TCCR1A = (1<<WGM10)| (1<<COM1A1)|(1<<COM1B1) ;
4
                      
5
TCCR1B = (1<<WGM12)| (1<<WGM10) | (1<<CS12)  |(1<<CS10);

von spess53 (Gast)


Lesenswert?

Hi

>TCCR1A = (1<<WGM10)| (1<<COM1A1)|(1<<COM1B1) ;
           ^^^^^^^^^^
>TCCR1B = (1<<WGM12)| (1<<WGM10) | (1<<CS12)  |(1<<CS10);
                      ^^^^^^^^^^

MfG Spess

von Kuba (Gast)


Lesenswert?

hi, danke.

Wieso sollte/kann ich WGM10 in beiden Registern nicht aktivieren ?
Gehören die zusammen, beziehungs-weise ergänzen die sich ?

von spess53 (Gast)


Lesenswert?

Hi

>Wieso sollte/kann ich WGM10 in beiden Registern nicht aktivieren ?
>Gehören die zusammen, beziehungs-weise ergänzen die sich ?

Hast du auch schon mal ansatzweise ins Datenblatt gesehen. TCCR1A/B 
bestimmen die Arbeitsweise des Timers und das Verhalten der beiden 
Kanäle. Und die Position und Bedeutung der einzelnen Bits in den 
Registern sind eindeutig festgelegt. Für eigene Interpretationen ist da 
absolut kein Spielraum.

MfG Spess

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.