Forum: Mikrocontroller und Digitale Elektronik Problem eines Anfängers


von Philippe (Gast)


Angehängte Dateien:

Lesenswert?

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

von Andreas D. (dandy)


Lesenswert?

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

von Philippe (Gast)


Lesenswert?

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

von Andreas D. (dandy)


Lesenswert?

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

von Philippe (Gast)


Lesenswert?

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