C Zeichnen mit einem GLCD

Also es soll nach Möglchkeit von rechts rein gerollt und links wieder
raus gerollt werden.

Es müsste also "glcdGotoXY(0,y);" y ab 128 decrementiert werden..


CodeBox C
void glcdScrollText(char *msg)
{
 #define FONT_CHAR_WIDTH  6
 #define ADD(x,y) (x+y)

 uint8_t msgLen = strlen(msg);
 char *msgBuff = NULL;
 char buffer[100 * FONT_CHAR_WIDTH];

 msgBuff = ascToRaw(msg,buffer);
 
 for (uint16_t z = 0 ; z < ((msgLen * FONT_CHAR_WIDTH) + 128) ; z++)  
 {
  for (uint8_t i = 0 ; i < 128 ; i++) 
  {
   if ((ADD(z,i) > 128) || (ADD(z,i) <= ((msgLen * FONT_CHAR_WIDTH) + 128))) 
   {
    glcdGotoXY(0,y);
    glcdSendData(*(msgBuff+ADD(z,i)));
    _delay_ms(100);
   }
  }
 }
}
 
Also es soll nach Möglchkeit von rechts rein gerollt und links wieder
raus gerollt werden.
So sollte es sein.

Außerhalb der inneren Schleife muß die Displayposition auf 0 gesetzt werden und nicht innerhalb - Dein Fehler.
Die if-Anweisung ist unvollständig. Im else-Zweig muß 0 ans Display geschickt werden - mein Fehler.

Und das Delay muß außerhalb der inneren Schleife sein.
Die gesamte Funktion blockiert so natürlich alles andere, außer Interrupts.

Aber da Du ja jetzt doch eine schon vorhandene Funktion benutzt, brauchst Du ja nicht mehr nachzudenken. ;)
 
  • Like
Reaktionen: TommyB
@Mikro23 deine Idee ist ja auch echt interessant, leider ist Sie aber auch ziemlich speicherlastig und ziemlich aufwendig.
Von Dirk die Routine ist doch um einiges schlanker und schneller...
 
Hättest Du gleich gesagt, daß Du zeichenweise scrollen (also eher hüpfen) willst, hätte mein Vorschlag Dirks vermutlich ähnlich gesehen.

Ich bin davon ausgegangen, daß Du soft-scrollen wolltest, also 6 Schritte pro Zeichen und nicht nur einen.
Das ist naturgemäß etwas aufwendiger...
 
Hättest Du gleich gesagt, daß Du zeichenweise scrollen (also eher hüpfen) willst, hätte mein Vorschlag Dirks vermutlich ähnlich gesehen.

Ich bin davon ausgegangen, daß Du soft-scrollen wolltest, also 6 Schritte pro Zeichen und nicht nur einen.
Das ist naturgemäß etwas aufwendiger...
Dann habe ich mich mal wieder unklar ausgedrückt *schande über mein Haupt*
Wie würde dein Vorschlag den aussehen? Ich bin immer offen neues zu lernen... Würde mich freuen wenn du ihn mal grob in "Pseudo C" aufzeigen könntest. Danke.
 
Dein Code aus Beitrag #101 mal etwas aufgeräumt und meine Ergänzung aus Beitrag #103 eingebaut.
Für Dich ist auch noch was zu tun. Und ich weiß nicht, ob ich alle Fehler gefunden habe...


CodeBox C
void glcdScrollText(char *msg)
{
   #define FONT_CHAR_WIDTH 6

   uint8_t msgLen = strlen(msg);
   uint16_t bufLen = msgLen * FONT_CHAR_WIDTH;
   char buffer[bufLen];

   char *msgBuff = ascToRaw(msg,buffer); // wenn die Funktion das tut was sie soll

   for (uint16_t z = 0; z < (bufLen + 128); z++) {
      // hier setze Displayposition auf Spalte 0 einfügen!!!
      for (uint8_t i = 0; i < 128; i++) {
         s = z + i;
         if ((s > 128) || (s <= (bufLen + 128))) {
             glcdSendData(*(msgBuff + s));
         } else {
             glcdSendData(0);
         }
      }
      _delay_ms(100);
   }
}
 
Zuletzt bearbeitet:
@Mikro23
Moin,

habe deine Funtkion gerade mal ausprobiert. Leider auch nicht die gwünschte Funktion.
Der Text fängt wie erwartet wieder bei 0,0 an und scrollt dann aus dem Display raus. Dahinter hunderte Pixel die da nicht hingehören.
 
@Dirk
Lieber Dirk,
könntest du mir mal deine Routine erklären? So ganz verstehe ich sie noch nicht.
Wieso kann der Text von rechts rein scrollen obwohl wir die Displayposition nicht dahin setzen?
Am Anfang setzt du den "Cursor" direkt auf (x,0) , müsste es nicht an (x,DISPLAY_WIDTH) anfangen?



CodeBox C
void glcdScrollMsg(uint8_t posX, char *msg)
{
   #define DISPLAY_WIDTH   21
   
   static int8_t x = DISPLAY_WIDTH;
   uint8_t col = 0;
   
   if (x-- <= (int8_t)strlen(msg)*-1)x = 20;   
   
   glcdGotoXY(posX,0);
   
   if (x>=0)
   {
       while((col++ < x) && (col < (DISPLAY_WIDTH)))glcdPutc(' ');
       while ((*msg) && (col++ < (DISPLAY_WIDTH)))glcdPutc(*msg++);
       while (col++ < (DISPLAY_WIDTH))glcdPutc(' ');
   }
   else
   {
       if ((x+strlen(msg)) <= 0)
       {
           while (col++ < (DISPLAY_WIDTH))glcdPutc(' ');
       }
       else
       {
           uint8_t i = abs(x);
           while ((msg[i]) && (col++ < (DISPLAY_WIDTH)))glcdPutc(msg[i++]);
           while (col++ < (DISPLAY_WIDTH))glcdPutc(' ');
       }   
   }
}
 
Wieso kann der Text von rechts rein scrollen obwohl wir die Displayposition nicht dahin setzen?
Am Anfang setzt du den "Cursor" direkt auf (x,0) , müsste es nicht an (x,DISPLAY_WIDTH) anfangen?
Es ist ja schon einige Zeit her, hmmm ...

Die Spalte wird zuvor immer auf 0 gesetzt lcd_gotoxy(), danach werden immer alle Zeichen übertragen, bis zum Ende der Zeile.
Auch ggf. am Anfang Leerzeichen. Es werden also alle Inhalte der Zeile überschrieben. Man könnte auch für jedes Zeichen manuell den Cursor setzen, aber
das ist aufwändiger, denn im Moment wird Autoincrement der Cursoradresse genutzt.

---

Dieses ...
if (y == 1)
lcd_gotoxy(0, 1); // Zweite Zeile
else
lcd_gotoxy(0, 1); // Erste Zeile

muss noch korrigiert werden. Zeile ist immer die selbe, das sollte damals denke für ein 2x20 Display sein.

---

Zu deinem Code:
Er sieht zwar kürzer aus, aber es ist nicht gut verständlich. Der erzeugte Code wird auch nicht kürzer oder schneller sein.
In C würde ich nicht unbedingt immer so sehr "komprimieren", der Code wird dann weniger gut lesbar, das ist problematisch, wenn man sich nach längerer Zeit wieder mit dem Code befassen möchte oder muss.
 
habe deine Funtkion gerade mal ausprobiert. Leider auch nicht die gwünschte Funktion.
Wie ich oben sagte, kann es so nicht funktionieren, weil die Funktion nicht fertig ist.

Wenn Du lieber copy&paste-Programmierer werden willst, dann such Dir im web was Du braucht und kopiere es zusammen.
Der Text fängt wie erwartet wieder bei 0,0 an und scrollt dann aus dem Display raus. Dahinter hunderte Pixel die da nicht hingehören.
Ich habe an Deiner Version (die Du nach meiner, wahrscheinlich auch noch nicht fehlerfreien Beschreibung, programmiert hast) erstmal nur die offensichtlichen Fehler korrigiert.
Nach Deiner Beschreibung stimmt was mit den Laufvariablengrenzen nicht. Auf sowas solltest Du eigentlich selbst kommen (und das korrigieren können).

Wenn Du wirklich programmieren lernen willst, solltest Du auf jeden Fall debuggen lernen. Und dazu muß man das Programm auch verstehen. Sonst wird das nix.
 
  • Like
Reaktionen: TommyB
Wenn Du Dir eine Skizze gemacht hättest, hättest Du z.B. darauf kommen können:

Der Index der äußeren Schleife z läuft von 0 bis 128 + bufLen
Der Index der inneren Schleife i läuft von 0 bis 127. Genau eine Zeile des Display.

1. Wenn z = 0 ist, läuft z + i von 0 bis 127.
2. Wenn z = 128 ist, läuft z + i von 128 bis 255.
3. Wenn z = 128 + bufLen ist, läuft z + i von 128 + bufLen bis 128 + bufLen + 127.

Die innere Schleife soll 128 Bytes an das Display schicken.
Im 1. Fall müssen 128 Nullen geschickt werden.
Im 2. Fall die ersten 128 Bytes aus dem Buffer.
Im 3. Fall wieder 128 Nullen, da der Index schon hinter dem Buffer anfängt.

Du hattest meinen fehlerhaften Vorschlag aus Beitrag #92
Bei jedem Inkrementieren des inneren Zählers wird buffer[i + z] ausgegeben, wenn i + z > 128 oder <= Bufferlänge + 128 ist.
mit


CodeBox C
   glcdSendData(*(msgBuff+ADD(z,i)));

einfach übernommen ohne ihn zu überprüfen.

Wenn Du die obigen Überlegungen angestellt hättest, hättest Du darauf kommen können,
daß es msgBuff + z - 128 + i heißen müßte, wie @LotadaC in seinem geänderten Beitrag #88 schon schrieb.
 
@Mikro23 Ich danke dir aufjedenfall für deine Mühen. Dennoch habe ich was auf deinem Kode lernen können. Mir gelingt es nicht immer so "kompliziert / verzweigt" zu denken.
Und da ich ja noch kein "C Profi" bin und das nur in meiner Freizeit größtenteils mache, dauert das wohl auch noch ein wenig bis Ich mich behaupten kann.
 
Und da ich ja noch kein "C Profi" bin und das nur in meiner Freizeit größtenteils mache
Ob Mikro23 sowas beruflich macht, weiß ich nicht (mehr - möglicherweise hatte er das mal geschrieben) - die meisten hier sind jedoch fachfremde Hobbyisten wie Du.
Eigentlich hatte wir erstmal nur Lösungsvorschläge - Wege - gepostet; das in eine Sprache Deiner Wahl umzusetzen sollte Dir überlassen bleiben. Ich kann kein C / will mich da nicht wirklich einarbeiten...
heißen müßte, wie @LotadaC in seinem geänderten Beitrag #88 schon schrieb
Mehrfach geändert, bitte... (Idee-> geht doch nicht wie ich dachte->Korrektur->..)
Und natürlich auch nur aus der Hüfte geschossen und ungetestet...

Aber schön, daß wir jetzt quasi zum selben Ansatz gekommen sind...
 
  • Like
Reaktionen: Mikro23
@Mikro23:
Aber da Du ja jetzt doch eine schon vorhandene Funktion benutzt, brauchst Du ja nicht mehr nachzudenken. ;)
Wenn Du lieber copy&paste-Programmierer werden willst, dann such Dir im web was Du braucht und kopiere es zusammen.
...
Wenn Du wirklich programmieren lernen willst, solltest Du auf jeden Fall debuggen lernen. Und dazu muß man das Programm auch verstehen. Sonst wird das nix.
:good:
 
  • Like
Reaktionen: Mikro23

Ü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)