PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FAST-PWM - 8 Bit Timer Atmega644 - kein Signal?



Manu_91
10.02.2009, 20:34
Hallo zusammen :)
Ich habe ein kleines Problemchen bei der Erzeugung eines PWM Signals...
Ich habe mich in den letzen 2 Tagen viel mit PWM-Tutorials und dem Datenblatt meines Atmega644 auseinandergesetzt und mir ein gewisses Grundverständnis der Register und Bits erarbeitet, bin allerdings noch nicht ganz so sicher im Umgang mit den Timern, was sich darin äußert, dass an den Pins OC2B und OC2A (welche zu den Enables des Motortreibers führen) absolut nichts tut.
Auch Messungen mit dem Oszilloskop haben nichts ergeben.

Es liegt offenbar an meinem Code...
Ich poste hier erstmal die Funktion, in der alle PWM-spezifischen Einstellungen getroffen werden (Richtungsregister werden in "main()" eingestellt):


//In dieser Funktion werden alle PWM-spezifischen Einstellungen getroffen
void initPwm()
{
//---------Timer2-Settings------------//
//Mode: Fast PWM //
//Prescaler: F_CPU / 32 (ca. 2,4kHz) //
//Ausgangsport: Clear at CompareMatch //
//------------------------------------//
TCCR2A = (1<<COM1A1) | (1<<WGM20) | (1<<WGM21);
TCCR2B = (1<<CS20) | (1<<CS21) | (1);
//Vergleichswert einstellen
//Linker Motor:
OCR2A = 200;
//Rechter Motor:
OCR2B = 50;
}


und hier nochmal mein gesamter bisheriger Code, um die Funktion im Gesamtkontext zu betrachten:

klick mich klick mich (http://nopaste.com/p/a4EGcDrfkb)

Ich bin sowiso ein "Neueinsteiger" was µCs angeht und mit den Timer-Funktionen, wie erwähnt, noch unsicher und im Moment leider nicht in der Lage den Fehler zu finden, fände es also Klasse wenn mir hier jemand auf die Sprünge helfen würde.

Vielen Dank schonmal im Vorraus an alle die mir helfen und einen schönen Abend noch euch allen ;)

Manu_91
11.02.2009, 14:16
Ich erwarte jetzt nicht, dass jemand meinen kompletten Code studiert um mir den exakten Fehler zu schildern, ich würde mich jedoch freuen, wenn mir jemand Tipps geben könnte, wo ich vielleicht in erster Linie nach Fehlern suchen sollte und was, abgesehen vom Code, evtl. noch für das Problem verantwortlich sein könnte :)

Danke :)

McJenso
11.02.2009, 15:21
Hallo,

hatte mir schon deinen Code angeschaut aber keine gravierenden Sachen entdeckt.

TCCR2A = (1<<COM1A1) | (1<<WGM20) | (1<<WGM21);
Hier fehlt COM2B1 und du solltest COM2A1 nehmen, auch wenn der Wert der gleiche ist.
TCCR2B = (1<<CS20) | (1<<CS21) | (1);
Mit der letzten 1 änderst du noch einmal den Prescaler.
Das ist aber alles keine Erklärung dafür, das gar nichts funktioniert.
Du probierst das Programm aber schon auf einem Chip aus und nicht nur im Simulator? So wie ich gelesen habe, gibt es da Probleme mit dem Timer2 PWM beim AtMega644.
Was mir mal einen üblen Streich gespielt hat, war das WDTON Fusbit. Am Ausgang konnte ich mit dem Oszi ganz klar ein PWM Signal sehen. Nur das Tastverhältnis passte nicht. Irgendwann ist mir dann mal aufgefallen, dass mir immer ein Reset das Signal versaut.
Ich würde jetzt hergehen, die Ausgängse statisch setzen. Dann über das TCNT Register prüfen, ob der Timer läuft. Mal mit CTC einen Takt ausgeben und hoffen das mich der Fehler irgendwann anspringt :-)

Gruß

Jens

Manu_91
11.02.2009, 16:34
Erstmal viele Dank für deine Hilfestellungen ;)

^^ ja ehhm dass ich mit (1) in TCCR2B den Wert des Prescalers wieder ändere, ist mir bewusst, die Änderung diente auch lediglich zu "Testzwecken" und ich vergaß sie rückgängig zu machen - aber trotzdem danke für den Hinweis! das hätte wahrscheinlich auch wieder einen Bug verursacht, den ich nicht auf Anhieb gefunden hätte :D

Ja ich probiere das Programm auf dem Chip aus und die "normalen" IOs funktionieren auch.

Die Fusebits überprüfe ich jetzt erstmal!
Gleich melde ich mich, ob ich der Lösung für das Problem näher gekommen bin :)

Manu_91
11.02.2009, 17:36
Hallo ich bins wieder :)

JENS, der Fehler hat mich gerade ANGESPRUNGEN! :D

eigentlich peinlich aber nungut... Anfängerfehler ^^
Wegen einer kleinen Umstrukturierung meines Projektordners habe ich den Output-Pfad für die hex-File ändern müssen, im Programmdialog war aber noch der alte eingestellt, somit wurde der µC jedesmal mit einer alten version des Programms geflasht :D

naja - aus Fehlern lernt man ^^ jetzt funktioniert jedenfalls alles!

Danke nochmal für die Tipps!