www.mikrocontroller.net

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


Autor: Freddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Freddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Freddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.