Forum: Mikrocontroller und Digitale Elektronik PWM bei MEGA 88


von markus (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von markus (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von markus (Gast)


Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

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

von markus (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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

von Martin (Gast)


Lesenswert?

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ß

von Johannes M. (johnny-m)


Lesenswert?

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.

von Jörg X. (Gast)


Lesenswert?

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 ...

von markus (Gast)


Lesenswert?

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

von markus (Gast)


Lesenswert?

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!

von markus (Gast)


Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

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)

von markus (Gast)


Lesenswert?

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

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.