Hallo zusammen Ich habe mit Assembler und Atmel Mikrocontroller angefangen und bin noch ziemlicher Neuling. LED An/Aus, Taster einlesen und solche Dinge habe ich bereits gemacht und verstanden. Heute habe ich mich an PWM mittels Timer rangemacht. In dem Tutorial von euch verstand ich ziemlich schnell wie das mit dem Hardware PWM geht. Also musst auch das Software PWM einmal ausprobiert werden. Deshalb habe ich einmal das Software PWM mit 6 LEDs abgeschrieben (nicht kopiert) und hat auch auf anhieb funktioniert. Jedoch habe ich 3 Frgaen zum Assembler Code. Frage 1 Wieso kann man die Helligkeitswerte von ocr_1 bis ocr_6 nur von 0..127 einstellen? Es ist doch ein 8bit Timer? Frage 2 Beim Unterprogramm "WorkPWM" gibt es den Befehl ori Dieser Befehl verknüpft mittels logisch ODER den Wert mit dem Register, aber was hat der Wert $01 im Code für einen Zweck? Frage 3 Ich habe den Code komplett abgeschrieben und mit mehr Komentaren verschönert. Könnt Ihr kurz einen Blick auf diese werfen und mir sagen ob es i O ist? Ich programmiere mit dem AVR Studio 4 und dem STK500. Der Mikrocontroller ist ein Atmega 8 mit 4MHz internem Takt. Als Anhang habe ich den Assembler Code als Text File. Kann aber auch asp File nachreichen. Danke für eure Hilfe
Philippe schrieb: > Frage 1 > Wieso kann man die Helligkeitswerte von ocr_1 bis ocr_6 nur von 0..127 > einstellen? > Es ist doch ein 8bit Timer? Es geht auch bis 255, aber als normalsterblicher merkt (sieht) man die höhere Auflösung kaum, desweiteren müsste die PWM Frequenz entsprechend erhöht werden, dass nix flackert, was wiederum erheblich den Prozessor beschäfigt und eben weniger resourcen für das restliche programm bedeutet, da mit zunehmender Auflösung die cpu zunehmend nur mit der pwm geschichte beschäftigt ist. Philippe schrieb: > Frage 2 > Beim Unterprogramm "WorkPWM" gibt es den Befehl ori > Dieser Befehl verknüpft mittels logisch ODER den Wert mit dem Register, > aber was hat der Wert $01 im Code für einen Zweck? ORI $01, $02, $04, $08.... dreht jewils die bits der entsprechenden stellen um (kanal) wenn der vorgegebene PWM Wert erreicht wurde, oder höher ist. Philippe schrieb: > Frage 3 > Ich habe den Code komplett abgeschrieben und mit mehr Komentaren > verschönert. Könnt Ihr kurz einen Blick auf diese werfen und mir sagen > ob es i O ist? Was die einzelnen Befehle machen hast du ja einigermassen verstanden. Aber denke nochmal über deren Bedeutung in Bezug auf diese PWM Funktion nach und versuchs nochmal :-))) Gruß, Andy
Hallo Andreas, ich danke für die schnelle Antwort. Das mit den 0..127 ist jetzt auch klar. Bei 255 wäre die PWM Frequenz ja deutlich sichtbar. Dachte gar nicht mehr daran. Bei der zweiten Antwort Andreas Denk schrieb: > ORI $01, $02, $04, $08.... dreht jewils die bits der entsprechenden > stellen um (kanal) wenn der vorgegebene PWM Wert erreicht wurde, oder > höher ist. Meinst du das z. B. bei ori $01, wenn der Wert von ocr_1 erreicht wurde, das Bit von 0 auf 1 gedreht wird oder was genau? Verstehe leider noch nicht ganz was der Sinn dieses Befehls ist.:( Wahrscheinlich ist die Frage jetzt etwas doof. Gruss
Schau dir mal den Code an...
WorkPWM:
ldi temp, 0b11000000
Bei jedem Durchlauf werden in dem Ausgabebyte die "Kanalbits" erst mal
auf 0 gesetzt. Danach wird der "Durchlaufzähler" (PWMCount) mit dem
geweiligen OCR Wert verglichen.
cp PWMCount, ocr_1
brlo OneOn
ori temp, $01
Solange der Zähler kleiner ist als der OCR Wert passiert gar nix, das
heisst, so lange bleibt der "Kanal" ausgeschaltet.
Erreicht der Zähler den OCR Wert oder ist höher wird das jeweilige Bit
durch den Befehl ORI temp, $01 ( Also das erste Bit ) ($02 wäre das 2.
Bit, $04 wäre das 3. Bit.. usw ) umgedreht, wechselt also von 0 auf 1.
Dieses bleibt so lange 1 bis zum Ende (also wenn die 128 erreicht
wurden) Der "Kanal" ist also für die restliche Zeit eingeschaltet. Das
ist dieses PULS/PAUSE Verhältnis, woraus PWM ja eigentlich besteht.
Anders gesagt, Hast du eine OCR Wert von zB. 5, wäre der "Kanal" 5
Durchläufe 0, also aus und 122 Durchläufe 1, also eingeschaltet. Er ist
also länger ein, als aus, wodurch die Helligkeit einer LED Heller
erscheint.
Umgekehrt hast du einen OCR Wert von 122, dann sind 122 Durchläufe die
LED aus und 5 Durchläufe ein, wodurch die LED dunkler erscheint.
( Das hängt natürlich auch wieder davon ab wie herum man die LED an den
jeweiligen Pin anschliesst. Gegen GND oder gegen VCC )
$80 $40 $20 $10 $8 $4 $2 $1
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
Gruß, Andy
Hallo Andreas Na das nen ich einmal eine Erklärung. Danke dir wirklich viel mal:-) Jetzt probier ich einmal ein paar weitere PWM Projekte. 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.