Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD in C mittels WinAVR ansteuern zum x-ten mal
Henrik hessert
12.09.2005, 12:41
Hallo 8Bit-Freaks,
Habe folgendes Problem:
Möchte gerne mein LC-Display(16x4) unter C zum laufen bringen.
Nach ca. 23345667 vergeblichen Versuchen wende ich mich nun an euch.
Zur Hardware:
Atmel Mega32
LCD 16x4 HD77480
Software: WinAVR / AVR-GCC
Verwende die lcd.h und lcd.c von P.Fleury.
Hier mein Code:
void LCD_Anzeige (void)
{
PORTC=1;
lcd_init(LCD_DISP_ON);
PORTC=2;
lcd_clrscr();
PORTC=3;
lcd_puts("H");
PORTC=4;
}
int main(void)
{
DDRC = 0xff;
LCD_Anzeige();
}
Beschreibung:
Nach Programmstart wird LCD_Anzeige() aufgerufen.
Danach leuchtet die LED1 an PORTC. Das LCD wird gelöscht.
Nach löschen des Displays sollte nun LED2 von PORTC leuchten. Tut sie aber nicht. Ich gehe davon aus, dass mein Programm in der Routine lcd_init(LCD_DISP_ON); hängenbleibt.
Einen Anschlussfehler des LCD schließe ich aus, da es sich unter BASCOM fehlerfrei ansteuern lässt.
Das LCD ist über PORTB mit meinem µC verbunden.
Die entsprechenden Änderungen in der Datei lcd.h habe ich vorgenommen. Der Vollständigkeit wegen füge ich sie jedoch diesem Eintrag bei.
Würde mich sehr freuen, wenn mir jemand weiterhelfen könnte.
Grüße an alle
Henrik
Henrik hessert
12.09.2005, 12:44
](*,) ](*,) Habe noch was vergessen.
Der Header meines Codes enthält natürlich noch
#include <avr/io.h>
#include <lcd.h>
Gruß
Henrik
michaelb
12.09.2005, 13:13
Hi Henrik,
du must noch die lcd.c einbinden!
Ohne die geht es nicht! Wenn du den ganzen Ordner von Peter Fleury gedownloadet hast ist die lcd.c dabei!
Gruß Michi
Henrik hessert
12.09.2005, 13:28
Hi michaelb,
Danke für Deine schnelle Antwort. Hab das File eingebunden.
Auf dem Display blinkt nun der Cursor an Position 1.
Mehr passiert leider nicht.
Da die LED an PORTC2 nicht leuchtet bleibt das Programm wohl immer noch stehen.
Gruß
Henrik
michaelb
12.09.2005, 14:49
Hi,
ich hab bei mir noch andere header eingebunden:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include "lcd.c"
so siehst bei mir der headerbereich aus!
ich glaube eher nicht dass es daran liegt aber du kannst es ja mal ausprobieren!
Gruß Michi
Henrik hessert
12.09.2005, 14:57
Hi Michi,
hat leider keinen Erfolg gebracht.
Könntest mir ja mal Deine lib.c und lib.h hier reinstellen.
Hast Du in der lib.c was geändert ?
Danke
Henrik
michaelb
12.09.2005, 15:18
Hi Hendrik,
ne die lcd.c hab ich nicht verändert!!
Wie hast du bei deiner Schaltung den R/W Pin angeschlossen?
Denn da gibt es einen Unterschied zwischen Bascom und der Lib!!
Bei Bascom kommt R/W auf GND und bei der Lib die du verwendest an einen freien Pin des AVRs!
Kannste mal deinen Schaltplan posten?
Gruß Michi
Henrik hessert
12.09.2005, 15:31
Hab mal noch ein Bild gepostet, welches den Displayinhalt und LED1 zeigt.
Vielleicht hilft es weiter.
michaelb
12.09.2005, 15:36
Wie hast du jetzt den R/W Pin angeschlossen?
Gruß Michi
Henrik hessert
12.09.2005, 15:47
Hi Michi !
Alles klar - jetzt funzt es.
R/W war auf Masse anstatt auf PORTB.6 .
Dachte wenns bei Bascom klappt....
Vielen, vielen Dank Michi.
...
#include "lcd.c"
Das ist allerdings Unsinn. Die lcd.c muss im Makefile angegeben werden und nicht per include eingebunden werden.
MfG Kjion
michaelb
12.09.2005, 15:53
Hi Kjion,
warum muss da im Makefile angegeben werden??
Gruß Michi
Henrik hessert
12.09.2005, 15:54
Hi Kjion
Hatte ich vorher schon im makefile drin. hab´s geändert.
dankeschön
Henrik hessert
12.09.2005, 16:01
@Michi
Ich kenne den Unterschied auch nicht. Im makefile hat man die Möglichkeit unter
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c lcd.c
das file einzubinden.
Macht bei mir aber keinen Unterschied ob ich das lcd.c im makefile oder direkt in meinem code einbinde.
Gruß
Henrik
@michaelb
in c gibst du normalerweise nur die headerfiles von benötigten 'modulen' an, die implementationsfiles werden im makefile aufgeführt.
=> im makefile hast du dann mehrere c-files angegeben, die jeweils in ein object-file kompiliert und am schluss vom linker zusammengesetzt werden.
der grund ist unter anderem folgender: ein #include kopiert den inhalt des angegebenen files in das file, in dem das include steht. wenn jetzt ein c-file mehrfach eingebunden wird, schmeisst dir der compiler warnungen/errors, weil funktionen und so mehrfach definiert sind. (das ist auch der grund, wieso im einem headerfile immer zuerst ein #ifndef lalala #define lalala ... steht)
cu
chris
michaelb
12.09.2005, 16:10
OK gute Erklärung!!
Es hat bei mir aber auch so funktioniert!!
Du schreibst
wenn jetzt ein c-file mehrfach eingebunden wird
da war bei mir noch nie der Fall! Es wurde nur einmal eingebunden nämlich nur am Anfang des Codes!!
Gruß Michi
jo
folgender fall: du hast die files main.c, serial.c und utils.c
wenn du jetzt sowohl in main.c als auch in serial.c utils.c einbindest, sollte der compiler eigentlich reklamieren:
main.o(.text+0x16):utils.c:30: first defined here
serial.o(.text+0x74): In function `lalala':
utils.c:46: multiple definition of `lalala'
cu
chris
michaelb
12.09.2005, 19:55
Ja OK du hast gewonnen!! :D :D
Habe es verstanden!
Gruß Michi
pebisoft
13.09.2005, 10:54
es gibt noch ein c-programm, wo die routinen für so eine lcd nur ein bruchteil so gross ist wie diese und man versteht als anfänger den programmcode zum ansprechen der internen register um sie dann selber leichter ändern zu können.
wo diese stand, weiss ich nicht mehr.
kann sie aber mailen bei interesse.
"pebisoft@arcor.de"
mfg pebisoft
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.