SChönen guten Tag! Ich habe hier ein STK300 mit einem ATmega128. Nun soll ich da ein LCD anschließen und ansteuern können. Auf dem LCD ist ein HD44780! Ich habe gelesen, was programmiert und es geht einfach nichts! :-( Das LCD ist aber funktionsfähig! Mit dem Enable, RS und RW verstehe ich ja! Aber wie sage ich dem Mikrocontroller, dass ein LCD angeschlossen ist! Beim ATmega128 muss ich ja den Externen Speicher benutzen und das LCD halt wie einen Speicher ansprechen! Aber wie??? Ich will erstmal einfach nur einen Buchstaben auf dem LCD stehen sehen und ich wäre schon glücklich! Das ganze programmiere ich in C, da es einfacher sein soll! Danke für eure Hilfe...
Du brauchst es dem µC gar nicht sagen. Nimm einfach irgendwelche PORTS und weise die richtigen Bits zu. Damit meine ich, dass das LCD nicht an der Speicherschnittstelle hängen muß. Wie die richtigen Ansteuerung funktioniert steht im Datenblatt des LCD Controllers. Da ist auch schon in einem Ablauf erklärt wie das Display richtig initialisert werden muß. Der Fehler liegt bestimmt in der Init. ! Auf dieser Seite findest auch einige Beispiele zum LCD. Max
LCD - µC PA0 - Data0 PA1 - Data1 PA2 - Data2 PA3 - Data3 PA4 - Data4 PA5 - Data5 PA6 - Data6 PA7 - Data7 PC6 - RegSel PC7 - Enable So ist es laut Schaltplan! Ich müsste an PortA Befehle setzen und dann das LCD auf Enable stellen, dass sich das LCD den Befehl abholt und verarbeitet! Ich habe eine Wartezeit eingebaut, um mich erstmal nicht um das BusyFlag zu kümmern! Es passiert aber nichts! Muss ich da noch dem LCD eine Adresse zuordnen?
µC - LCD ------------ PA0 - Data0 PA1 - Data1 PA2 - Data2 PA3 - Data3 PA4 - Data4 PA5 - Data5 PA6 - Data6 PA7 - Data7 PC6 - RegSel PC7 - Enable? *PA0 -> PortA Pin0
R/W liegt hoffentlich an GND. Vielleicht ist das Timing nicht ganz richtig, auch das findet man im Datenblatt sehr gut beschrieben. Zeig doch mal deinen Code.
HEADER-DATEI //Bitmasken #define BIT7 0x80 #define BIT6 0x40 #define BIT5 0x20 #define BIT4 0x10 #define BIT3 0x08 #define BIT2 0x04 #define BIT1 0x02 #define BIT0 0x01 //LCD-Befehlsmasken #define LCD_ON 0x0F #define LCD_CURS_ON 0x0D #define LCD_OFF 0x08 #define LCD_HOME 0x02 #define LCD_CLEAR 0x01 #define LCD_NEW_LINE 0xC0 #define LCD_FUNCTION_SET 0x38 #define LCD_MODE_SET 0x06 //LCD enable/disable high/low #define LCD_ENABLE PORTC |= BIT7 //LCD enable #define LCD_DISABLE PORTC &= ~BIT7 //LCD disable //RegisterSelect (RS) #define LCD_READ_DATA PORTC |= BIT6 //Daten lesen #define LCD_READ_CMD PORTC &= ~BIT6 //Befehle lesen
#include <iom128v.h> #include "lcd_sr.h" void wait(void) { int temp1; int temp2; int temp3; for(temp1=0;temp1<255;temp1++) { for(temp2=0;temp2<255;temp2++) { for(temp3=0;temp3<20;temp3++) { } } } } void main(void) { PORTA=0xFF; PORTC=0xFF; LCD_READ_CMD; wait();// warten bis komplette Spannung anliegt // 3 mal schalten LCD_ENABLE; wait(); LCD_DISABLE; wait(); LCD_ENABLE; wait(); LCD_DISABLE; wait(); LCD_ENABLE; //Init wait(); LCD_DISABLE; PORTA=LCD_FUNCTION_SET; LCD_ENABLE; wait(); LCD_DISABLE; PORTA=LCD_MODE_SET; LCD_ENABLE; wait(); LCD_DISABLE; PORTA=LCD_ON; LCD_ENABLE; wait(); LCD_DISABLE; // endlos while(1){} }
Du hast vergessen die PORTS A und C auf Ausgang zu setzen. also nach void main(void) { DDRA=0xFF; DDRC=0xFF; PORTA=.... . . . Wait() muß mit Sicherheit nicht so lange sein, oder wie hast du die Werte gewählt?(sollte aber auch mit diesen Werten gehen).
Hallo, habe mir nicht den ganzen Quellcode angesehen. Habe aber hier im Forum mal gelesen, dass Warteschleifen, die auf diese Art programmiert werden je nach Einstellung des Compilers weg optimiert werden. Vielleicht solltest Du im Assembler-Code mal nachsehen, ob die Warteschleifen dort auch vorhanden sind? Gruß, Ralf
Ja, die Ports waren nicht auf Ausgang! danke... Die Warteschleife funzt! Habe mal vor jedem wait eine LED leuchten lassen und es hat hat ordentlich gewartet! Muss ich die Pins des LCD noch adressieren???
Hallo, laut Datenblatt des LCD-Controllers muß während der ersten 3 Enable Impulse an den Datenleitungen folendes anliegen: DB7 = 0 DB6 = 0 DB5 = 1 DB4 = 1 DB3 = 0 DB2 = 0 DB1 = 0 DB0 = 0 Das fehlt bei Dir glaube ich. Gruß, Ralf
Was meinst du mit adressieren??? Schalte LCD auf Daten, Zeichen in PORTA schreiben und enablen. Schreib doch auch mal ein Zeichen und überprüf den Kontrast. Vielleicht funzt es ja schon und du siehst es garnicht! Max
Warum nicht mal einen Blick in das Datenblatt werfen !? Das beantwortet alle Fragen. Inkl. der Init-Sequenz www.hte.com/uconline/ecp/44780.pdf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.