Forum: Mikrocontroller und Digitale Elektronik Strings im Flash


von Waldemar T. (sanchez251)


Angehängte Dateien:

Lesenswert?

Hi @all!

Ich hab da ein kleines Problem: Ich suche schon seit Tagen eine 
Intelligente Möglichkeit einen Zeichensatz für ein Grafik Lcd_Display in 
Assembler-Code zu integrieren.

Ich hab auch tatsächlich einen Zeichensatz gefunden (Siehe Anhang)... 
Thanks to Christoph Kessler!

Aber irgendwie versteh ich nicht ganz die Ansteuerung davon, und 
Christoph meinte, es wäre schon ne weile Her, dass er das programmiert 
habe.

Jedenfalls, soll es am Ende so sein, dass ich einen String oder auch 
einen einzelnen Buchstaben aus dem EEprom lade, der dann in Grafik-LCD 
fähiges format (z.b. 5x8 Pixel) umgesetzt und ausgegeben werden soll.

Das mit dem Ausgeben ist kein problem, dass läuft bereits. Wo's noch 
hapert ist diese Umsetzung von einem normalen Ascii-Zeichen in die
Pixel-Form.

Ich hab mir da bereits ein paar Gedanken gemacht. Man könnte quasi "die 
Fliege mit ner Dampfwalze plätten ;)", indem man das Zeichen als Hexcode 
interpretiert, und dem Programm sagt, es soll an diese Stelle springen, 
wo wiederrum ein Verweis auf die demenstprechende Stelle mit den String 
vom Ascii-zeichen in LCD-Format steht... Dabei weiß ich aber wiederrum 
nicht, wie man dem Programm sagt, er soll nicht den Register als 
Sprungmarke annehmen, sondern der Wert der darin steht.

Naja, jetzt hab ich euch erschlagen... Kann mir jemand helfen, oder ist 
das gar nicht möglich, was ich da vorhabe?

Gruß Waldemar

von Waldemar T. (sanchez251)


Angehängte Dateien:

Lesenswert?

Und... Hier mal die Ansteuerung... Thanks to Christoph Kessler!

Danke für eure Bemühungen!

von zero_gravity (Gast)


Angehängte Dateien:

Lesenswert?

hey waldemar!

also wenn du die zeichen im flash nach ascii-tabelle ordnen würdest 
(siehe anhang) könntest du einfach von einem über uart oder so eingehen 
zeichen die ersten 32 kontrollzeichen der tabelle anbziehen. danach 
subtrahiert du so lange 1 von dieser zeichen und gehst gleichzeitig mit 
dem aufs flash verweisenden pointer immer um 8 höher bis das zeichen 
irgendwann null ist. dann steht dein pointer auf dem jeweiligen 
zeichen-intrag im flash!

ich hoffe irgendwer hat grad meine idee verstanden... :))

glg szero_gravity

von Waldemar T. (sanchez251)


Lesenswert?

oh mann... Ich musste echt lange überlegen, bis ich denen Denkweg 
verstanden hab. :)

Also du meinst ich kopiere das Zeichen in ZL und in ein anderes Register 
z.B. R16 (gehen wir mal von "A" = $41 aus)

r16 = Zl = $41

dann inrkrementiere ich den Z-pointer um 5 (weil das zeihen ja nur 5 
Pixel breit ist) und subtrahiere R16 um 1.

loop:
adiw Zh:Zl, 5
dec R16
tst R16
brne loop
rcall LCD_Out

Wenn R16 = 0 ist stehe ich mit meinem Z-Pointer bei "A"... oder?

von zero_gravity (Gast)


Lesenswert?

hey! man hat mich verstanden! freu

also vom prinzip her hast du recht, nur dass du eben die berüchtigten 32 
kontrollzeichen von r16 abziehen musst und deine zeichentabelle wie die 
ascii-tabelle anordneen musst... aber dann sollte das funktionieren!
baue mir auch grad so eine routine für nen display, hab aber noch nix 
programmiert bisher - musst mir dann unbedingt sagen ob das überhaupt 
klappt!

ach ja, nochwas: bei deinem zeichensatz sind die zeichen sind nicht 5x8 
sondern 8x8 würde ich sagen...
jedes zeichen besteht bei dir aus 8 zeichen, die in 8 spalten angeordnet 
sind, wovon die jeweils letzte immer 0x00 also eine leerspalte ist

glg
zero_gravity

von Waldemar T. (sanchez251)


Lesenswert?

Stimmt du hast recht... evtl. schreib ich noch nen eigen mit ner breite 
vo 5 zeichen, oder so. will nämlich nicht so viel platz mit text 
verbraten, wenn ich schon ein Grafik-LCD hab.

Mir ist übrigens ne Idee gekommen, die auf deiner aufbaut:

man löscht die zeichen die man nicht braucht einfach raus, und 
subtrahiert das Zeichen mit dem Wert der ersten Stelle.

also z.b. "A" an Stelle 0x00

Wenn man A einliestsubrtahiert man $41

Diesen Wert multipliziert man mit der Breite der Zeichen also z.b. 8 und 
steht damit an stelle des Zeichens... z.b. für L:

L = $4C

ldi R16, $4C   ;L in R16
sbci R16, $41  ;danach R16 = $0B = 11
ldi R17, 8
muls R16, R17  ;multipliziere. Ergebnis in R1 und R0
mov ZH, R1
mov ZL, R0
rcall Lcd_out

So musste das, denk ich, gehen... Ich probiers mal aus, und sag dann 
bescheid....

Danke für die Hilfe!

von Karl H. (kbuchegg)


Lesenswert?

Ach komm. Eine Multiplikation mit 8 ist einfach
ein 3 maliges Schieben nach links.

von Karl H. (kbuchegg)


Lesenswert?

> man löscht die zeichen die man nicht braucht einfach raus, und
> subtrahiert das Zeichen mit dem Wert der ersten Stelle.

Das ist doch schon passiert.
Der gepostete Zeichensatz fängt mit dem ersten Zeichen
an, dass eine graphische Repräsentierung hat.
Noch mehr würde ich nicht rausstreichen. Denn irgendwann
brauchst du so Dinge wie ! # oder Ziffern oder dergleichen.


von Waldemar T. (sanchez251)


Lesenswert?

Klar! Es ist ja auch nicht so gemeint, dass die Tabelle mit "A" 
anfängt... Das war jetzt nur ein Beispiel. Es Geht darum, dass man 
Strings als Wert und nicht als Label betrachtet und mit diesem Wert 
einen verweis auf die Grafik-Rouitine des zeichens macht. Da ist es 
egal, mit welchen Zeichen du anfängst. Wichtig ist, dass du das Schema 
der Ascii-tabelle einhälst und die Subtraktion mit deinem Anfangswert 
übereinstimmt. Ich tüftel da mal was aus, und stells dann rein...

Übrigens kann man den zeichensatz von Oben so nicht verwenden, weil die 
Zeichen liegend dargestellt werden, also dafür gedacht waren, dass das 
Display steht... (Oder das Display von Chrtistoph wird anders 
angesteuert werden... Keine Ahnung)

Gruß Waldemar

von Karl H. (kbuchegg)


Lesenswert?

> weil die Zeichen liegend dargestellt werden

Wo liegt denn da das Problem?
Dann malst du halt die Pixel nicht nebeneinander
sondern übereinander.

Wenn du darauf spekulierst, dass du einfach nur die Bytes
aus dem Zeichensatz zum Display schaufeln musst, dann
vergiss es gleich wieder. Auf einem Grafikdisplay will
ich den Text an jeder beliebigen Position stehen haben.
Da is nix mit Byte rüberkopieren.

von Waldemar T. (sanchez251)


Lesenswert?

Mhh, recht hast du... Dan kann man gleivh ein Text-Display nehmen...

Mein Display ist glaub ich auch ein bisschen komplizierter anzusteuern. 
Hier mal ein Schema (Hab das Datenblatt grad nicht da...)


             Column 0 - 63           Column 0 - 63
       -------------------------------------------------
Page 0 -                       -                       -
       -------------------------------------------------
Page 1 -        Hallo Welt     -                       -
       -------------------------------------------------
Page 2 -                       -                       -
       -------------------------------------------------
Page 3 -                       -                       -
       -------------------------------------------------
Page 4 -                       -                       -
       -------------------------------------------------
Page 5 -                       -                       -
       -------------------------------------------------
Page 6 -                       -                       -
       -------------------------------------------------
Page 7 -                       -                       -
       -------------------------------------------------
               CS1=1                      CS2=1

Ich kann die Bytes so auf den Pages Beliebig verschieben. Will ich einen 
Buchstaben aber zwischen zwei Pages schreiben, muss man des die Bits 
wohl mit ner Schiebefunktion so hinschieben, das sie passen... Ist halt 
viel Hirnarbeit, müsste aber gehen.

Für meine Zwecke würde die Fixierung durch die Pages wahrscheinlich aber 
reichen...

von Karl heinz B. (kbucheg)


Lesenswert?

Meistens brauchst du ja kein High-Speed beid der Anzeige.
D.h. deine erste Funktion ist eine
Setzte Pixel an Position X/Y
Funktion. Diese Funktion kümmert sich um die Pages und
was sonst noch an Hardware-Besonderheiten vorhanden sind,
um für darüberliegende Software-Schichten einen einzigen
logischen Screen mit was weiss ich wievielen Pixel in X
und Y anzubieten.

Diese Funktion benutzt du dann weiter um bei der Ausgabe eines
Characters die entsprechenden Pixel zu setzen. Die Zeichen-
Ausgabefunktion muss sich dann um solche Dinge nicht mehr
kümmern.

von Waldemar T. (sanchez251)


Lesenswert?

Mhh, du meinst, dass ich da ne subroutine schreiben soll, wo ich dass 
genaue Pixel angebe, wo es Beginnen soll, und das programm mir dann 
selber ausrechnet, auf welcher Page sich das befindet und wie er die 
Bytes splitten/schieben muss...?

von Karl heinz B. (kbucheg)


Lesenswert?

Exakt:

  void SetPixel( unsigned int Row, unsigned int Column );
  void ClearPixel( unsigned int Row, unsigned int Column );

ev. ist auch eine Funktion
  void TogglePixel( unsigned int Row, unsigned int Column );
wünschenswert: Ist das Pixel gesetzt, dann wird es gelöscht,
ist es gelöscht, wird es gesetzt. Dies ist zb interessant,
wenn du Text über einer Graphik ausgibst. Dunkle Pixel
auf dunkel Untergund sieht man sonst so schlecht :-)

Diese 3 Funktionen, sind die einzigen, die über die
ganze Page-Geschichte Bescheid wissen. Alle anderen
Ausgabefunktionen stützen sich auf diese Funktionen
und benutzen sie wenn ein Pixel zu setzen bzw. zu löschen
ist.

von Waldemar T. (sanchez251)


Lesenswert?

Ähhm, sorry, kann kein C programmieren... gibts so was auch in 
Assembler?

Ansonstn muss ich's halt selber errechnen und programmieren...

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.