C Zeichnen mit einem GLCD

Ich konnte soweit alles testen, hat auch alles wunderbar funktioniert.
Zu deiner Frage.:

Weil das mit in dem Byte Bereich liegt. Wenn ich jetzt ein frisches Byte übertrage wo das Bit nicht gesetzt ist, sehe ich natürlich auch keinen Pixel.
 
Wenn ich jetzt ein frisches Byte übertrage wo das Bit nicht gesetzt ist, sehe ich natürlich auch keinen Pixel.
Das ist ungenau...
Zuerst wurden die vier Eckpixel gesetzt, anschließend ein Pixel "in der Mitte". Das war Stufe 0.
Stufe 1 versucht einen zusätzlichen Pixel "in der Mitte" zu setzen, der sollte auch erscheinen, aber der vorherige verschwindet.
Begründung stimmt natürlich, Du beschreibst den Pixel beim zweiten Mal mit einer "0", er wird gelöscht.

Was mußt Du tun, um beim bechreiben des zweiten Pixels den ersten zu behalten, und wie realisierst Du das?
Du hast in C eigentlich schon öfter Bits in einem Byte gesetzt oder gelöscht, ohne die anderen Bits zu verändern...
 
Das ist ungenau...
Zuerst wurden die vier Eckpixel gesetzt, anschließend ein Pixel "in der Mitte". Das war Stufe 0.
Stufe 1 versucht einen zusätzlichen Pixel "in der Mitte" zu setzen, der sollte auch erscheinen, aber der vorherige verschwindet.
Begründung stimmt natürlich, Du beschreibst den Pixel beim zweiten Mal mit einer "0", er wird gelöscht.

Was mußt Du tun, um beim bechreiben des zweiten Pixels den ersten zu behalten, und wie realisierst Du das?
Du hast in C eigentlich schon öfter Bits in einem Byte gesetzt oder gelöscht, ohne die anderen Bits zu verändern...

Wie du schon erwähntest, entweder auslesen und das dann verodern oder erst alles auf dem uc zusammen basteln wie eine art VRAM und dann rüber schubsen.
 
Wobei Du auch auf dem Controller auslesen (den Wert aus dem Abbild lesen), verodern und (ins Abbild) zurückschreiben mußt. Und ins Display natürlich auch.

Wenn Du Daten ins Display schreibst, inkremetiert die Column-Adresse automatisch. So kannst Du 'ne ganze Page in einem Rutsch vollschreiben (Also Page und Column adressieren, und dann bis zu 132 Datenbytes reinpumpen).
Dasselbe gilt beim Lesen, aber beim Lesen kann man es auch abschalten. Dann muß nicht zum lesen und zum schreiben die Adresse gesetzt werden, sondern nur einmal. Die Column-Adresse inkrementiert dann nur noch beim schreiben.
 
Mein nächstes Problem..

Jetzt wollte ich einen Text von rechts rein rollen und nach links raus rollen lassen…
Ich weiß ehrlich gesagt nicht so wirklich wo und wie ich anfangen soll.
Im Netz gibt es div. Vorschläge aber mit keiner bekomme ich es so wirklich sauber nachgebaut.



CodeBox C
char msg[] = "Last Message from Master";
int msgLen = 128 +(strlen(msg));

Soweit bin Ich schonmal..
Nun muss ja jedes Zeichen aus dem Array holen und nacheinander auf dem GLCD ausgeben.
Dabei muss das Zeichen zuvor um 1 nach rechts verschoben werden und das zweite nachgeladen werden und ausgegeben werden..

Beim nachbilden hört es dann auch schon wieder auf..
 
vorweg: Es gibt Displaycontroller, die das teilweise unterstützen. Deiner kann nur vertikal rollen.

Du mußt also selbst die Daten jedes mal neu schreiben. Hast Du die Daten im Controller (Abbild bzw als ASCII zuzüglich Zeichentabelle), schreibst Du die jedes mal von Links nach rechts (wegen Autoinkrement), und verschiebst den Leseindex.
Hast Du die Daten nur im Display, kannst Du beim rechts rollen auch das Autoinkrement nutzen (mit zwei temporären Bytes), beim links rollen mußt Du bei jedem Schreibzugriff die Column-Adresse umsetzen.

Hast Du bereits eine gute Routine (+Tabelle), die aus den ASCII die Muster erzeugt?
 
Hast Du bereits eine gute Routine (+Tabelle), die aus den ASCII die Muster erzeugt?
Ja. Ich kann schon Strings darstellen.

Mir fehlt jetzt nur noch die Routine um den String von rechts rein zu rollen und links wieder raus..
 
Mir fehlt jetzt nur noch die Routine um den String von rechts rein zu rollen und links wieder raus..
Nur mal als ein mögliches Beispiel:


CodeBox C
char msg[] = "Last Message from Master";
uint8_t buffer[strlen(msg) * charwidth];

kopiere Messagetext in buffer
setze Zähler auf null
L1: setze Displayposition auf Anfang der Zeile
gib 128 Bytes aus buffer ab Zählerposition aus
erhöhe Zähler um eins
wiederhole ab L1

Jetzt muß Du Dich noch darum kümmern, daß
1. der Zähler nicht über das Ende des buffers hinausläuft
2. bei der Ausgabe hast Du das gleiche Problem
 
Nur mal als ein mögliches Beispiel:


CodeBox C
char msg[] = "Last Message from Master";
uint8_t buffer[strlen(msg) * charwidth];

kopiere Messagetext in buffer
setze Zähler auf null
L1: setze Displayposition auf Anfang der Zeile
gib 128 Bytes aus buffer ab Zählerposition aus
erhöhe Zähler um eins
wiederhole ab L1

Jetzt muß Du Dich noch darum kümmern, daß
1. der Zähler nicht über das Ende des buffers hinausläuft
2. bei der Ausgabe hast Du das gleiche Problem

Sehe ich das richtig, dass du mir den Weg beschrieben hast, von links nach recht zu scrollen?
 
Nur mal als ein mögliches Beispiel:


CodeBox C
char msg[] = "Last Message from Master";
uint8_t buffer[strlen(msg) * charwidth];

kopiere Messagetext in buffer
setze Zähler auf null
L1: setze Displayposition auf Anfang der Zeile
gib 128 Bytes aus buffer ab Zählerposition aus
erhöhe Zähler um eins
wiederhole ab L1

Jetzt muß Du Dich noch darum kümmern, daß
1. der Zähler nicht über das Ende des buffers hinausläuft
2. bei der Ausgabe hast Du das gleiche Problem

Es funktioniert ja von links nach rechts.. Bekomme es leider nicht anders herum..


CodeBox C
#define CHARWIDTH 6
char msg[] = "Herzlich Willkommen";
uint8_t buff[strlen(msg) * CHARWIDTH];
strcpy((char*)buff,(const char*)msg);
uint16_t cnt = 0;

while (cnt<(128+strlen((char*)buff)))
{
 glcdPuts((char*)buff);
 glcdGotoXY(0,cnt++);
 _delay_ms(60);
}
 
Es funktioniert ja von links nach rechts.. Bekomme es leider nicht anders herum..

So in der Art? ...


CodeBox C
while (cnt<(128+strlen((char*)buff)))
{
 glcdPuts((char*)buff);
 glcdGotoXY(0,cnt++);
 _delay_ms(60);
}

// cnt = (128+strlen((char*)buff));
do {

 glcdPuts((char*)buff);
 glcdGotoXY(0,cnt--);
 _delay_ms(60);

} while (cnt>0);
 
So in der Art? ...


CodeBox C
while (cnt<(128+strlen((char*)buff)))
{
 glcdPuts((char*)buff);
 glcdGotoXY(0,cnt++);
 _delay_ms(60);
}

// cnt = (128+strlen((char*)buff));
do {

 glcdPuts((char*)buff);
 glcdGotoXY(0,cnt--);
 _delay_ms(60);

} while (cnt>0);

Es sollte ja von rechts "rein" gerollt kommen...

EDIT.:

Wenn der String zu lang wird, fängt er vorne bei "0" wieder an hin zu schreiben..
 
Sehe ich das richtig, dass du mir den Weg beschrieben hast, von links nach recht zu scrollen?
Nein, der Text wird links rausgeschoben. Um "1" und "2" mußt Du Dich noch kümmern. Ebenso um eventuelle führende und folgende "Lehrzeichen".

Wozu eigentlich den Buffer? Der ist doch unnötig...
 
Ich stehe im moment echt auf den Schlauch..
@LotadaC kannst du evtl. mal einen C Pseudokode posten? Wie du das meinst?
 
Wenn der String zu lang ist vermute ich mal reicht der nicht sichtbare RAM vom Display nicht mehr aus und er schreibt den String wieder von 0,0 an.



CodeBox C
do {
glcdPuts((char*)buff);
glcdGotoXY(0,col--);
[I]_delay_ms[/I](130);

} while (cnt-->0);


Wäre es sinnvoller jedes Zeichen einzelnd zu schreiben und zu scrollen?
 
Das hat Mikro23 doch schon getan...
kopiere Messagetext in buffer
...
Das ist Dein Buffer.
setze Zähler auf null
Der Zähler für die Scroll-Schritte, erstmal Null
Schleifenanfang, in der Schleife dann
setze Displayposition auf Anfang der Zeile
Column auf Anfang setzen, die Page wird ja nicht geändert.
gib 128 Bytes aus buffer ab Zählerposition aus
128 Bytes aus dem Buffer ab Zählerposition ausgeben. Die ganze Page beschreiben.
erhöhe Zähler um eins
Zähler (Index im Puffer) inkrementieren
Schleifenende.
Führende (beim reinschieben) und folgende (beim rausschieben) Leerzeichen kannst Du natürlich auch vorher in den Buffer knallen, aber dann kostet Dich "128 Pixel in das Display und wieder rausschieben" mal eben 384 Bytes SRAM für den Buffer.

Sinniger ist es, den anzuzeigenden String als ... String, zu speichern, und die Muster bei Bedarf direkt aus der Zeichensatztabelle zu laden.


Alternativ zu den führenden Leerzeichen kannst Du auch den bisherigen Inhalt der Page mitschieben. Dazu mußt Du den natürlich kennen, also entweder aus einem Abbild oder aus dem Display-RAM selbst auslesen. Die Schleife könnte dann so aussehen:
  • Schleife i=0..127
    • Schreibwert = Buffer(i)
    • Schleife j=127..0
      • lese inhalt von column j -> Lesewert
      • schreibe Schreibwert dahin
      • Schreibwert= Lesewert
    • ende
  • ende
Im Abbild kannst Du direkt auf die Bytes zugreifen, im Display-RAM mußt Du halt die Adressen senden (bzw das Autoincrement nutzen, wo es geht).
 
vermute ich mal reicht der nicht sichtbare RAM vom Display nicht mehr
???
Das Display-RAM besteht aus 8(+1) Pages und 132 Columns. Die Pags sind hier irrelevant, Du hast also 132 Columns, von 0x00 bis 0x83.
Davon sind jetzt möglicherweise die letzten vier nicht an Dein Display angeschlossen, den Speicher kannst Du natürlich trotzdem Lesen und schreiben.
Das Set Column Adress Command erlaubt als Parameter genau diese 0x00..0x83, und nichts weiter.
Wird ein Datenbyte geschrieben oder gelesen (Ausnahme: Read Modify Write Mode), inkrementiert die Column-Adresse automatisch, dieses Inkrement stoppt bei 0x83.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)