PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlerhafte Zeichendarstellung 4x20LCD KS0066



Natureengeneer
28.07.2012, 21:04
Hallo liebe Forengemeinde ich habe Probleme mit der Darstellung von Zeichen mit einem LCD Display 4,75mm 204A-CC-BC-3LP von RS mithilfe eines Atmega 32 gefused auf 8MHz.
Laut Shopseite soll es einen KS0066, laut Datenblatt einen KS0076B Controller besitzen. Soll wohl beides identisch sein...????
Zur Initialisirung habe ich die lcd-routines von Mikrocontroller.net genommen welche für einen HD44780waren und diese modifiziert damit das LCD richtig initialisiert wird.(.h,.c modifizierte Routines im Anhang)

Anschluss:
DB0= Databyte4
DB1= Databyte5
DB2= Databyte6
DB3= Databyte7
DB4= R/S
DB5= E
R/W=GND
Nun will ich in der main.c folgendes zur Ausgabe bringen:


/*
* main.c
*
* Created: 27.07.2012 21:09:46
* Author: Natureengener
*/


#include <avr/io.h>
#include "lcd-routines.h"

int main(void)
{
// Initialisierung des LCD

lcd_init();


lcd_setcursor( 0, 1 );
lcd_string("Zeile1");

lcd_setcursor( 0, 2 );
lcd_string("Zeile2");

lcd_setcursor( 0, 3 );
lcd_string("Zeile3");

lcd_setcursor( 0, 4 );
lcd_string("Zeile4");

while(1)
{
}

return 0;
}

Doch leider Zeigt das LCD teilweise falsche Zeichen an.(Siehe Bilder Anhang) Ohne einen 0.1uF Kondensator zwischen VSS und VDD zeigt es noch mehr Müll an.
Zudem kommt nach jedem Reset am Display etwas anderes raus.

Was mache ich nur falsch?
KS0073 war kein Problem aber dieses 0066 verweigert den Dienst strikt.

Hatte jemand auch schonmal solche Probleme und weiß vielleicht weiter?

Lieben Dank schonmal.

BMS
29.07.2012, 09:38
Hallo,
an deiner Stelle würde ich mal versuchen, die Verzögerungen zu erhöhen (Konstanten LCD_ENABLE_US , LCD_WRITEDATA_US, LCD_COMMAND_US in lcd-routines.h). So ähnlich hat sich ein Display von mir auch verhalten, als die Zeiten zu kurz waren. Dann verschluckt es schon mal Zeichen oder zeigt Mist an. Den 0,1µF Kondensator würde ich auf jeden Fall drin lassen, man kann auch noch einen Elko mit 10...100µF parallel schalten. Sind die +5V denn "sauber" oder ist da noch Restwelligkeit o.ä. drauf? Welche Verbraucher hängen noch an der 5V Leitung?
Wie lang sind die Kabel zum Display?
Die Datenleitungen D0...D3 am Display würde ich an deiner Stelle auch noch auf definiertes Potential hängen (z.B. GND).
Grüße, Bernhard

PS: Engineer ;)

Natureengeneer
30.07.2012, 07:10
OK ich habe nun die Delays weiter erhöht und D0-D3 auf GND gelegt. Beim Resetten zeigt es nun fast jedesmal identische Zeichen an jedoch teilweise immer noch falsch. Die 5V müssten sauber sein(kommen aus einem Spannungsregler) überprüfen kann ich dies jedoch leider nicht da ich im moment kein OSZI da habe.
Die Leitungen vom Board zum Display sind ca 30 cm lang.
Am Spannungsregler hängt außr dem Display sonst nichts mehr. Der Atmel sitzt auf einem AVR kit Board mit eigenem Spannungsregler.
Statt "Test" gibt es z.b. "Teww" aus.

BMS
30.07.2012, 08:58
Hallo,
die Leitungen sind ja doch relativ lang. Versuche mal, die Delays sehr lang zu machen, um zu schauen ob man so vielleicht doch weiter kommt. Vor allem die Dauer des Enable-Pulses darf größer werden.
Du kannst auch vor und nach dem Enable-Puls noch Pausen setzen:

static void lcd_enable( void )
{
_delay_us( LCD_ENABLE_US ); // kurze Pause <-- hier
LCD_PORT |= (1<<LCD_EN); // Enable auf 1 setzen
_delay_us( LCD_ENABLE_US ); // kurze Pause
LCD_PORT &= ~(1<<LCD_EN); // Enable auf 0 setzen
_delay_us( LCD_ENABLE_US ); // kurze Pause <-- hier
}
Für meine Displays habe ich da jeweils 700µs Pause drin, also relativ viel!
Und noch eine Frage: Hast du die Pins, die mit dem Display verbunden sind, auch wirklich als Ausgang geschaltet (nur um das als mögl. Ursache auszuschließen)?
Grüße, Bernhard

Natureengeneer
30.07.2012, 21:45
Ich habe versucht die ENABLE_US hochzusetzen und habe auch versucht vor und nach dem Enable ein delay einzubauen. Resultat: Ab höheren Werten als 20 uS zeigt das LCD nichts mehr an. Die zusätzlichen Delays schaffen keine Abhilfe.
Ja die Pins wurden als Ausgang geschaltet.

// verwendete Pins auf Ausgang schalten
uint8_t pins = (0x0F << LCD_DB) | // 4 Datenleitungen
(1<<LCD_RS) | // R/S Leitung
(1<<LCD_EN); // Enable Leitung
LCD_DDR |= pins;

HD44780 Controller bestellt... Die werden sich wohl hoffentlich nicht so zickig anstellen. :-)

Sind deine LCD's die du mit 700us Enablezeit fährst auch mit einem KS0066 Controller bestückt?

Danke für die Tipps.

Thomas E.
30.07.2012, 23:49
HD44780 Controller bestellt... Die werden sich wohl hoffentlich nicht so zickig anstellen. :-)
Diese Controller sind wesentlich einfacher anzusteuern und meiner Meinung nach nur halb so zickig wie die KSxxx-Serie. :)

Natureengeneer
01.08.2012, 01:40
Diese Controller sind wesentlich einfacher anzusteuern und meiner Meinung nach nur halb so zickig wie die KSxxx-Serie.

Das freut mich natürlich sehr zu hören bzw. zu lesen :-)

Crazy Harry
01.08.2012, 11:17
Hast du am Display die nicht benötigten/benutzten Datenleitungen auf GND gelegt ?

Natureengeneer
01.08.2012, 22:23
Die Datenleitungen D0...D3 am Display würde ich an deiner Stelle auch noch auf definiertes Potential hängen (z.B. GND). Ja habe ich :-)

Natureengeneer
04.08.2012, 02:17
Problem gelöst. Widerstände an den Datenleitungen und der Enableleitung hinzugefügt.

22954

Nun hab ich hier 6 Controller und alle Funktionieren sowohl HD wie auch KS.... Let's start :p