Forum: Mikrocontroller und Digitale Elektronik PWM mit ATMega8535


von sascha11 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.

Folgendes Problem habe ich. Das Programm soll sich irgendwanneinmal zu 
einer Mondlichtsimulation mit drei LEDs weiterentwickeln. Da ich noch 
ziemlich am Anfang stehe was uC Programmierung betrifft gabe ich mal so 
angefangen wie im Code.

Ziel ist, das immer eine LED hoch und wieder runterdimmt und dann die 
nächste.

Das funktioniert ,mit den beiden, die an OC0 und OC2 hängen auch ganz 
gut. Nur die LED an OC1A leuchtet dauerhaft und dimmt nicht hoch oder 
runter. Zu erwähnen ist noch, dass die Schaltung testweise auf dem STK 
500 läuft.Taktfrequenz liegt bei (MHz über Quarz auf dem Board. 
Vielleicht kann mir jemand helfen? Vielen Dank schonmal im Vorraus

von remo (Gast)


Lesenswert?

Timer 0 + 2 sind 8bit counter, Timer 1 ist ein 16 bit counter.
Das OCR1A register ist auch ein 16bit register.
Das high und low byte müssen in der richtigen Reihenfolge geschrieben 
werden.
Ich weiß nicht was der Compiler draus macht, wenn du diesem register 
einen 8bit Wert zuweist.
Schau dir mal im Datenblatt den Unterscheid im PWM Verhalten des Timer 1 
im Vergleich zum Timer 0 oder 2 an.
Ich vermute mal dein Problem liegt irgendwo dort begraben.
Viel Glück
Remo

von Karl H. (kbuchegg)


Lesenswert?

> TCCR1A = 1<< WGM10 | 1<<WGM11 | 1<<WGM13 |


Das ist der Phase Correct MOdus der PWM. In diesem Modus hat OCR1A eine 
Sonderfunktion, nämlich den TOP Wert anzugeben.

Siehe Datenblatt Seite 112, Tabelle 48

verwende den Modus 5 (Fast PWM, 8 Bit) und deine LED wird sich normal 
verhalten. Modus 5 ist: WGM10 und WGM12 setzen (siehe gleiche Tabelle 
aus gleichem Datenblatt)


Die Sache mit dem 16 Bit Register kannst du vergessen. Das erledigt der 
COmpiler schon richtig. (Dazu programmieren wir ja in C, damit wir uns 
um solche Kleinigkeiten nicht kümmern müssen)


Edit: Das setting der COM Bits hab ich jetzt nicht kontrolliert, wie die 
bei Fast PWM sein müssen. Tabelle 46 ist dafür zuständig.

von sascha11 (Gast)


Lesenswert?

Hallo nochmal,

es funktioniert leider immer noch nicht. Die LED rührt sich nach wie vor 
nicht.

Betreffende Zeile sieht jetz so aus:



TCCR1A = 1<< WGM12 | 1<<WGM10 | 1<< CS11 | 1<< CS10  | 1<< COM1A0;
OCR1A = 0;

Ich habs auch mit zusätzlich 1<<COM1A1 versucht es ändert sich nur das, 
dass die LED dann am Anfang an ist. Jetzt ist sie aus.

Habt ihr vielleicht noch nen Tip?

Vielen Dank!

von sascha11 (Gast)


Lesenswert?

Hat keiner noch ne Idee?

von spess53 (Gast)


Lesenswert?

Hi

>TCCR1A = 1<< WGM12 | 1<<WGM10 | 1<< CS11 | 1<< CS10  | 1<< COM1A0;

WGM12 und WGM10 liegen nicht im gleichen Register. CS11/10 und COM1A0 
auch nicht. Lies das Datenblatt.

MfG Spess

von sascha11 (Gast)


Lesenswert?

Ja ja wer lesen kann ist klar im Vorteil. Jetzt gehts. Danke nochmal.

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.