Forum: Mikrocontroller und Digitale Elektronik 3xPWM Mega32


von Phil J. (sunflower_seed)


Lesenswert?

Hallo,
ich versuche seit einiger Zeit drei 8-bit Hardware-PWMs mit nem AVR 
hinzubekommen.
Angesteuert werden sollen LEDs, später am besten noch per UART, aber das 
ist im Moment unwichtig.
Viel wichtiger ist für mich die Frage, wie ich diese bescheuerten 
Register setzten muss um die drei PWMs (Timer1A, Timer1B und Timer2) zum 
laufen zu kriegen und mit welchem Befehl ich die Compare-Werte zuweisen 
muss.
Meine Versuche sehen bis jetzt so aus:

Das ganze soll für einen MEGA32 sein.
1
//Ziel: 8-bit PWM, Prescaler = 256, Ausgabe: nicht-invertierend
2
3
TCCR1A = (0<<WGM13)|(1<<WGM12)|(0<<WGM11)|(1<<WGM10); //8-bit, fast-pwm
4
//TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<WGM11)|(1<<WGM10);
5
6
TCCR1A = (1<<COM1A1)|(0<<COM1A0); //nicht-invertierend
7
TCCR1A = (1<<COM1B1)|(0<<COM1B0); //nicht-invertierend
8
9
10
TCCR2 = (1<<WGM20)|(1<<WGM21); //fast-pwm
11
TCCR2 = (1<<COM21)|(0<<COM20); //nicht-invertierend
12
TCCR2 = (1<<CS22)|(1<<CS21)|(0<<CS20); //prescaler: 256

von Johannes M. (johnny-m)


Lesenswert?

Phil J. wrote:
> TCCR1A = (0<<WGM13)|(1<<WGM12)|(0<<WGM11)|(1<<WGM10); //8-bit, fast-pwm
>> TCCR1A = (1<<COM1A1)|(0<<COM1A0); //nicht-invertierend
>> TCCR1A = (1<<COM1B1)|(0<<COM1B0); //nicht-invertierend
>
> TCCR2 = (1<<WGM20)|(1<<WGM21); //fast-pwm
>> TCCR2 = (1<<COM21)|(0<<COM20); //nicht-invertierend
>> TCCR2 = (1<<CS22)|(1<<CS21)|(0<<CS20); //prescaler: 256
Was glaubst Du, was in den blau hervorgehobenen Zeilen mit dem passiert, 
was Du vorher (in den grünen Zeilen) in das jeweilige Register 
geschrieben hast?

Schau mal ins AVR-GCC-Tutorial und in den Artikel 
Bitmanipulation

von Phil J. (sunflower_seed)


Lesenswert?

Autsch, ja!
Aber ich vermute mal das wird nicht der einzige Fehler sein....

von Johannes M. (johnny-m)


Lesenswert?

Phil J. wrote:
> Autsch, ja!
> Aber ich vermute mal das wird nicht der einzige Fehler sein....
Denke ich auch.

Dir ist möglicherweise auch nicht klar, dass man eine 0 soviel durch die 
Gegend schieben kann, wie man will, es bleibt eine 0. Die ganzen "0 << 
IRGENDWAS" machen gar nichts bzw. sind schlicht und ergreifend 0.

Und wenn ein Wert mit einer Null verODERt, dann passiert tatsächlich gar 
nichts.

x | 0 == x

...

von Phil J. (sunflower_seed)


Lesenswert?

Sooo, das mit dem 0 Schubsen hab ich nur gemacht, weil ich nach dem 
Datenblatt gegangen bin.
Hab das ganze jetzt aufgeräumt, funktioniert perfekt :-)
1
DDRD = 0xff;         
2
DDRA = 0xff;
3
DDRB = 0xff;
4
  
5
TCCR1A = (1<<COM1A1)|(1<<WGM12)|(1<<WGM10)|(1<<COM1B1);
6
TCCR1B = (1<<WGM12)|(1<<WGM10);
7
TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|(1<<CS22)|(1<<CS21);
8
9
OCR1AL = 0;
10
OCR1BL = 0;
11
OCR 2 = 0;

Jetzt habe ich aber noch ein anderes Problem, ich versuche via UART zu 
schreiben und zu lesen.
Schreiben klappt auch schon ohne große Probleme.
Ich möchte jetzt aber auch ganz gerne Werte einlesen.
Jetzt würd ich gerne wissen, wie das am intelligentesten geht.
Im Prinzip brauch ich die Möglichkeit 3 Werte zu übertragen.
Erste Experimente mit dem Empfangen eines Zeichens aus dem avr-gcc 
Tutorial waren auch schon mehr oder weniger erfolgreich:
Irgendwas kommt definitiv an, aber ich kann nicht wirklich was steuern.
Jetzt stelle ich mir die Frage, was überhaupt passiert, wenn ich in 
Hyptererm (...) eine Taste drücke - kommt dann der ASCII-Wert am AVR an?
Wie würde eine intelligente Auswerteschleife aussehen?

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.