www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Strings im Flash


Autor: Waldemar T. (sanchez251)
Datum:
Angehängte Dateien:

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

Autor: Waldemar T. (sanchez251)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und... Hier mal die Ansteuerung... Thanks to Christoph Kessler!

Danke für eure Bemühungen!

Autor: zero_gravity (Gast)
Datum:
Angehängte Dateien:

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

Autor: Waldemar T. (sanchez251)
Datum:

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

Autor: zero_gravity (Gast)
Datum:

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

Autor: Waldemar T. (sanchez251)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach komm. Eine Multiplikation mit 8 ist einfach
ein 3 maliges Schieben nach links.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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


Autor: Waldemar T. (sanchez251)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Waldemar T. (sanchez251)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Waldemar T. (sanchez251)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Waldemar T. (sanchez251)
Datum:

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

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

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.