mikrocontroller.net

Forum: Compiler & IDEs PWM am ATMega64 an Pin E3


Autor: Thomas Gulden (praio)
Datum:

Bewertung
0 lesenswert
nicht 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:
//in der main()-Funtion:

    DDRE = (1 << PE3); // Pin E7 == Ausgang
//PWM Mode 8: PWM, Phase and Freq. correct

  //==> WGM33 WGM32 WGM31 WGM30 COM3A1 COM3A0 CS32 CS31 CS30
  //      1     0     0     0      1      0     1    1    0

    TCCR3A = (1<<COM3A1);
    TCCR3B = (1<<CS32) | (1<<CS31) | (0<<CS30) | (1<<WGM33)| (0<<WGM32);
    
    while(1)
  {
  ICR3=255; // Zähler-Endwert
  OCR3A = 100; // Bei 100 sollte der Pegel an E7 auf "low" wechseln
        
        delay_ms(100);
        }


Was amche ich falsch?
Danke schonmal, Gruß Thomas

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas Gulden (praio)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Thomas Gulden (praio)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Thomas Gulden (praio)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Thomas Gulden (praio)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Irgend welche Ideen?

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

Oliver

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Gulden (praio)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: asd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.