Forum: Compiler & IDEs PLED mit P. Fleury Problem


von Simon (Gast)


Lesenswert?

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

von pummel (Gast)


Lesenswert?

Ich musste fünfmal hinschauen, bis ich merkte das die RW, E und RS - 
Pins und Ports nicht korrekt konfiguriert waren.
Ansonsten ... Kontrast?

von Simon (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

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?

von OliverSo (Gast)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.