Forum: Mikrocontroller und Digitale Elektronik Laufschrift LCD


von Laufschrift LCD (Gast)


Lesenswert?

Hallo, ich versuche eine Laufschrift mit einem LCD zu realisieren. Es 
handelt sich hier um ein LCD Display mit 4 Zeilen und 20 Spalten. 
Angesteuert wird es direkt im 4Bit Mode über einen Raspberry. Als GPIO 
Schnittstelle dient PIGPIO.

Nun habe ich aber das Problem, dass meine Funkion nicht so will, wie ich 
mir es gedacht habe.

Ich möchte, dass mit jedem Aufruf der Funktion die Stelle um eins nach 
links wandert. Der Text ist in der Regel kürzer als 50 Zeichen.

Als Ausgabe bekomme ich nur "sigHandler : Unhandled signal 11, 
terminating."
1
void lcd_string_scroll(char *text, unsigned char line)
2
/* Text soll links stehend starten und nach links verschwinden.
3
 * Hinter dem letzten Zeichen soll ein Trenner zB. " *** "
4
 * eingebaut werden und danach den Text wiederholen.
5
 * | H a l l o _ W e
6
 * | a l l o _ W e l
7
 * | l l o _ W e l t
8
 * | ....
9
 * | l t _ * * * _ H
10
 * | t _ * * * _ H a
11
 */
12
{
13
    //Speichert aktuelle Position
14
    static unsigned char pos[LCD_LINES];
15
    // Speichert das letzte Array, um zu uberpruefen,
16
    // ob bei einem erneutet Aufruf der Text angepasst wurde
17
    static char *lastText[LCD_LINES];
18
19
    // Vergleicht Zeichenketten, setzt die Positon auf Anfang,
20
    // wenn diese sich unterscheiden
21
    if(strcmp(text, lastText[line]) != 0) pos[line] = LCD_ROWS;
22
23
    // Laenge der Zeichenkette bestimmen
24
    unsigned char lenText = strlen(text);
25
26
    unsigned char i;
27
    for(i = 0; i < LCD_ROWS; i++) {
28
        lcd_data(text[pos[line]]);
29
    }
30
    
31
    if(pos[line] >= lenText) pos[line] = LCD_ROWS;
32
}

von Max H. (hartl192)


Lesenswert?

Laufschrift LCD schrieb:
> Nun habe ich aber das Problem, dass meine Funkion nicht so will, wie ich
> mir es gedacht habe.
Geht das auch etwas genauer?

von Laufschrift LCD (Gast)


Lesenswert?

Hallo Max,

mehr gibt er nicht aus. Er kompiliert soweit korrekt.
Sobald in das kompilierte File starte, erhalte ich in der Konsole die 
Rückmeldung

"sigHandler : Unhandled signal 11,

und das Programm wird unerwartet beendet.

Der Text wird nicht mehr ausgegeben. Lediglich Zeile 1 wird beschrieben, 
hier ist aber nur die lcd_string (aus dem Wiki hier) eingebaut.

von Max H. (hartl192)


Lesenswert?

Laufschrift LCD schrieb:
> if(strcmp(text, lastText[line]) != 0) pos[line] = LCD_ROWS;
Kommentier das mal aus.

von Oldie (Gast)


Lesenswert?

Du zeigst, wie EINE Zeile von rechts nach links durchwandert.

Was soll mit den anderen 3 Zeilen passieren?
Sollen die sich "hochschrauben"?
Oder sollen sie parallel dazu durchlaufen?
Wie soll das aussehen, wenn die 4 Zeilen unterschiedliche
Länge haben? Das wird UNLESBAR!

Bevor du fragst, wie man es programmieren kann, solltest du
dir erst mal klarmachen, wie es aussehen soll.

von Laufschrift LCD (Gast)


Lesenswert?

Hallo Oldie,
da gebe ich dir Recht, das scheint noch nicht optimal zu sein.

Ggf. versuche ich es, das ganze noch etwas auszugliedern.

In der main wird eine Setz-Funktion aufgerufen, wenn sich der Inhalt 
geändert hat. Damit wird dann der Inhalt einer einzelnen Zeile geändert.

Eine weitere Funktion, die dann 2mal die Sekunde aufgerufen wird und 
alle Zeilen um eins nach links shiftet.

Also das die Texte unterschiedlich lang sind, ist nicht das Problem. Es 
geht um eine Anzeige für MPClient.

In der ersten Zeile wird der Artist - Titel ausgegeben. Dieser ist in 
der Regel immer länger als 20 Zeichen. In der 2. Zeile befindet sich da 
Album, falls verfügbar. Wenn der Text ausreicht fürs Display, wird hier 
nicht geshiftet.

von BirgerT (Gast)


Lesenswert?

Laufschrift LCD schrieb:
sigHandler : Unhandled signal 11,

Mal kopiert und im Suchfeld von Google eingegeben.

ok dann noch ein "Raspberry " davor getippt -->
Scheinst nicht der einzige zu sein, der mit dem Problem bei Verwendung 
von PIGPIO zu kämpfen hat..

https://www.raspberrypi.org/forums/viewtopic.php?f=81&t=77337

Hoffe, dass die Anregung hilft..
Und es wäre schön, wenn hier die Lösung gepostet würde.

von Karl H. (kbuchegg)


Lesenswert?

BirgerT schrieb:
> Laufschrift LCD schrieb:
> sigHandler : Unhandled signal 11,
>
> Mal kopiert und im Suchfeld von Google eingegeben.

Da brauchst du nicht lange suchen.
Wer mit NULL-Pointer in strcmp reingeht, braucht sich nicht wundern wenn 
alles abkratzt.

Fazit: wieder mal viel zu viel 'Funktionalität' auf einmal programmiert.

Das hier
1
    unsigned char i;
2
    for(i = 0; i < LCD_ROWS; i++) {
3
        lcd_data(text[pos[line]]);
4
    }
ist auch Unsinn.

Fang langsam an!
Erst mal einen Text ausgeben. Von nur einer Zeile.
Dann überlegen, wie man die Startadresse des Textanfangs bei jedem 
Aufruf durch die Zeile durchzieht.
Und dann erst die ganzen Spezialfunktionalitäten, wie zb das 
Berücksichtigen eines Textwechsels. Oder dass die Funktion mit mehreren 
Zeilen umgehen kann.
Schrittweise vorgehen und lieber kleine Schritte machen als einen 
grossen und dann auf die Schnauze zu fallen.

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.