PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pwm mit Timer0



Rohbotiker
31.10.2008, 12:02
Hallo,

Ich möchte mit Timer0 ein Pwm Signal erzeugen, aber das scheint nicht hinzuhauen.
Nutzen tue ich folgende beiden Zeilen:

Config Timer0 = Pwm , Prescale = 1
Enable Interrupts
Enable Timer0
Ocr0 = 127

Scheint aber nicht zu gehen, der Pin B.0 bleibt immer auf Masse. Ich nutze einen Atmega162.

Sauerbruch
31.10.2008, 17:25
Im Datenblatt steht folgender interessanter Hinweis:

"However, note that the Data Direction Register (DDR) bit corresponding to the OC0 pin must be set in order to enable the output driver"

Probier´s also mal mit DDRB.0=1.

Ich habe aber auch schon manchmal mysteriöse Dinge im Zusammenhang mit Bascom und PWM erlebt - und bin eigentlich immer zum Ziel gekommen, wenn ich die (oder das) betreffende Register direkt beschrieben habe. Ist auch gar nicht sooo schwer zu verstehen!

Gutes Gelingen,

Daniel

pyr0skull
31.10.2008, 23:02
Das ist richtig, da muss noch Port B0 als Ausgang konfiguriert werden

Rohbotiker
01.11.2008, 10:55
OK, habe jetzt:

Config Portb.0 = Output
Config Timer0 = Pwm , Prescale = 1
Enable Interrupts
Enable Timer0
Ocr0 = 127

Aber gehen tuts immer noch nicht :|

Sauerbruch
01.11.2008, 14:14
Ich weiß nicht, ob der Timer automatisch anläuft, wenn man ihn als PWM konfiguriert. Versuch´s doch mal mit der Zeile

Start Timer0

statt

enable timer0
enable interrupts

(den Interrupt brauchst Du für PWM nicht).

Ansonsten kannst du das Timer/Counter-Control-Register TCCR0 auch direkt setzen. Für phasenkorrektes PWM mit einem Prescaler von 1 würde das etwa so gehen:

TCCR0 = &B01100001

(anstelle des Config timer0...)

Rohbotiker
01.11.2008, 14:46
Geht leider beides nicht, allerdings funktioniert in folgendem Code:


Config Portb.0 = Output
Config Portb.1 = Output
Config Timer0 = Pwm , Prescale = 1
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1
Enable Interrupts
Ocr0 = 127
Ocr2 = 127

Der Timer0 zwar nicht, dafür aber der Timer2, so das auch wirklich 2,5V messbar sind. Nehme ich aber das "Compare Pwm = Clear Up" bei Config Timer2 raus, funktioniert auch Timer2 nicht.
Da dachte ich mir, füge ich den Abschnitt doch auch bei Config Timer0 ein, geht aber nicht, wird nicht anerkannt.

Könnte es sein das im Regfile für den 162 sich vieleicht ein kleiner Fehler eingeschlichen hat?

stefan_Z
01.11.2008, 16:12
Manche Timer sind bei Bascom schwierig anzusteuern, weil abweichende Registernamen benutzt werden.
Gerne haben die auch einfach mal nen Fehler in der .def
Such dir im Datenblatt die entsprechenden Registernamen raus und setz die manuell. Das geht meist.
Um die PWM zu setzen muss man je nach Register dann halt auch verschiedene Namen nutzen.
Bei 16-Bit Timern gibts auch immer noch High und Low-Byte.

Rohbotiker
02.11.2008, 11:45
Hab jetzt die entsprechenden Register in der Def mit den im Datenblatt abgeglichen, konnte leider keine Fehler/Abweichungen finden.

Hat noch jemand eine Idee?

becki133
06.11.2008, 21:24
Hallo,
Zeig doch bitte mal deinen ganzen CODE.
Schaue am WE mal wie ich es gemacht habe .
Habe es bei einem Mega8 am laufen