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.
> 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.
da ist irgendwie nichts gescheites rausgekommen. Ich habe auch
nachgeschaut, ich kanns mir nicht erklären aber er schreibt den high
wert zuerst, soweit ich dass in AVR Studio überblickt habe.
> 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."
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"
Stefan wrote:
> hast du icq?> dann könnte ich dir das im video zeigen
Nein, hab ich nicht. Hast Du es mittlerweile noch mal im realen System
ausprobiert?
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"
> 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...
Stefan wrote:
> ohne diesen vers fangen die leds nicht "sauber" an,
^^^^
Vers? Als Gedicht oder gar Lied würde ich das Programm aber nicht
bezeichnen...;-)