ich habe das große Problem das mein LCD nur ganz schwer in die Gänge kommt. Wenn es einmal funktioniert, dann klappt das ganz gut. Aber wehe ich nehm die Spannung weg, dann kann ich Stunden zubringen das etwas angezeigt wird. Dann resete ich unendliche male den µC und/oder nehme vom LCD die Spannung weg bis es dann endlich wieder etwas anzeigt.
Die eigentliche Initialisierungsroutine habe ich vom Projekt der DCF-77 Funkuhr übernommen und dann wegen den Probleme versucht mittels Datenblatt nochmal zu ändern mit mehr oder weniger längeren Wartezeiten. Es wird per SPI angesprochen.
// SI von LCD auf P1.1 (R8C13 Pin 14)// CLK von LCD auf P1.2 (R8C13 Pin 13)// RS von LCD auf P1.3 (R8C13 Pin 12)#define SI p1_addr.bit.b1#define CLK p1_addr.bit.b2#define RS p1_addr.bit.b3
// 8 Bits eines Bytes hintereinander an das LCD senden (SPI)void send_byte_to_lcd(char byte){int i;for (i = 0; i < 8; i++) { CLK = 0; SI = ((byte&128) != 0); byte <<= 1; CLK = 1; wait_us(50);};};
// LCD "EA DOGM162" initialisierenvoid int_lcd162(void){wait_ms(1000);RS = 0; // RS = LOW, Kommandossend_byte_to_lcd(0x39);// Function Set, 0 0 1 1 1 0 0 1send_byte_to_lcd(0x1C);// Bias Set, 0 0 0 1 1 1 0 0send_byte_to_lcd(0x52);// Power Control, 0 1 0 1 0 0 1 0 send_byte_to_lcd(0x69);// Follower Control, 0 1 1 0 1 0 0 1send_byte_to_lcd(0x74);// Contrast Set, 0 1 1 1 0 1 0 0send_byte_to_lcd(0x38);// zurück Instruction Table 0 send_byte_to_lcd(0x0C);// Display ein, Cursor aus, ohne Cursor blinken//send_byte_to_lcd(0x0F);// Display + Cursor ein + blinkensend_byte_to_lcd(0x01);// Clear Displaywait_ms(2);send_byte_to_lcd(0x06); // Cursor Auto Increment};
// ********* Hauptprogramm *******void main(void){ unsigned long int cnt; // Frequenz uint len; uint range; // Torbereich 0 ... 6 uint wert; // Wert des AD-Wandlers uchar chan; // Mess-Kanal chan=6 uchar tast; // Taster uint wertAD5; // Messwert 10 bit long voltAD5; // Spannung in Volt asm("FCLR I"); // Interrupt verhindern OSC_Ext_20Mhz(); // ext. Oszillator mit 20 MHz prc1 = 0; // Protection Port 1 ausschalten p0 = 0xfd; // Port 0 setzen prc2 = 1; // Protect 2 aus pd0 = 0b11110001; // P0.0 und P0.4 bis P0.7 Ausgang, // AN4 bis AN6 (P0.1 bis P0.3 AD Kanal 4 bis 6 Eingang // Protect 2 geht von selbst wieder an pd3 = 0x0e;// Port 3, Bit 3, 2, 1 sind Ausgänge p3 = 0x04;// SCK=Low, CS=High, MAX6675 pd1 = 0b11001111; // Port Direction 1.0 bis 1.3 und 1.6 // und 1.7 auf Ausgang setzen, nur LCD p1 = 0x00; int_lcd162();// EA DOGM162 LCD initialsieren asm("FSET I"); // Interrupt erlauben Count1 = CountLimitBremse;// Gleichsetzung Zählerstart while (1)// Loop \\ {
ich habe dann vor lauter Verzweiflung die Reihenfolge im Hauptptogramm geändert und extra die Ports wo das LCD angeschlossen ist nochmal auf 0 gesetzt vorm Aufruf der LCD Initialisierung. Zumindestens scheint es für einen normalen Reset besser zu funktionieren, zum Bsp. nach einem flashen. Aber egal was ich mache, hin und wieder erscheinen auch danach wilde Zeichen oder das Display wird als eine große Zeile angesprochen und zeigt Müll an.
Was kann oder muß ich ändern? Ist die SPI Ansteuerung so empfindlich?
Am LCD ist ein 100nF Keramik und ein 100µF Elko.
Der µC ist auf einer geätzten Platine, von dort ab gehen gesteckte Drähte auf mein Steckbrett worauf sich das LCD befindet.
Tschau
Mr. Teflon
(oft edititiert um den Code wegen Platzverhältnissen leserlicher zugestalten)