mikrocontroller.net

Forum: Compiler & IDEs Bitmuster schreiben (kompliziertes Problem)


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal wieder das bekannte Brett vor'm Kopp. Vielleicht könnt Ihr
mir ja helfen. Allerdings muß ich dazu erst einmal versuchen, daß
Problem in Worte zufassen. Ich hoffe, es gelingt mir:

Ich will auf ein einfarbiges Grafik LCD ein Bit-Pixel-Bild schreiben.
Das Bild habe ich als 8-Bitige Hex-Zahlen für das Bitmuster. Bspw.
0xCF, 0xFF, 0xAB oder sonst was.
Normalerweise ist jede Speicherstelle = 1 Zeichen = 8Bit breit. In
diesem Fall habe ich kein Problem, das Bitbild auszugeben.
Jetzt kann man das Display aber auch im Narrow Font betreiben, bei der
jede Speicherstelle zwar immer noch 8 Bit breit ist, aber nur 6 Bit von
angezeigt werden (die rechten Bits). Wie kann ich nun das 8-Bit Bild
übertragen? Es darf dabei kein Bit unterschlagen werden, denn das Bild
besteht ja aus der benötigten Anzahl Pixel/Bits.

Mir steht dabei zur Verfügung:
8-Bit Speicherstelle (nicht Pixel!) adressieren.
6 Pixel/Bits in der Speicherstelle schreiben

Wenn ich also die ersten 6 Bits des erstenn Bytes ausgegeben habe, muß
ich die zweite Speicherstelle anspringen und da die letzten 2 Bits
ausgeben. Zusätzlich noch 4 Bits des zweiten Bytes. Dann 4 verbleibende
Bytes in der dritten Zelle + 4 Bits des dritten Bytes usw.
Wie löse ich das elegant in einer Schleife?

Autor: britneypunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nehmen wir an dein bild steht im Array bild[] und dein Speicher wird
nachher sequentiell durch das Array speicherstelle[] beschrieben:
(Voraussetzung für meinen Vorschlag ist, dass die oberen beiden Bits
der jeweiligen Speicherstelle don't care sind - es also egal ist was
darin steht)

for(u=0;u<n;u++) {
  speicherstelle[4*u] = bild[4*u]
  for(i=1;i<4;i++) {
    speicherstelle[i+3*u]=(bild[i-1+3*u]>>(8-2*i)) | (bild[i+3*u]<<
(2*i));
    }
}

Bsp.:
Speicherzelle       Inhalt bit<5:0>
0                   b05 b04 b03 b02 b01 b00      ; u=0
1                   b13 b12 b11 b10 b07 b06      ; i=1
2                   b21 b20 b17 b16 b15 b14      ; i=2
3                   b27 b26 b25 b24 b23 b22      ; i=3
4                   b35 b34 b33 b32 b31 b30      ; u=1
5                   b43 b42 b42 b40 b37 b36      ; i=1

b12 bedeutet z.B. Byte1 bit2

Habe ich dich mit dieser Bitanordnung richtig verstanden? Also das die
MSBits mit in die nächste Speicherstelle geschrieben werden; und dort
als LSBits landen. Wenn du das anders meinst ist an obigem Algorithmus
aber auch nicht viel zu ändern.

n berechnet sich aus: Anzahl der Speicherstellen / 4

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. Das sieht schon sehr gut aus. Auf jeden Fall hast Du das Problem
richtig verstanden. Ich werde es mal testen.

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.