Forum: Compiler & IDEs Fleury geht nicht - LCD...


von Alex (Gast)


Lesenswert?

Vorweg nochmal: Ich möchte nur mein LCD einschalten, also dass beide
Balken weg sind - spääääter dann einfach "Hello World" - so wie ein
Programmierhandbuch ja auch aufgebaut ist - am LCD ausgeben!

Habe Fleury's lcd.c und lcd.h, dazu habe ich mir ein einfaches
programm geschrieben:

/*test.c*/
#include <avr/io.h>
#include "lcd.h"

main(){
         lcd_init(LCD_DISP_ON);}

die lcd.c, lcd.h und test.c liegen alle im gleichen ordner c:\ordner!

Jetzt benutze ich den Befehl:
avr-gcc -g -Os -mmcu=at90s4433 -c test.c
das klappt ja noch gut

Aber mit:
avr-gcc -g -mmcu=at90s4433 -o test.elf test.o
bekommt man die Meldung, dass lcd_init nicht definiert ist!

was ist falsch? warum ist es falsch? wie muss es richtig sein? welche
frage habe ich vergessen, damit mein display initialisiert wird?
welche infos braucht ihr noch?

von Alex (Gast)


Lesenswert?

fleury geht natürlich schon, aber warum bekomme ich einen fehler beim
compiler?

von Joerg Wunsch (Gast)


Lesenswert?

Weil Du die Bibliothek gar nicht mit einbindest.

Ein Headerfile allein macht noch keine Bibliothek aus, sondern es
deklariert nur das Interface zur Bibliothek.

von Alex (Gast)


Lesenswert?

Sorry wegen meinem ton z.Z., aber ich dermassen von genervt, das könnt
ihr mir gar nicht glauben...
Ich hoffe ihr könnt da drüber hinwegsehen, ich versuche mich auch
zusammenzureissen so gut es geht!

Wie kann ich die Bibliothek mit einbinden?

von Alex (Gast)


Lesenswert?

ich habs auch schon probiert, dass ich lcd.h ins AVR-GCC Verzeichnis
kopiere, wo die io.h drinnen ist und im Programm dann mit
#include <lcd.h> statt "lcd.h"
geht aber auch nicht

von Joerg Wunsch (Gast)


Lesenswert?

Nö, aber das ist Dir hier auch schon mindestens einmal gesagt worden:

Dein Denkfehler ist, daß Du immer nur mit lcd.h operierst, aber DAS
IST NICHT DIE BIBLIOTHEK.  (Sorry fürs Herumschreien.)

Die Bibliothek ist ein separates .c File (lcd.c vielleicht), das Du
ebenfalls mit übersetzen und mit linken mußt.  Am einfachsten geht
das, indem Du dessen Namen mit im Makefile (unter CSRCS oder wie auch
immer das bei Dir heißt) mit angibst.

von Berndt Brandes (Gast)


Lesenswert?

versuchs mal mit:
avr-gcc -g -Os -mmcu=at90s4433 -c test.c
avr-gcc -g -Os -mmcu=at90s4433 -c lcd.c
avr-gcc -g -mmcu=at90s4433 -o test.elf test.o lcd.o

/Berndt

von Alex (Gast)


Lesenswert?

avr-gcc -g -Os -mmcu=at90s4433 -c test.c  -> funktioniert

avr-gcc -g -Os -mmcu=at90s4433 -c lcd.c   -> Fehlermeldung:
PORTA in etlichen Funktionen nicht deklariert!

was sagt mir das nun?


###############################################
void lcd_init(uint8_t dispAttr)
{
#if LCD_IO_MODE

    DDR(LCD_DATA_PORT) = 0xFF;          /* all port bits as output */
###############################################


LCD_DATA_PORT steht ja auch in der lcd.h drinnen:

###############################################
#define LCD_PORT         PORTA     /**< all lcd pins must be on SAME
port */
#define LCD_DATA_PORT    LCD_PORT  /**< port for 4bit data (Pin 0..3)
*/
###############################################


Wo ist der Fehler?

von Joerg Wunsch (Gast)


Lesenswert?

#include <avr/io.h> fehlt.

Außerdem solltest Du Dir vermutlich Gedanken darüber machen, ob die
Portanbindung (Port A offensichtlich) der Fleury-Bibliothek auch
Deinem Setup entspricht...

von Alex (Gast)


Lesenswert?

io.h fehlt?

meinst du, dass in der io4433.h für PORTA nichts angegeben ist?

ich habe jetzt in der lcd.h statt PORTA PORTD angegeben und in der
lcd.c
DDR(LCD_DATA_PORT) = 0xFF;
mit
DDR(LCD_DATA_PORT) = 0x11;
ersetzt, weil 0xFF in der io4433.h was anderes als PORTA ist....

hier der Fehler???


########### io4433.h #########

/* Input Pins, Port D */
#define PIND  _SFR_IO8(0x10)

/* Data Direction Register, Port D */
#define DDRD  _SFR_IO8(0x11)

/* Data Register, Port D */
#define PORTD  _SFR_IO8(0x12)

###############################


bin ich da auf dem richtigen weg?

von Alex (Gast)


Lesenswert?

ich hatte zwar vorher schon
#define LCD_PORT  PORTA     /**< all lcd pins must be on SAME port */

mit
#define LCD_PORT  PORTD     /**< all lcd pins must be on SAME port */

ersetzt, aber jetzt funktioniert es....
hab ja vorhin schon etliches umgeändert, aber jetzt gehts - komisch,
bin mir sicher, dass ich PORTD schon paar mal reingeschrieben habe

von Alex (Gast)


Lesenswert?

sh.., es tut sich nicht viel!

-spannung hat das teil, gnd auch, kontrast stimmt... ein balken
"fehlt"
-RS liegt auf PD4
-RW auf PD5
-E auf PD6
-und weil im 4bit modus, liegen die anderen auf PD0-PD3

2x16 display, von daher müsste die lcd.h eigentlich stimmen - hab jetzt
nur PORTA mit PORTD ausgetauscht, der Compiler hats geschluckt...

woran kann das liegen? ich habe immer noch einen einzelnen schwarzen
balken...

muss ich folgendes in der lcd.c auch noch ändern?
/* configure data pins as output */
    DDR(LCD_DATA_PORT) = 0xFF;

von Alex (Gast)


Lesenswert?

sehe gerade, das LCD_DATA_PORT auch als PIN0-3 definiert ist...

warum hab ich noch Balken?

von Peter Fleury (Gast)


Lesenswert?

@ALex
Bitte vermeide Crosspostings zu deinen LCD Problem, das bringt dich
nicht weiter, im Gegenteil.

Versuch zuerst mein test_lcd program mit meinem Makefile (angepasst
an dienen AVR) zu kompilieren und auf deinem Zielsystem zu testen.

Das Schema zum Anschluss des LCD an den AVR befindet sich auf meiner
Homepage.

von Alex (Gast)


Lesenswert?

Habs jetzt hinbekommen, auch mit deinen dateien!
...zuviel aus deiner test_lcd rausgelöscht, das gefällt dem
initialisieren nicht.

Ich habe im Moment zwar nicht so viel Zeit, aber bei Gelegenheit werde
ich mich mal um ein "HOW-TO.." für Anfänger schreiben. Bei mir lags
ja anfangs schon an dem Compilerbefehl!

von yo al (Gast)


Lesenswert?

habe ähnliche probleme mit einer 20x4 lcd
hat irgendwer eine lösung?
verdrahtung ist ok geht mit 16x2 lcd

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.