AVR Assembler, LED-Dimmen

Gast #772168
Lesenswert?

Hallo, ich habe ein programm geschrieben, welches zwei leds über zwei 
Vergleichsregister (OCR1A/OCR1B) steuert/dimmt. Die LEDs fangen 
gleichzeitig an hinauf zu dimmen. Nun ab einen bestimmten Punkt 
verzögert eine LED um einen Schritt. Es wird nun sauber weiter hinauf 
gedimmt aber die eine LED ist natürlich einen Schritt später fertig. Ich 
habe OCR1A und OCR1B vertauscht und mir ist aufgefallen dass es nur bei 
OCR1A auftritt. Anschleißend habe ich einen neuen Atmega16 ausprobiert, 
das Problem ist geblieben. Nun komme ich nicht mehr weiter und bitte um 
Hilfe.
Angehängte Dateien:
#772183
Lesenswert?

>  out  OCR1AL,  DimWertL      ;gib DimWertL in OCR1AL aus
>  out  OCR1AH, DimWertH      ;gib DimWertH in OCR1AL aus
Du beachtest die Zugriffsreihenfolge beim Schreiben der Compare-Register 
nicht! Beim Schreiben von 16-Bit-Registern der Timer muss 
grundsätzlich das High-Byte zuerst geschrieben werden.
#772236
Lesenswert?

> aber er schreibt den high
> wert zuerst, soweit ich dass in AVR Studio überblickt habe.
Warum sagst Du nicht gleich, dass Du das im Simulator machst? Der 
Simulator hat einige Macken, was die 16-Bit-Timer angeht. Zitat aus der 
Hilfe:
"16-bit Timer/Counters on all devices have several problems with PWM, 
prescaler and output compare. Output compare registers are not buffered 
properly."
Gast #772241
Lesenswert?

Als ich die high werte zuerst geladen habe haben sich die led nicht 
sauber gedimmt. wenn ich die low werte zuerst lade dimmen sie sauber nur 
dass ocr1A mittendrin die Dimmstufen um einen Schritt verzögert ausgibt. 
Der ocr1B macht es sauber(geprüft auf dem Board). Es kann auch sein dass 
ich mehrere Fehler drin habe und sie sich so ausgleichen. Ich habe erst 
angefangen zu "programmieren"
Gast #772297
Lesenswert?

ja, schon aber die Abfolge der Helligkeiten der Leds ergiebt irgendwie 
keinen Sinn. Ich hab die werte auch umgedreht 2,4,8 usw. auch hierbei 
ist nichts brauchbares herrausgekommen. Im Internet habe ich auch 
gelesen dass das high Byte zuerst geladen werden muss. Andersherum gings 
eben bei mir besser :-D. Was ich überhaupt nicht verstehe, warum 
arbeiten im realen System OCR1A und OCR1B nicht "geich"
#772298
Lesenswert?

1
>   ldi   r16,  0x03          ;Z�hler setzen, jetz fangt er mit der
2
>   out   TCNT1H,  r16            ;Hauptschleife zu z�hlen an
3
>   ldi   r16,  0xFF
4
>   out   TCNT1L,  r16
Hat zwar vermutlich nix mit dem eigentlichen Problem zu tun, aber fiel 
mir grad noch so auf: Was soll das da? Warum lädst Du den Timer am 
Anfang vor?

Was Du da in der Hauptschleife machst, erschließt sich mir auch nicht so 
ganz...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren