cumi
24.03.2006, 17: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>
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>