Forum: Mikrocontroller und Digitale Elektronik LCD Ansteuerung (PIC 18F1220)


von Gerrit (Gast)


Lesenswert?

Hi! Ich bins nochmal, direkt mit meinem Problem von gestern Abend, was 
ich hoffentlich mit euch auch noch schnell gelöst bekomme! :D

Das Problem ist, dass bei meinem LCD nur Zeichen der untersten Zeile 
geschrieben werden! D.h. ich habe beim Lower 4-bit immer "1111"...

Im übrigen, da ich mich in die PICs gerade als absoluter Newbie (was 
Mikrocontroller angeht) einarbeite, sieht so ein Befehl bei mir wie 
folgt aus:
1
    PORTB=0b00010011;
2
    PORTB=0b00010010;
3
    PORTB=0b00000111;
4
    PORTB=0b00000110;
5
    pause();

Zu den Bits:
PORTB:   7   6   5   4   3   2   1   0
         |   |   |   |   |   |   |   |
LCD:     -   -   D7  D6  D5  D4  RW  E

Das oben sollte dann ja ein "A" erzeigen... Ich erhalte aber eine "0"

Wie kann das sein?

von Michael R. (mexman) Benutzerseite


Lesenswert?

Gerrit schrieb:
> Hi! Ich bins nochmal, direkt mit meinem Problem von gestern Abend, was
> ich hoffentlich mit euch auch noch schnell gelöst bekomme! :D


Hallo Gerrit,

1. ist bei aus den paar Zeilen kein TIMING zu erkennen.
Schau DIr das Datenblatt des Displays mal an und da steht, welcher 
Befehl wie lange anliegen muss.

Dann verstehe ich ueberhaupt nicht, warum hier hunderte "newbies" so 
viele Probleme haben.
Man schiesst den PIC an den Emulator im Singlestep Betrieb an, und kann 
so prima in jedem Schritt feststellen, welche Pegel an den Pins liegen 
und ob das mit den Datenblattangaben uebereinstimmt.
Dafuer reicht ein Multimeter oder Logikstift und so erkent man gleich 
jeden Leitungsdreher.
Wenns dann im Singlestep-Betrieb geht, laesst man dem Teil freien Lauf 
und dann kann alles nur noch am TIming liegen.
Dann probiert man alles Grundfunktionen der Initialisierung:
Kann ich alle Zeilen (bei mehrzeiligen LCD) ansteuern, steht das 
richtige Zeichen an der richtigen Position, funktioniert CLear Display, 
Unterstreichen,  Blinken......

Jetzt hoer ich schon "ich habe aber keinen Emulator, keinen 
Singlestepbetrieb"...... ja sorry.... ich kann auch mit nur einem 
13er-Gabelschluessel keine Mondrakete und ohne Inbusschluessel nicht mal 
ein IKEA Regal zusammenbauen.....

Gruss



Michael

von Frank K. (fchk)


Lesenswert?

Gerrit schrieb:

> Im übrigen, da ich mich in die PICs gerade als absoluter Newbie (was
> Mikrocontroller angeht) einarbeite, sieht so ein Befehl bei mir wie
> folgt aus:
>
>
1
>     PORTB=0b00010011;
2
>     PORTB=0b00010010;
3
>     PORTB=0b00000111;
4
>     PORTB=0b00000110;
5
>     pause();
6
>

<Ohrfeige>
Du hast doch eben gelernt, dass man nicht auf PORTB schreibt, sondern 
auf LATB?!
</Ohrfeige>

> Zu den Bits:
> PORTB:   7   6   5   4   3   2   1   0
>          |   |   |   |   |   |   |   |
> LCD:     -   -   D7  D6  D5  D4  RW  E

Ungeschickt gewählt. Die Datenbits ganz unten wäre besser:

PORTB:   7   6   5   4   3   2   1   0
         |   |   |   |   |   |   |   |
LCD:     -   -   RW  E  D7  D6  D5  D4


Dann hättest Du schreiben können:
1
#define LCD_RW LATBbits.LATB5
2
#define LCD_E  LATBbits.LATB4
3
4
unsigned char c;
5
6
c='A';
7
LCD_RW=0; // Zum Schreiben muss RW auf 0, nicht auf 1 
8
// hier oberes Halbwort
9
LATB&=0xf0;
10
LATB|=(c>>4);
11
// Puls auf E
12
LCD_E=1;
13
LCD_E=0;
14
// hier unteres Halbwort
15
LATB&=0xf0;
16
LATB|=(c&15);
17
// Puls auf E
18
LCD_E=1;
19
LCD_E=0;

Mit den #define's wird das ganze sehr viel übersichtlicher, nicht wahr?

fchk

von Gerrit (Gast)


Lesenswert?

Die Ohrfeige nehme ich an! Das Programm war nunmal noch von gestern 
Abend und noch nicht umgeschrieben... aber jetzt ist alles auf LATx 
gestellt! Was hier aber nicht das Problem ist.

Zum Thema Timing: Nur bei der Initialisierung und zwischen einzelnen 
Schreib-Befehlen sind entsprechende Pausen eingebaut. Laut sprut.de soll 
man angeblich keine weiteren Pausen benötigen.

Debugging läuft prima und die Pins werden auch in jedem Step einwandfrei 
angesteuert (ja, habs geprürft!) ... am angelegten Ton merke ich aber, 
dass solche "Newbie" Anfrage zu Problemen, welche sich nicht mal eben 
ergooglen lassen, hier wohl nicht gerne gesehen werden. Sollte das so 
sein, dann lass ich es in Zukunft einfach bleiben und quäl mich ab oder 
lass das ganze einfach ganz bleiben.

Ich werde mich morgen Abend nochmal ran machen und die Timings der 
Signale genauer überprüfen.

Bis hierhin: DANKE!

von Michael R. (mexman) Benutzerseite


Lesenswert?

Hallo Gerrit,

> Debugging läuft prima und die Pins werden auch in jedem Step einwandfrei
> angesteuert (ja, habs geprürft!) ... am angelegten Ton merke ich aber,

Dann wird wohl auch das richtige angezeigt!
Das heisst: Statisch (langsam) geht alles.
Jetzt noch im LCD-Datenblatt finden, dass die Flankensteilheit an "E" 
kritisch ist und keine 50cm lange Flachbandeitung benutzen und dann ist 
ja alles i.O.
War also doch das Timing!

> ... und quäl mich ab .....

das ist sicherlich nicht das verkehrteste.
Alle, die hier die besten Tipps geben, haben das genau so in der 
PreInternetZeit gelernt und vergessen das nie mehr.
Haben allerding gelernt, ihre Probleme systematisch zu loesen anstatt 
loesen zu lassen, auch wenns laenger dauert!

Gruss

Michael

von Gerrit (Gast)


Lesenswert?

Also, ich habe mich wieder ran gesetzt und komm einfach nicht drauf 
klar... An meiner Pinbelegung hat sich nichts geändert. Habe aber bei 
der initialisierung für mich unerklärliche Probleme.

Die initialisierung funktioniert nicht immer. Wenn doch, springt der 
Cursor an die letzte Stelle in der zweiten Zeile! Wenn ich aber anstatt 
der ganzen aufrufen von "LCD_set();" die eigentlichen Befehle direkt 
eintrage, springt der Cursor an die 1. Stelle?!?!? Wie kann das bitte 
möglich sein?
1
void LCD_ini(void) {
2
    Delay10KTCYx(100);    //3x (8-Bit)
3
    LATB=0b00001100;
4
    LCD_set();
5
    Delay10KTCYx(20);
6
    LATB=0b00001100;
7
    LCD_set();
8
    Delay10KTCYx(1);
9
    LATB=0b00001100;
10
    LCD_set();
11
12
    LATB=0b00001000;    //Auf 4-Bit stellen
13
    LCD_set();
14
15
    LATB=0b00001000;    //1. Befehl (font...)
16
    LCD_set();
17
    LATB=0b00110000;
18
    LCD_set();
19
20
    LATB=0b00000000;    //2. Befehl (Display off)
21
    LCD_set();
22
    LATB=0b00100000;
23
    LCD_set();
24
25
    LATB=0b00000000;    //3. Befehl (Display clear)
26
    LCD_set();
27
    LATB=0b00000100;
28
    LCD_set();
29
30
    LATB=0b00000000;    //4. Befehl (Settings)
31
    LCD_set();
32
    LATB=0b00011000;
33
    LCD_set();
34
}
35
36
void LCD_set (void) {
37
    LATBbits.LATB0=1;
38
    LATBbits.LATB0=0;
39
}

von Joachim J. (felidae)


Lesenswert?

kannst du mal das Datenblatt des LCD's posten?

bei meinen ATmega32 ist der ISP programmer an den pins von PORTB wenn 
ich den programmire bekommt das lcd auch signale, was das lcd dann 
verstell.
erst wenn ich die spannungszufur aus und wieder an schalte funktionirt 
es.

von Der Rächer der Transistormorde (Gast)


Lesenswert?

Gerrit schrieb:
> Die initialisierung funktioniert nicht immer. Wenn doch, springt der
> Cursor an die letzte Stelle in der zweiten Zeile!

Bei LCD's ist das einschalten oft kritisch.  Wenn deine Software nicht 
wiederholbar das gleiche macht kann! (unter vielen andere Möglichkeiten) 
es daran liegen das kein Reset im Display erfolgt. Da viele keinen Reset 
eingang haben macht man das mit aus/einschalten.


Ohne das Datenblatt ist es aber "Gestocher im Nebel".

von Joachim J. (felidae)


Lesenswert?

datenlatt meines LCD:
               RS RW db7 db6 db5 db4 db3 db2 db1 db0
Display clear: 0  0  0   0   0   0   0   0   0   1

dann wird im 4bit mode erst db4-7 und dann db0-3 übertragen.

für dich hise das


LATB=0b00000000;
LCD_set();
LATB=0b00000100;
LCD_set();

von Joachim J. (felidae)


Lesenswert?

ich initialisire gleich im 4bit mode


LATB=0b00001000;
LCD_set();
LATB=0b00001000;
LCD_set();

LATB=0b00001000;
LCD_set();
LATB=0b00100000;
LCD_set();

dann das clear hiterher

LATB=0b00000000;
LCD_set();
LATB=0b00000100;
LCD_set();

von Gerrit (Gast)


Angehängte Dateien:

Lesenswert?

joachim j. schrieb:
> bei meinen ATmega32 ist der ISP programmer an den pins von PORTB wenn
> ich den programmire bekommt das lcd auch signale, was das lcd dann
> verstell.
nein, hier überschneidet sich nichts. ich muss aber so und so das ganze 
breadboard ausschalten, damit das lcd resetet.

Der Rächer der Transistormorde schrieb:
> Ohne das Datenblatt ist es aber "Gestocher im Nebel".
leider habe ich kein datenblatt. das einzige was ich weiß ist: "HD44780 
1602 LCD Modul Display Anzeigen 2X16 Zeichen" -siehe ebay! :D und 
demnach habe ich das datenblatt aus dem anhang benutzt, was "scheinbar" 
ja auch funktioniert... naja, manchmal! und wenn, dann bekomm ich immer 
noch nur zeichen aus der letzten zeile (weiter oben schonmal 
beschrieben).

von W.S. (Gast)


Lesenswert?

Gerrit schrieb:
> habe ich das datenblatt aus dem anhang benutzt, was "scheinbar"
> ja auch funktioniert...

Das Display ist offensichtlich ein Standard-Alpha Display. Da sollte es 
wohl kein Problem sein, dafür ein Datenblatt zu finden und die 
LCD-Ansteuerung danach zu schreiben.

Vielleicht könntest du mal nachlesen, wieviel Zeit der Controllerchip im 
Display nach dem Reset bzw. Einschalten und nach manchen Befehlen 
braucht, ehe er überhaupt in der Lage ist, Daten oder Kommandos 
anzunehmen. Wäre hilfreich.

W.S.

von Gerrit (Gast)


Lesenswert?

also, ich kanns ja selbst kaum glauben, aber ich kann endlich Zeichen 
ausgeben! ENDLICH!

Das ganze läuft dann z.B. so:
1
LCD_print('H');
2
LCD_print('a');
3
LCD_print('l');
4
LCD_print('l');
5
LCD_print('o');
6
LCD_print('!');

Ich weiß zwar nicht warum, aber das einzige was die ganze Zeit gefehlt 
hat war folgender Befehl am Ende der Initialisierung:
1
LATB=0b00001000;    // LCD clear!!!!
2
LCD_set();

So, jetzt hab ich noch eine letzte Frage: Ich hab einen Poti 
angeschlossen, dessen Spannung gemessen wird. Das Messergebnis kommt in 
ne int speicher in der dann z.B. bei 2,5V etwa 510 steht. Wie kann ich 
z.B. die "5" als Char in die LCD_print(); übergeben???

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.