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?
Weil Du die Bibliothek gar nicht mit einbindest.
Ein Headerfile allein macht noch keine Bibliothek aus, sondern es
deklariert nur das Interface zur Bibliothek.
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?
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
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.
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?
#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...
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?
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
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;
@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.
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!