LCD an IOW24 nach langem Suchen zum laufen gekriegt :-)

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
blip
Posts: 12
Joined: Sun May 09, 2004 11:49 am
Location: Winznau, Switzerland
Contact:

LCD an IOW24 nach langem Suchen zum laufen gekriegt :-)

Post by blip »

Hallo zusammen,

ich hätte eine Bitte. Da ich zwei LCDs (also nicht gleichzeitig ;-) einfach
nicht zum laufen kriege, möchte ich nun gerne wissen ob es an
meinem Programm liegt oder ob beide LCDs defekt sind.
Da ich sowas schon im Forum gelesen habe: Mein Kabel zum LCD
ist ca 25 cm lang, daran kanns also wohl nicht liegen - ich hab auch
schon alle Pins durchgemessen ob diese wirklich Kontakt haben.

Könnte mal jemand (wayoda ?) das Programm bitte testen und mir
sagen ob es funktioniert ?

Bei mir zeigt die obere Zeile des LCD alle Pixel schwarz, die untere
Zeile alle Pixel hell; sofort nach Anschliessen des IOW und völlig
unbeeindruckt von aufrufen des Programms (halt immer gleich).

Code: Select all

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>

#include "iowarrior.h"

int read_w_timeout(int fd, char *data, int size, int sec)
{
        int ret;
        fd_set fds;
        struct timeval timeout;

        timeout.tv_sec = sec;
        timeout.tv_usec = 0; 
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        if((ret=select(fd+1, &fds, NULL, NULL, &timeout)) == 0) {
                return(0);      /* timeout */
        } else if(ret > 0) {
                return(read(fd, data, size));
        }
        return(-1);
}

int main (int argc, char **argv)
{
        int fd, i;
        unsigned char data[9];

        if((fd = open("/dev/usb/iowarrior1", O_RDWR)) < 0) {
                perror("iowarrior if1 open");
                return(1);
        }
        data[0]=0x04;   /* special mode: LCD */
        data[1]=0x01;   /* enable */
        if(ioctl(fd, IOW_WRITE, &data) != 0) {   
                printf("error in write ioctl\n");
        }
        data[0]=0x05;   /* command: lcd write */
        data[1]=0x03;   /* r0000nnn => 3 bytes to register 0 */
        data[2]=0x38;   /* 8 bit data, 2 lines display */
        data[3]=0x0f;   /* cursor on and blink */
        data[4]=0x01;   /* clear display and put cursor home */
        if(ioctl(fd, IOW_WRITE, &data)) {
                printf("error in write ioctl\n");
        } else {
                printf("LCD should be on now\n");
        }
        if(read_w_timeout(fd, (char *)&data, sizeof(data), 2) != 0) {
                printf("packet #%02x : ", data[8]);
                for(i=0; i<8; i++) {
                        printf("%02x ", data[i]);
                }
                printf("\n");
        } else {
                printf("read timeout ?!\n");
        }
        data[0]=0x04;
        data[1]=0x00;
        if(ioctl(fd, IOW_WRITE, &data) != 0) {
                printf("error in write ioctl\n");
        }
        printf("Disabled LCD mode\n");
        close(fd);
        return(0);
}
Last edited by blip on Sun Mar 18, 2007 3:28 pm, edited 1 time in total.
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Testen kann ich leider nicht, da ich leider in der letzten Woche mein LCD durch Verpolen der Versorgungsspannung in einen Briefbeschwerer verwandelt habe :-(

Aber der Code sieht eigentlich Ok aus, daher nun folgende Fragen:
Normaler HD44780 Controler?
Gibt es eine Hintergrundbeleuchtung, wenn ja : wird sie nach dem Einschalten des Lcd-Mode aktiv und nach dem Ausschalten wieder dunkel?

Schon mal am Kontrast-Poti des Lcd gedreht, bei mir waren am auch nur schwarze Kästchen, weil der Kontrast zu hoch war.

Eberhard
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Wenn das Display initialisiert müsste die zweite Zeile auch aktiv werden und typischerweise werden die beiden Zeilen blasser als im Ruhezustand.

Was passiert denn mit den im SDK befindlichen Beispielen und wie verhält sich das Display wenn man die Daten "von Hand" mit SimpleHIDwrite schreibt?
blip
Posts: 12
Joined: Sun May 09, 2004 11:49 am
Location: Winznau, Switzerland
Contact:

Post by blip »

@wayoda:

Ja, normaler HD44780 Controller. Bei Display 1 (2x20 chars) sicher,
da ich die Chipbeschriftung lesen kann - dieses hat keine Hintergrund
beleuchtung, das andere (2x8 chars) soll angeblich 100% kompatibel
sein, hat aber nur 1 "scheisshäufle-ic".
[edit]
So, mal nen BC560 ausgegraben und eingelötet - ja, Hintergrund
LEDs schalten sich ein beim aktivieren des special modes und aus
beim deaktivieren.

Kontrastregler probiert, der funktioniert - kann zwischen ganz hellem
Display und eben den schwarzen Pixeln in der oberen Zeile regulieren.
Ist das ein Indiz, dass der HD44780 "irgendwie" noch lebt, oder nicht ?

@guido körber:
Die erste Zeile wird nicht blasser, es ändert sich gar nichts.
Im neuen SDK habe ich irgendwie nur sourcecode zum iowkit gefunden, den ich nicht compiliert kriege (habe kein cmake)
Das alte SDK finde ich nicht mehr, habe aber diverse andere
Beispiele probiert die hier mal rumgeisterten, ohne Erfolg.

Daten "von Hand" mit SimpleHIDwrite schreiben weiss ich leider
nicht wie das geht :oops: - falls der Zweck der Übung sein
soll zu testen, ob der IOW überhaupt geht, das tut er.
Die LED z.B. kann ich zum blinken bringen und auch einen LM75
problemlos der I2C ansteuern.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Richtiges Interface in SimpleHIDwrite auswählen, die Eingabefelder sind dann die ReportID und die sieben Datenbytes. Einfach von Hand die Reports bauen und an den IO-Warrior schicken.
blip
Posts: 12
Joined: Sun May 09, 2004 11:49 am
Location: Winznau, Switzerland
Contact:

Es läuft !!!

Post by blip »

So, endlich nun (nach über einem Jahr) den IO-Warrior wieder ausgegraben
und hartnäckiger probiert.

@guido:
HIDSimpleWrite konnte/kann ich nicht nutzen, weil ich keine Microsoft-Windows
Rechner habe.

Mit Hilfe ähnlicher Threads im Forum hier kam ich der Sache auf die Spur:
Bei einem Lese-Report (06) erhielt ich zwar eine Antwort
(06 06 20 20 20 20 20 20), aber auf dem Display nichts.

Die Lösung: Die Kabellänge !!! 25 cm sind offenbar zu viel,
selbst 20 cm gingen nicht, jetzt hab ich etwa 10cm und es läuft !

Kann immer noch nicht glauben, dass die HD44780 Controller so furchtbar zickig sind !!!
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Ist das mit einer eigenen Platine aufgebaut, oder mit einem Starterkit?

Normalerweise sollten die 25cm Kabel kein Problem sein, sowas haben wir auch an unseren Displays.
blip
Posts: 12
Joined: Sun May 09, 2004 11:49 am
Location: Winznau, Switzerland
Contact:

Post by blip »

Es ist mit dem Starterkit aufgebaut.

Nur mal interessehalber: Weshalb verursachen zu lange Kabel Probleme?
Werden da wegen der kapazitiven Belastung die Signalflanken zu verwaschen?
Wenn ja, würde da ein zwischengeschalteter z.B. 74LS244 o.ä. helfen ?
Oder ist evtl. die Spannung das Problem ? Ich messe 5.05 V am Display,
sollte eigentlich nicht das Problem sein; ich habe aber kein Oszi sodass
ich natürlich nicht sehen kann was die Versorgungsspannung macht
wenn "das Display arbeitet".
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Die Signale leiden aufgrund mehrerer Effekte: Kapazität, Widerstand, Induktivität und Übersprechen. Einen Buffer dazwischen zu packen kann helfen, der muss aber für die Daten bidirektional sein.

Allerdings ist es ungewöhnlich, dass schon bei einem so kurzen Kabel ein Problem auftritt.
Post Reply