PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Display ansteuern



cumi
24.03.2006, 16:14
Hallo Zusammen

Ich versuche verzweifelt ein 4*20 Zeichen LCD Display (das von Robotikhardware) auf einem Mega32, welcher mit 6MHz getacktet ist und auf dem RN-Control sitzt anzustuern.
Damit es für den Anfang einmal möglichst simpel wird verwende ich den 8-Bit breiten Bus.

Verkabel habe ich das ganze so:
Den ganzen Daten-Bus auf PORTB
RS auf PORTD Pin 0
R/W auf PORTD Pin 1
E auf PORTD Pin 2

Mein C Programm sieht bis jetzt so aus:

#include <avr/io.h>
#include "bit.h"

// config
#define F_CPU 16000000

#define CONT_DDR DDRD
#define CONT_PORT PORTD
#define CONT_E 2 // Enable (fallende Flanke)
#define CONT_RS 0 // L:Befehl / H:Daten
#define CONT_RW 1 // H:Read / L:Write
#define DATA_DDR DDRB
#define DATA_PORT PORTB

void sleep(void){
int i;
for (i=0; i<200; i++){}
}

void sleep_long(void){
int i,j;
for (i=0; i<100; i++)
for (j=0; j<100; j++){}
}

void init(void){
CONT_DDR = 0x07; // Ausgänge
DATA_DDR = 0xff; // Ausgänge
b_setL(CONT_PORT,CONT_E); // E nicht setzen
b_setL(CONT_PORT,CONT_RS); // RS nicht setzen
b_setL(CONT_PORT,CONT_RW); // RW nicht setzen
DATA_PORT = 0xff;
}

void lcd_send(uint8_t data){
DATA_PORT = data;
b_setH(CONT_PORT,CONT_E);
sleep();
b_setL(CONT_PORT,CONT_E);

DATA_PORT = 0xff;
}

void lcd_init(void){
lcd_send(0x34); // 8-Bit Datenlänge
sleep_long();
lcd_send(0x09); // 4 Zeilen Modus
sleep_long();
lcd_send(0x0F); // Display on, Curser on, Blink on
}

int main(void){
init();
lcd_init();

for(;;){}

return 0;
}


Leider sehe ich auf dem Display gar nix. Ich müsste doch mindestens den blinkenden Curser sehen, oder?

Jemand eine Idee, was ich falsch mache?

cumi

<edit>
ah, ja, was ich noch vergessen habe. b_setH(b,n) setzt einfach das n-te Bit vom Byte b auf 1. b_setL auf 0.
</edit>

izaseba
24.03.2006, 16:25
Leider sehe ich auf dem Display gar nix.
gar nichts ist schlecht, Du müßtest zumindest volle Vierecke sehen, so sieht es nähmlich aus wenn das Display eingeschaltet , aber noch nicht initialisiert wird.
Spannungsversorgung , kontrast ok ?

Deine Init Routine, ist sie denn richtig ?
4 Zeilen Modus? Ich kenn nur 1 oder 2 Zeilen Modus...
schick mal ein Link auf das Dattenblatt, kann man vielleicht mehr dazu sagen...

Gruß Sebastian

SprinterSB
24.03.2006, 16:35
Die Warteschleife (https://www.roboternetz.de/wissen/index.php/Warteschleife) tut nicht, was sie soll.

Aber da ist wohl noch mehr faul...

cumi
24.03.2006, 16:37
danke für deine hilfe!

Die Vierecke sehe ich natürlich schon, wenn ich den Kontrast entsprechend einstelle.

Die Init-Rutine habe ich dem Datenblat abgeschrieben.

Ist leider zu gross, als Attachment. Kannst es aber hier herunterladen:
http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=66&products_id=80

cumi
24.03.2006, 16:40
zur Warteschleife: Danke für den Artikel, doch irgendwie funktioniert das schon, denn ich habe schon Programm geschrieben, die genau so LEDs blinken lassen.
Aber ich versuchs mal so wies im Artikel steht.

cumi
24.03.2006, 17:20
hat niemand mehr eine idee?

hätte mir sonst jemand einen code (in C) , um ein solches display anzusteuern? Dann kann ich einmal vergleichen...

SprinterSB
24.03.2006, 17:25
Hast du den Kontrast gecheckt? Wenn der nicht stimmt ist auch allen schwarz.

cumi
24.03.2006, 17:52
ich hab ihn so eingestellt, dass die rechtecke nicht schwarz und nicht weiss sind. also sie sind jetzt so hellgrau.

Ich denke, dass das Problem irgendwo bei der Programmierung liegen muss. Denn dazu habe ich auch im Datenblatt nicht viel gefunden. Ich habe das einfach so geschrieben, wie ich dachte, dass es wohl funktionieren würde. Und alle Warte-Zeilen extrem hoch eingestellt. Kann es sein, dass diese Zeiten auch nicht zu hoch sein dürfen?

izaseba
24.03.2006, 22:05
Naja, wenn Du doch die Vierecke siehst, dann klappt Dein Init nicht,
so wie der Sprinter schon sagte, mach mal eine vernünftige Delay, schau mal util/delay.h _delay_loop_2 ist sehr interessant.

Gruß Sebastian

cumi
24.03.2006, 22:07
ok, danke für den tipp. schau mir diesen delay mal an.