mikrocontroller.net

Forum: Compiler & IDEs Laufschrift läuft nicht


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, habe mir den folgenden Code für eine Laufschrift ausgedacht:

unsigned char zeile=16, marke=0, i=0;
char ausgabe[zeile];
char eingabe[] = "Keine Ahnung ";

long eingabe_laenge = strlen(eingabe);

    lcd_init();

while (1) {

  for (i=0;i<zeile;i++) {

    if (marke+i < eingabe_laenge) ausgabe[i] = eingabe[marke+i];
    else ausgabe[i] = eingabe[marke+i-eingabe_laenge];

  } // Ende for

  ausgabe[zeile]='\0';  // terminieren der Ausgabe !
  lcd_string(ausgabe);

  i=0;
  marke++;
  if (marke == eingabe_laenge) marke = 0;

  _delay_ms(1000);
  lcd_clear();

} // Ende while

Leider wird nur beim ersten Durchlauf der for-Schleife der Text 
hintendrangehängt. Das verstehe ich einfach nicht :-(
Wenn ich die Inkrementierung von 'marke' testweise weglasse zeigt mein 
Display nur beim ersten Durchlauf etwas an.
Kann mir vielleicht jemand auf die Sprünge helfen?

Danke schon mal,
Gruß
Thomas

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char zeile=16, marke=0, i=0;
char ausgabe[zeile];
...
ausgabe[zeile]='\0';  // terminieren der Ausgabe !
Du schreibst über das Ende des Arrays ausgabe hinaus.
Das Array geht nur bis zeile-1.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank Stefan, das hat mir den Sonntag gerettet!

Thomas

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lcd_clear() ist eine ganz schlechte Idee... das mal nur so als gut 
gemeinten Hinweis.

Autor: Skua C:\> (skua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erspart Verenkungen
char eingabe[] = "Keine Ahnung Keine Ahnung ";

braucht man nur einmal vor den schleifen
ausgabe[zeile]='\0';  // terminieren der Ausgabe !

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael G. wrote:
>lcd_clear() ist eine ganz schlechte Idee... das mal nur so als gut
>gemeinten Hinweis.
Wie kann ich das besser machen?

Skua C:\> wrote:
>Erspart Verenkungen
>char eingabe[] = "Keine Ahnung Keine Ahnung ";
... wollte halt bei der Eingabe flexibel bleiben ...

>braucht man nur einmal vor den schleifen
>ausgabe[zeile]='\0';  // terminieren der Ausgabe !
Gut, danke!

Gruß Thomas

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:
> Michael G. wrote:
>>lcd_clear() ist eine ganz schlechte Idee... das mal nur so als gut
>>gemeinten Hinweis.
> Wie kann ich das besser machen?

Kein Clear sondern die betroffenen Zeichen einfach ueberschreiben (wenn 
Du loeschen willst mit einem Leerzeichen). Das ist sehr viel schneller 
und fuehrt dann zu keinen Artefakten, da die clear-Operation einfach zu 
langsam ist bei diesen Controllern.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überschreiben des Textes reicht tatsächlich, lcd_clear() braucht man 
nicht, aber dafür ein set_cursor(0,1); Naja, ist sicher schneller.
Die Eingabezeile länger als das Display zu machen erspart wohl auch 
einigen Ärger.
Terminieren von
ausgabe[zeile-1]='\0';
muß ich aber in jeder Schleife machen, sonst kommt wieder nur Unsinn 
raus.

Thomas

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:

> ausgabe[zeile-1]='\0';
> muß ich aber in jeder Schleife machen, sonst kommt wieder nur Unsinn
> raus.

Du überschreibst in der Schleife die Null ja auch wieder.

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.