Forum: Mikrocontroller und Digitale Elektronik 16 Bit Vergleich beim ATmega88PA (zwecks PWM)


von Freddy (Gast)


Lesenswert?

Hallo allerseits,

ich stehe augenblicklich vor einem Problem: Ich bin dabei mir eine 
4-Kanal (4x RGB, also 12 geschaltete Ausgänge) RGB-LED Steuerung zu 
bauen. Dazu verwende ich auf einem ATmega88PA (4,096 MHz externer Quarz) 
den Timer0 Compare Match A Interrrupt, der einen Zähler hochzählt und 
jedesmal den aktuellen Zählerstand mit den jeweils eingestellten 
Schwellwerten vergleicht und den entsprechenden Ausgang an oder 
abschaltet. Compare Match deswegen, weil ich so die Frequenz der PWM 
etwas regeln kann.
Soweit funktioniert das auch ganz gut - Verschiedene statische Farben 
funktionieren und einen Fading-Effekt habe ich auch hinbekommen.

Jedoch zeigt sich bei diesem ein Problem: Ich arbeite natürlich mit 
einem Register für den Zähler, womit meine Schaltwerte also immer 
zwischen 0 und 255 liegen. Dadurch lassen sich "relativ" wenige 
Dimmwerte realisieren (da ja auch noch nicht linear) und man sieht vor 
allem bei niedrigen Helligkeitsstufen die Sprünge zwischen den Stufen, 
anstatt einen sanften Übergang zu erzielen!

Es bleibt also wahrscheinlich nichts anderes als statt mit 8 Bit mit 16 
Bit zu arbeiten, jedoch sind meine Kenntnisse hier am Ende (ich würde 
mich durchaus noch als Anfänger bezeichnen)

Ist es überhaupt möglich auf einem ATmega88 16 Bit Vergleiche 
durchzuführen? Oder hat jemand eine bessere Idee wie ich das Problem 
umgehen könnte?
Ich wäre für jede Hilfe dankbar. Achja ich programmiere in Assembler im 
dem AVR Studio.

von Falk B. (falk)


Lesenswert?

@  Freddy (Gast)

>Ist es überhaupt möglich auf einem ATmega88 16 Bit Vergleiche
>durchzuführen?

Sicher.

AVR-Tutorial: Arithmetik

> Oder hat jemand eine bessere Idee wie ich das Problem
>umgehen könnte?

Siehe Soft-PWM und LED-Fading, ist aber in C.

MfG
Falk

von Freddy (Gast)


Lesenswert?

Hm nun die genannten Artikel habe ich mir auch schon zumindest 
angesehen. Aber wie gesagt ich bin nun erst Anfänger und wirklich sehr 
viel schlauer war ich danach auch nicht. :)

Kann ich denn nach einem im Arithmetik-Artikel beschriebenen 16-Bit 
vergleich einfach mit den alten Befehlen (z.B. brsh, brlo, breq....) 
arbeiten? (sorry, warscheinlich ne doofe Frage)

Und noch etwas recht triviales: Der ATmega88 kennt ja nun adiw und sbiw 
wenn ich z.B. "adiw r16, 1" angebe, steht das Ergebnis dass in r16 und 
r17? Und welches wird dann als höherwertiges Bit genommen? (ein 
einfaches inc gibt es für zwei Register ja nicht!?)

von Falk B. (falk)


Lesenswert?

@  Freddy (Gast)

>Kann ich denn nach einem im Arithmetik-Artikel beschriebenen 16-Bit
>vergleich einfach mit den alten Befehlen (z.B. brsh, brlo, breq....)
>arbeiten?

Ja.

>Und noch etwas recht triviales: Der ATmega88 kennt ja nun adiw und sbiw
>wenn ich z.B. "adiw r16, 1" angebe, steht das Ergebnis dass in r16 und
>r17? Und welches wird dann als höherwertiges Bit genommen?

R17, steht in der Doku der Assemblerbefehle. Aber der Befehl geht nur 
mit R24-R31.

von spess53 (Gast)


Lesenswert?

Hi

>Kann ich denn nach einem im Arithmetik-Artikel beschriebenen 16-Bit
>vergleich einfach mit den alten Befehlen (z.B. brsh, brlo, breq....)
>arbeiten? (sorry, warscheinlich ne doofe Frage)

Ja. Aber wozu braucht man brsh oder brlo? Die erzeugen den gleichen Code 
wie brcc bzw. brcs. Sind also nur Synonyme.



>Und noch etwas recht triviales: Der ATmega88 kennt ja nun adiw und sbiw
>wenn ich z.B. "adiw r16, 1" angebe, steht das Ergebnis dass in r16 und
>r17? Und welches wird dann als höherwertiges Bit genommen? (ein
>einfaches inc gibt es für zwei Register ja nicht!?)

Wenn du den vollständigen Syntax 'adiw r17:16,1' benutzt, ist das 
klarer.

MfG Spess

von Freddy (Gast)


Lesenswert?

Ja da hast du recht - brcc und brsh tun das gleiche jetzt wo ich es mir 
anschaue. War mir nicht klar - wohl einfach weil ich mir den anderen 
Befehl nie angeschaut habe - brsh ist doch auch schneller verständlich 
wenn man den Code liest finde ich. Aber danke - wieder was dazugelernt.
Und das höherwertige Bit bei 16-Bit Operationen ist immer auch das vom 
"Index" höhere, okay.

Dann danke ich euch - das hat mir schonmal sehr geholfen und ich werd 
mich wieder an die Arbeit machen können.

von spess53 (Gast)


Lesenswert?

Hi

>...Befehl nie angeschaut habe - brsh ist doch auch schneller verständlich
>wenn man den Code liest finde ich.

Wenn man das Carry-Flag verstanden hat, ist das genau so verständlich.

MfG Spess

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.