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
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