PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme mit lcd ansteuerung



Mac Gyver
15.11.2005, 00:52
hi
ich hab hier einen atmega 8 und ein 2x16 lcd. jetzt wollte ich mal versuchen das lcd anzusprechen.

ich weis zwar dass es fertige libs gibt aba ich würde es gerne selbst machen. leider haut das nicht so ganz hin und jetzt wollt ich fragen ob mir evtl jemand einen tipp geben kann. ich will garkeine vollständige lösung(da könnt ich mir gleich die lib suchen) aba ein kleiner schubs in die richtige richtung währe supa.

also mal zu meiner situation:
atmega8
lcd 16x2
lcd hängt an portc
pc0-3->db4-7 (ich will also im 4 bit mode arbeiten)
pc4->enable
pc5->rs

r/w liegt auf masse ausser evtl dem busy flag gibts eh nix zum auslesen.

also jetzt zu meinem code:
hier hab ich mal eine routine um das untere nibble zu senden:

void LCD_out_low(uint8_t RS, uint8_t out){
uint8_t out_low;

port=0x00;

out_low = out;
out_low |= (1<<4|RS<<5|0<<6|0<<7);

port |= (RS<<5);
enable_on;
port=out_low;
enable_off;

port=0x00;
}



das ganze hab ich auch fürs obere nibble:

void LCD_out_high(uint8_t RS, uint8_t out){
uint8_t out_high;

port=0x00;

out_high = (out>>4);
out_high |= (0<<4|RS<<5|0<<6|0<<7);

port |= (RS<<5);
enable_on;
port=out_high;
enable_off;

port=0x00;
}


und hier für beide nibbles (erst das obere dann das untere):




void LCD_out(uint8_t RS, uint8_t out){
uint8_t out_low, out_high;

port=0x00;

out_high = (out<<4);
out_high |= (0<<4|RS<<5|0<<6|0<<7);



port |= (RS<<5);
enable_on;
port=out_high;
enable_off;

out_low = out;
out_low |= (0<<4|RS<<5|0<<6|0<<7);


enable_on;
port=out_low;
enable_off;

port=0x00;
}


die port=0x00 kann man eigentlich weglassen aba ich habs zur sicherheit mal da lassen.

stimmt das soweit mal? oda hab ich da schon den fehler?

und wie geht das jetz mit der initialisierung?

das lcd ist doch eigentlich schon initialisiert und muss nur auf 4 bit mode umgestellt werden.
meine init sequenz hab ich leider versehentlich ganz gelöscht aba ich werd morgen eine neue schreiben.

allerdings währe es supa wenn mir bis dahin mal wer sagen könnte ob die befehle oben soweit in ordnung sind.

aja sollte irgendjemand ne gute seite mit infos zum ansteuerungsprokoll oda mit allgemeiner c- syntax haben würd ich mich natürlich auch freuen.


mfg
macgyver

linux_80
15.11.2005, 02:32
Hallo,

also was mir so auffällt, ist die Wartezeit zwischen setzen und löschen des enable Bits, das sollte schon ein paar µs aktiv sein, nach meinem DB 40µs, wenn man das Busy abfrägt.
Wenn ich schaue was Bascom macht, sind es IIRC 180 µs bevor es die nächsten Daten sendet.
Es gibt da auch Befehle, die die eine oder andere ms zeit brauchen !

HTH

Mac Gyver
19.11.2005, 19:58
hi
wollt nur sagen dass ich es jetztgeschafft habe das lcd zu initialisieren und zu beschreiben. (das einzig komische ist dass er jeden string den ich nicht vollschreibe mit müll auffüllt.)

nur wie binde ich die ganzen funktionen jetzt in ein anderes programm ein?
einfach in eine .h datei schreiben und die einbinden?

aja und wie wandle ich ein uint oda float in einen string um?

mfg

SprinterSB
19.11.2005, 20:11
in den Header (*.h) gehoren nur die Prototypen, also die Deklarationen. Die Definitionen (Implementierungen stehen in der Quelle (*.c)

Wenn LCD_out_high bekannt sein soll, dann steht im Header zB

extern void LCD_out_high(uint8_t RS, uint8_t out);
oder
extern void LCD_out_high (uint8_t, uint8_t);

Zu beachten ist, daß wenn du das includest, auch die <inttypes.h> gebraucht wird (wegen uint8_t etc). Die gibt's zB mit <avr/io.h>. Oder explizit angeben.
For Umwandlungen guckst du in die doc zur avr-libc.

slaud
25.11.2005, 08:02
itoa() und umgekehrt mit atoi()
funktioniert ziemlich gut

Mac Gyver
25.11.2005, 16:47
hi
dumme frage evtl aba was konvertiert zu was?

mfg

linux_80
25.11.2005, 19:00
Wenn man das englisch ließt, kann mans erahnen:

i to a -> Integer nach Ascii
a to i -> Ascii nach Integer

Mac Gyver
25.11.2005, 19:21
ahh danke

hätte ich mir eigentlich denken können.

mfg