Hallo zusammen!
Ich befasse mich seit einiger Zeit mit dem Mega88 und nun möchte ich
mich mit der PWM auseinandersetzten.
Ich möchte den 8-bit Zähler 0 dafür verwenden. Ich betreibe den µC mit
13,56MHz.
Der Port PD6 soll in einer gewissen Zeit ein und aus geschaltet werden.
habe einfach mal 127 als Obergrenze vorgegeben.
Aus dem Datenblatt habe ich bereits folgende Einstellungen übernommen
OCR0A - Endstand bis zu dem gezählt werden soll, 127
Im TCCR0A Register habe ich COM0A1 auf eins gesetzt um ein nicht
invertierendes Signal zu erhalten.
Auch habe ich im TCCR0A Register WGM00 und WGM01 auf eins gesetzt (und
WGM02 im TCCR0B) um eine FAST PWM im Modus 7 zu erhalten.
Im TTCR0B Register habe ich noch CS00 auf eins gesetzt um den Zähler
ohne Prescalar zu starten.
Zum Schluss habe ich noch das Datenrichtungsregister zu PD6 auf eins
gesetzt um einen Ausgang zu bekommen.
Der Zähler zählt auch zu der von mir vorgegebenen Grenze und fängt dann
auch wieder von vorne an. Nur bekomme ich keine Änderung an meinem Pin
PD6!
Habe ich noch etwas vergessen zu aktivieren?
Im Tutorium habe ich auch nichts passendes gefunden.
Vielen Dank schon mal für euere Antworten!
markus
@ markus (Gast)
>Habe ich noch etwas vergessen zu aktivieren?
Ja, du musst noch die Output Compare Funktion auf das Pin schalten. Ist
in den Steuerregistern drin (OFF, normal, invertiert).
MFG
Falk
Hallo Falk!
Erstmal vielen Dank für deine rasche Antwort!
Nur zum Verständnis:
Habe ich das nicht schon indem ich COM0A1 (Compare Output Mode für Fast
PWM) auf eins gesetzt habe? Im Datenblatt steht dazu "clear OC0A on
comapare match, set OC0B at BOTTOM, (non inverting mode)"
Müsste doch funnktionieren. Mir ist momentan erst mal egal ob das Signal
invertierend ist oder nicht. Nur funktionieren sollte es.
Oder hab ich dich jetzt falsch verstanden?
gruss
@ markus (Gast)
>Habe ich das nicht schon indem ich COM0A1 (Compare Output Mode für Fast>PWM) auf eins gesetzt habe? Im Datenblatt steht dazu "clear OC0A on>comapare match, set OC0B at BOTTOM, (non inverting mode)">Müsste doch funnktionieren. Mir ist momentan erst mal egal ob das Signal>invertierend ist oder nicht. Nur funktionieren sollte es.
Stimmt, hab ich wohl übersehen.
MfG
Falk
vielleicht hilft es ja wenn ich mal meinen codeschnipsel hier dazu hänge
ldi r16, (1<<WGM00)|(1<<WGM01)|(1<<COM0A1) ;
out TCCR0A, r16
ldi r16, (1<<WGM02)|(1<<CS00)
out TCCR0B, r16
ldi r16, 0x7F
out OCR0A, r16
ldi r16, 0b11111110
out DDRD, r16
ldi r16, 0xFF
out PORTD, r16
Ups...
in Mode 7 ist OCR0A der TOP-, und NICHT der Compare-Wert.
Probier doch mal Mode 3 (8-Bit FastPWM). Oder steig auf den Pin OC0B um
und setz auch das Register OCR0B.
hth. Jörg
Danke Jörg für deine Antwort!
Ich möchte ja, dass der Pin PD6 mit OC0A verbunden wird und an diesem
Pin das PWM Signal an- und ausgeschaltet wird.
Im Datenblatt habe ich gelesen, dass dies nur für OC0A möglich ist, also
nur für PD6 und nicht für OC0B.
Ja, ich möchte den TOP Wert verwenden, da man ja nur hier variable Werte
eingeben kann. Beim Mode 3 würde er mir ja bis 0xFF zählen.
Verstehe ich etwas falsch?
Also irgendwie werde ich aus den Datenblättern nicht schlauer...
Meiner Meinung dürfte ich alles gemacht haben was im Datenblatt ab seite
89 bis 108 steht.
Hab keine Ahnung mehr...
schönen Tag noch!
Markus
@ markus (Gast)
>Ja, ich möchte den TOP Wert verwenden, da man ja nur hier variable Werte>eingeben kann. Beim Mode 3 würde er mir ja bis 0xFF zählen.>Verstehe ich etwas falsch?
Ja. Es gibt bei der PWM zwei Werte. Der erste legt den Zählbereich von
0...TOP fest, der zeite den Compare Wert, bei dem der Ausgang schaltet.
Benutze wie vorgschlagen WGM Modus 3 und staune.
MFG
Falk
Joa ich denke auch dass Mode7 korrekt ist.
Kenn mich da im Assembler nicht wirklich aus, hast du mal versucht bei
compare in einen interupt zu springen der den Port dann toggelt?
Vielleicht klappts so und du kommst dann Schrittweise an deine Lösung
ran...
Gruß
Mit variablem TOP-Wert geht es nur mit OC0B, wie Jörg schon richtig
angedeutet hat! Der variable TOP-Wert kann nur in OCR0A stehen, wie
anhand der Tabelle leicht ersichtlich ist. In dem Fall muss dann OCR0B
für den Compare-Wert genommen werden, und dementsprechend auch der
Ausgangspin OC0B (PD5). Mit OCR0A als Compare-Wert geht nur Fast-PWM mit
0xFF als TOP.
Vielleicht ist das (noch) nicht ganz klar geworden:
- der TOP-Wert bestimmt den Maximalwert und damit die Frequenz
(0xFF(8Bit)-> 256 Stufen;, z.B. 0x7F -> 128 Stufen)
- der Compare-Wert bestimmt den Tastgrad
D.h. der Timer zählt BIS TOP (bei FastPWM) und schaltet auf dem Weg
dahin - wenn COMP erreicht ist - den Pin an/aus/um (je nach OCnx
Einstellung)
hth. Jörg
ps.: Logischerweise kann an NICHT beides mit dem selben Register
einstellen ...
vielen dank na alle!
so langsam kommt ein wenig licht ins dunkle.
werde die vorschläge gleich mal umsetzten!
danke nochmal und schönes wochenende!
markus
heureka!!
so jetzt funktioniert es endlich.
Habe einfach WGM02 aus dem TCCR0B nicht gesetzt und schon schaltet er
mir den Pin hin und her...
nochmals herzlichen Dank!
jetzt ist ein anderes Problem aufgetreten.
Ich wollte die Timer/Counter Overflow Interrupt TOIE0 aktiviern, doch
wenn ich das entsprechende Bit setze und dann assembliere kommt folgende
Fehlermeldung:
error: Operand 1 out of range: 0x6e
folgendes habe ich geschrieben um das Bit zu setzen:
ldi r16, (1<<TOIE0)
out TIMSK0,r16
weiss da wer bescheid?
vielen dank schon mal!
markus
TIMSKn ist bei den AtmegaX8 im Speicher hinter dem SREG, da kannst du
keine in/out mehr benutzen, nur noch lds/sts (und natürlich auch
ld/ldd/st/std) -- da sind ein paar Codebeispiele im Datasheet verkehrt
:-(
hth. Jörg
(bei SREG -> 0x3f(0x5f)und bei 0x20(0x40) ist im Register-Summary eine
dicke schwarze Liniedeswegen)
das hatte ich mir schon fast gedacht...
hatte auch in der AP-Note "Replacing mega8 by mega88" nachgesehen, aber
nix gefunden. hatte da was im hinterkopf aus einigen beiträgen hier im
forum...
danke und gruss