PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Anzeige und PIC16F873



T2000
12.05.2005, 18:59
Hallo alle zusammen,

bräuchte mal 'nen kleinen Tip beim Ansteuern eines LCD-Displays (2x20)
mit dem 16F873.

Habe zum Testen mal das 1. LCD-Programmbeispiel von www.fernando-heitor.de/ kompiliert und gebrannt.
Die Hardware habe ich auch genauso aufgebaut wie von ihm beschrieben.

Leider erscheint bei mir auf dem Display kein Text, sondern beide Zeilen
werden vollkommen schwarz angezeigt ( also alle 20 Stellen der beiden Zeilen werden als schwarze Blöcke angezeigt).
Die Hardware habe ich schon min. 3-mal durchgecheckt. Scheint zu stimmen.
Das Programm sollte ja eigentlich auch stimmen.

Vielleicht hat ja jemand von euch das Beispiel schonmal ausprobiert.

Ansonsten : Woran kann es liegen, das beide Zeilen vollständig schwarz
angezeigt werden, wenn ich den Prozessor einschalte (vorher
wird natürlich nur eine Zeile angezeigt )und nicht der
gewünschte Texte ?

Vielen Dank schonmal für eure Hilfe.

MFG

BlackBox
13.05.2005, 07:06
Hast Du mal versucht den Kontrast einzustellen?

13.05.2005, 08:31
Ja, habe ich.
Habe ein Poti zwischen Pin3 der LCD-Schnittstelle und Ground gelegt,
nur wenn ich am Poti drehe ändert sich nur der Kontast der beiden Zeilen
mit den vollständig schwarzen Zeichenfeldern, aber es kommt kein Text zum vorschein.

Habe ich irgendetwas simples übersehen ?

MFG

BlackBox
13.05.2005, 08:47
Ja, habe ich.
Habe ein Poti zwischen Pin3 der LCD-Schnittstelle und Ground gelegt,
nur wenn ich am Poti drehe ändert sich nur der Kontast der beiden Zeilen
mit den vollständig schwarzen Zeichenfeldern, aber es kommt kein Text zum vorschein.


Zwischen Pin3 und GND oder wie im Schaltbild unter http://www.fernando-heitor.de/pic/projekte/lcdsteuerung/schaltung.htm das Poti zwischen +5V und GND und den Schleifer auf Pin3?

Bist Du dir sicher, dass der richtige Kontroller ( HD44780 oder kompatibler) in deinem Display steckt? Ist zwar eigentlich fast Standart aber es gibt auch andere.

Goblin
13.05.2005, 10:35
check mal die enable-leitung.
ausserem: ist in der software am anfang ne pause, um das display zu initialisieren? ist es überhaupt initialisiert? die dinger brauchen nen paar millisekunden, bis die die ersten daten empfangen können.

T2000
13.05.2005, 19:19
Das Display ist von datavision, ich glaube die arbeiten alle mit dem HD44780.

Nach dem Sofware-Beispiel von Heitor sollte es nach der Initialisierungsroutine genau richtig initialisiert werden.
Wie finde ich denn heraus, ob es initialisiert wurde ?

MFG

Goblin
14.05.2005, 10:35
mmjaaa.. k.a. wenn es danach funktioniert, vermute ich! :) ich weiss nicht, musst mal ins datenblatt gucken, obs da irgend ne rückmeldung gibt, wenn das ding initialisiert ist

Ciclope
14.05.2005, 11:50
Hallo also rausfinden kannst du es nictht. Entweder zeigt es dann die Zeichen an die zum LCD schickst dann ist alles ok oder nicht!!!!
Poste mal ein wenig Code von der INIT Routine.Nutzt du den 4 Bit oder 8 Bit Modus.Mir scheint es so als wenn das LCD nicht richtig Initialisiert ist.

Gruß

T2000
15.05.2005, 16:17
Ich habe das Display im 4-Bit-Modus initialsiert.
Hier ist der LCD-Initialisierungs-Code aus der LCD-Routine :
(habe die restlichen Funktion dieses Codes zwecks Postens weggelassen,
weil der relativ lang ist , ich hoffe das reicht):

lcdanzeige.c :

/*Die Pins RC4-RC7 werden zum Schreiben als Ausgänge definiert (LCD_WRITE), und zum Lesen als Eingänge (LCD_READ).*/
struct port_b_layout const LCD_WRITE={0,0,0,0,0};
struct port_b_layout const LCD_READ={0,0,0,0,15};

/* Hier kann der Typ der Anzeige definiert werden
( 0=5x7, 1=5x10, 2=2 lines )*/
#define lcd_type 2

/*verschiedene Eigenschaften der LCD-Anzeige
0x0C = Display an
0x01 = Display löschen
0x06 = Adresspointer inkrementieren und Displayinhalt nicht verschieben */
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0x0C, 0x01, 6};



/* Initialisierung des LCD-Displays. Die verschiedenen Eigenschaften der Anzeige werden hier übertragen.*/
void lcd_init()
{
byte i;

set_tris_b(LCD_WRITE);
portb.rs = 0; // siehe 4-Bit Initialisierung (LCD-Datenblatt)
portb.rw = 0;
portb.enable = 0;
delay_ms(15); // 15 ms Pause
for (i=1;i<=3;++i)
{
lcd_send_nibble(3); // 3-mal 0011 mit mind. 5ms Pause
delay_ms(5);
}
lcd_send_nibble(2); // 0010 = 4-Bit Interface
for (i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}

Ciclope
16.05.2005, 13:57
Hallo ,

Probiere es mal damit ist zwar mit dem CC5x erstellt aber dürtfe kein Problem sein es auf den CSS umzuschrieben.
Deine Init Routine kann so nicht funktionieren. Es müßen schon einige Schritte mehr durchgeführt werden damit das LCD richtig Initalisiert wird.

Siehe meine INIT Routine.


void LCDInit(void)
{
int i;
pause(100);
// Die RS (Register-Select)-Leitung bestimmt,ob die übertragenen Daten als Zeichen in den Textpuffer (RS=1)
// oder als Befehl in ein Steuerregister (RS=0) geschrieben werden

lcdport&=~LCD_RS; // RS Off auf Kontrollregister umschalten jetzt können Kommandos gesendet werden Bit löschen
PORTD=lcdport;

lcdport&=~LCD_RW; // R/W Off to send data to display
PORTD=lcdport;

for(i=0; i<3; i++)
{
PORTD= 0b00110000; //1 - 3 8 Bit Mode anwahl
OutPortD3=1; //Enable Leitung Daten schreiben EIN
NOP;
OutPortD3=0; //Enable Leitung Daten schreiben AUS
pause(5);
}

// 4 Bit Mode High and Low nible transfer
PORTD = 0b00010000; // 4 4 Bit Daten Modus EIN
OutPortD3=1;
NOP;
OutPortD3=0;
pause(10);

LCDWriteByte(0b00000001); // LCD löschen + Home
pause(10);

LCDWriteByte(0b00101000); // 2 Zeilig
pause(10);

LCDWriteByte(0b00001000); // LCD Off
pause(10);

LCDWriteByte(0b00000110); // Entry Mode , Inc , Dis
pause(10);

LCDWriteByte(0b00000011); // Cursor Home
pause(10);

LCDWriteByte(0b00001111); // Display On

lcdport|=LCD_RS; // RS On umschalten auf Datenregister Bit setzen
PORTD=lcdport; // wieder auf Textpuffer wechseln jetzt können wieder Textzeichen gesendet werden

}


Gruß Roberto

16.05.2005, 18:32
Vielen Dank,

werd' ich mal ausprobieren.

Grüsse

01.06.2005, 08:58
Hallo zusammen
gibt sein Unteschied wenn man mit Spi oder I2c arbeiten muss
danke

01.06.2005, 09:00
Ich versuche ein Dotmatrix LCD mit I2C -Bus Eingang zu steuern aber es gelingt mir gar nichts hat jemand ein Programm um das LCD zu stueren

the_Ghost666
03.06.2005, 14:29
ja, SPI braucht eine Daten, eine Clock und eine Enable leitung, wenn ich mich nicht täusche, i2c nur Daten und Clock, ausserdem musst du bei i2c erst den passenden chip mit seiner adresse anrufen, dann kannst du ihm daten senden, spi sendet einfach so ein byte aus dem passenden register, für i2c musst du erst ein startsignal senden usw. ausserdem braucht man für das SPI nur ein SSP Modul im PIC, für I2C braucht man einen ganzen satz unterprogramme oder ein MSSP modul wie in den neuen, teueren PICs.