Forum: Compiler & IDEs PWM am ATMega64 an Pin E3


von Thomas G. (praio)


Lesenswert?

Hallo,

beim Versuch ein PWM-Signal auf dem ATMega64 auszugeben habe ich das 
Problem, dass einfach nichts aus dem entsprechenden Pin rauskommt.
Habe auch schon mehrere Foreneinträge gelesen, kann aber meinen Fehler 
einfach nicht finden. Hier der Code:
1
//in der main()-Funtion:
2
3
    DDRE = (1 << PE3); // Pin E7 == Ausgang
4
//PWM Mode 8: PWM, Phase and Freq. correct
5
6
  //==> WGM33 WGM32 WGM31 WGM30 COM3A1 COM3A0 CS32 CS31 CS30
7
  //      1     0     0     0      1      0     1    1    0
8
9
    TCCR3A = (1<<COM3A1);
10
    TCCR3B = (1<<CS32) | (1<<CS31) | (0<<CS30) | (1<<WGM33)| (0<<WGM32);
11
    
12
    while(1)
13
  {
14
  ICR3=255; // Zähler-Endwert
15
  OCR3A = 100; // Bei 100 sollte der Pegel an E7 auf "low" wechseln
16
        
17
        delay_ms(100);
18
        }

Was amche ich falsch?
Danke schonmal, Gruß Thomas

von Stefan E. (sternst)


Lesenswert?

In diesem Code kann ich keinen Fehler sehen.
Gibt es noch weiteren Code? Benutzt du den Port E vielleicht noch für 
was anderes und überschreibst dort die DDR-Einstellung?

von Thomas G. (praio)


Lesenswert?

Nein, Port E ist komplett offen, nur das Oszi hängt an E3 und der Pegel 
ist dauerhaft auf 0V ... werde es mal auf einem anderen Testboard 
probieren, vielleicht ist der E3 schon "vorgeschädigt"; immerhin weiss 
ich jetzt dass mein Code stimmt!

Danke!

von Thomas G. (praio)


Lesenswert?

So, habe die TCCR3x - Zeilen mal auskommentiert und Pin E7 abwechselnd 
High und Low zugewiesen, das funktioniert! Das DDR wird also rihtig 
gesetzt und auch der Ausgangstreiber des ATMegas ist in Ordnung.
Ansonsten habe ich mittlerweile alles auskommentiert, nur noch die 
Initialisierung der PWM-Register (also TCCR§A, B) und die Wertzuweisung 
an ICR3 und OCR3A sind im Code.
Habe testweise auch mal OCR3C (also Pin PE5) getestet, da passiert auch 
nichts.
Gibt es noch ein Bit mit dem ich den Timer einschalten muss o.ä.? Oder 
einen Interrupt den ich freischalten muss?

von Stefan E. (sternst)


Lesenswert?

Du mixt hier mehrfach E3 und E7. Du misst nicht zufällig nur am falschen 
Pin, oder?

von Thomas G. (praio)


Lesenswert?

Sorry, hab mich vertippt. Da ich ausschließen wollte dass es ein Fehler 
an Pin PE3 ist habe ich die PWM über OCR3C, also PE5 (nicht 7) 
asugegeben, was aber auch fehlgeschlagen ist. Mittlerweile sind LEDs an 
PE3, PE4 und PE5 um zu vermeiden, dass das Oszi am falschen Pin 
angeschlossen ist ;-)

von Thomas G. (praio)


Angehängte Dateien:

Lesenswert?

Ich habe nun mal mein Programm im Simulator laufen lasen, dabei habe ich 
das in der Grafik gezeigte Problem:
Die Werte für TCCR3A und B werden korrekt in die zugehörigen Register 
geschrieben, der Wert für Register OCR3A jedoch nicht!
Irgend welche Ideen?

von Oliver (Gast)


Lesenswert?

>Irgend welche Ideen?

Tipp mal "AVRStudio OCr3a Problem" in die Suchmaschine deines 
Vertrauens...
Selbst Atmel schafft es nicht, fehlerfreie Simulatoren zu basteln.

Oliver

von Stefan E. (sternst)


Lesenswert?

Hast du auch lange genug Simuliert? Denn ein neuer OCR-Inhalt wird beim 
PWM-Modus nicht sofort übernommen, sondern nur an bestimmten Stellen im 
Zählerablauf.

von Thomas G. (praio)


Lesenswert?

Hmm ok habe gerade ein paar Artikel gelesen die den Simulator-Bug 
beschreiben.
Ich werde das mit der PWM wohl am Wochenende nochmal probieren; mit 
etwas Glück kann ich den ATMega64 als ATMega32 flashen (überall 32 
einstellen; das Projekt braucht nur mit der PWM-Initialisierung ja kaum 
Flash) und dann  mit dem AVR Dragon als Debugger schauen was mit den 
Registern passiert.
Trotzdem Danke für die Hilfe!

von asd (Gast)


Lesenswert?

hast du zufaellig noch das M103C-Fuse gesetzt? der atmega64 wird so 
ausgeliefert und verhaelt sich dann wie ein atmega103, dann 
funktionieren die timer glaube ich anders... ist aber nur eine 
vermutung...

von Thomas (Gast)


Lesenswert?

So, habe den Code aus
Beitrag "PWM mit ATMEGA128 funktioniert nicht"
ausprobiert, damit geht es.
Trotzdem nochmal vielen Dank für die Hilfe!

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.