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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.