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?
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
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
unsignedcharc;
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
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!
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
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?
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.
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".
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).
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.
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???