PDA

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.

Kjion
12.09.2005, 15:52
...
#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

cavegn
12.09.2005, 16:05
@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

cavegn
12.09.2005, 19:52
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