Hi, ich habe an einem Mega8 ein PLED Display (HD44870 kompatibel) hängen. #define LCD_PORT PORTD /**< port for the LCD lines */ #define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */ #define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */ #define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */ #define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */ #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ #define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */ #define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */ #define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */ #define LCD_RS_PORT PORTC /**< port for RS line */ #define LCD_RS_PIN 3 /**< pin for RS line */ #define LCD_E_PORT PORTC /**< port for Enable line */ #define LCD_E_PIN 2 /**< pin for Enable line */ #define LCD_RW_PORT PORTC /**< port for RW line */ #define LCD_RW_PIN 1 /**< pin for RW line */ Ansonsten sind alle Einstellungen auf default gelassen. Mit BASCOM habe ich das Display bereits getestet, es lässt sich ansteuern. Problem: Das Display initialisiert nicht, es springt sozusagen nicht an. Ich habe das Datenblatt mit den Initialisierungsroutinen verglichen, sie sind soweit kompatibel (http://www.robotikhardware.de/download/1602M03%20PLED_.pdf). Auch eine eigene geschriebene Library hat nicht funktioniert. Ich bin am Rande der Verzweiflung, ich verstehe nicht, wo das Problem liegt. -Verwendeter Compiler: AVR-GCC (aktuelle Version). -Notepad Texteditor (also WinXP ;) -stk200 lpt Programmer -main.c: #include <stdlib.h> #include <avr/io.h> #include "lcd.c" int main(void) { lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts("Test2"); // Ausgabe ist im RAM des Displays gespeichert! for (;;){} return 0; } -Einfügen von zusätzlichen Delays hat keinen Effekt -Bereits verschiedene Ports (PORTC, PORTB) zur Ansteuerung getestet. Kein Effekt. Würde mich sehr über Hilfe freuen, vielen Dank, Simon
Ich musste fünfmal hinschauen, bis ich merkte das die RW, E und RS - Pins und Ports nicht korrekt konfiguriert waren. Ansonsten ... Kontrast?
Hi! Pummel: ich freue mich ja über jede Antwort, weil ich das Gefühl habe, einfach nicht mehr weiter zu kommen. Hast du bereits ein PLED mit C bestrieben? Ich habe die Leitungen mehrfach überprüft, habe sogar mit den Konfigurationen in der Header die unmöglichsten Varianten getestet ;) - bringt aber alles nix. Und wie gesagt (ich hasse diesen lästigen Vergleich): in BASCOM kann ich es aktivieren (sofern R/W mit Masse verbunden wird) und dort strahlt es kräftig ;) Das Poti müsste auf jeden Fall richtig eingestellt sein. Ich versorge den Mega8 (und das Display) übrigens über ein 4,5V Netzteil (500mA) - reicht theoretisch. Kann es aber sein, dass die Fleury-Variante mehr Saft braucht? ;) Viele Grüße, Simon
Auch wenn es wahrscheinlich nichts mit deinem Problem zu tu hat: #include "lcd.c" macht man nicht. Da gehört nur #include "lcd.h" hin, lcd.c gehört ins makefile, wird getrennt compiliert, und der linker soll das Programm bitte schön selber zusammenbasteln. R/W auf Masse? Es könnte sein, daß in der lib das busy-Flag abgefragt wird, das geht dann in die Hose. Apropos makefile: Den richtigen Controller-Typ hast du aber schon irgendwo angegeben? Und mal hier im Forum alle Beiträge zum Thema gelesen? Oliver
Hi Oliver, habe mich vielleicht doof ausgedrückt: der R/W liegt auf Port C Pin 2. Um das Display (unter BASCOM) testen zu können, habe ich mittels Klemmen eine Verbindung zwischen PC2 zu GND gelegt. Dann läuft das Display. Makefile: Da ich noch Anfänger bin habe ich das erst spät gemerkt, dass es andersherum gehört (lcd.h einbinden und lcd.c in den Quellen in der Makefile angeben). Das habe ich auch schon erledigt. Forumbeiträge: ja ich habe schon Gott und die Welt durchgelesen, aber mir iast aufgefallen, dass scheinbar nur wenige ein solches PLED-Display benutzen, und noch weniger es mit der Lib von Peter Fleury ansteuern. Das Problem nach wie vor ist, dass das Display einfach nicht anspringt. Ich hätte da noch eine Frage zum enable-Puls: In der Funktion "static void toggle_e(void)" wird eine Funktion "lcd_e_delay();" aufgerufen, die in den Defines als "#define lcd_e_delay() _asm_ __volatile__( "rjmp 1f\n 1:" );" hinterlegt ist. Könnt ihr mir sagen, was diese Assembleranweisung zu bedeuten hat? Kann es sein, dass das PLED-Display einen längeren Enable-Puls braucht? Danke für eure Hilfe, viele Grüße, Simon
Nochwas: Im makefile ist der Mega8 angegeben. Ich habe ihn ohne externen Quarz laufen, also interner Oszillator 1Mhz. Auch im Makefile steht für die Frequenz 1000000 und in der lcd.h für XTAL auch 1000000. Das passt doch oder?
Das Timing ist bei LCD's immer kritisch. Nach dem Datenblatt ist die minimale Eenable high time 230ns. Bei einem Mhz braucht dein Mega8 1000ns für einen Befehl, der rjmp braucht schon 2 Zyklen. Das sollte eigentlich ausreichen. Aber da das im Datenblatt nur min-Angaben sind, probiers mal mit asm volatile("nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" "nop\n\t" ::); anstelle des rjmp. Das sind 6 Befehle, du kannst auch noch mehr nops reinschreiben, falls erforderlich. Wenn es läuft, verringerst du halt die Anzahl wieder. XTAL 1000000 ist in Ordnung, wenn der Prozessor tatsächlich mit 1MhZ läuft. Oliver
Hallo Forum, es hat sich heute nach ewigen rumtüftlereien herausgestellt, dass weder der Controller, das Display oder die Konfiguration in P. Fleuries Lib das Problem war, sondern die Stromversorgung: ich hatte irgendwie das komische Gefühl, dass mit dem Netzteil was nicht stimmte, und habe daher ein anderes angeschlossen (12V) und einen ordentlichen Spannungsregler dazwischen geschleift. Jetzt funktioniert das Display auch unter C einwandfrei. Mir ist bis jetzt aber en Rätsel, warum BASCOM mit dem anderen Netzteil ausgekommen ist. Oliver: danke für den Hinweis :) Bleibt noch eine Frage: ich habe einen Timer laufen der bei jedem Overflow ein Interrupt aufruft (Timer 0, Prescaler 1Mhz/1024). In der ISR wird ein Integer i inkrementiert und anschließend mit atoi in ein char* umgewandelt. Sobald ich den umgwandelten Integer anzeigen lasse, fällt das Display aus. Wird zu schnell geschrieben? Wo ist der Haken? Viele Grüße, Simon
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.