PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit LCD (HD44780) Wie sezt man einen ascii-char auf cursor pos ?



fugitivus
07.04.2011, 10:41
Hi !

Ich versuche schon seit einigen Tagen ein Display mit HD44780, in 4-bit Betrieb anzusteuern....

Ich habe mich so ein bisschen an folgende Anleitung gehalten:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

Ich habe auch definitiev nicht alles falsch gemacht, da die Command befehle wie z.B Cursor setzen aktivieren / deaktivieren und auch das initialisieren in den 4-bit modus zu funktionieren scheint.....

Was ich jezt überhaupt nicht verstehe, ist wie ich ein ascii zeichen sende....
So wie ich das verstanden habe, ist es auch ein byte (high/low-nibble)übertragen wie bei einem Command... nur das der RS pin in diesem fall auf HIGH gezogen werden muss...

Achso ich habe bewusst auf RW verzichtet.... mache ich vlt einen timing fehler ?

Also ganz konkret: wie sende ich ein z.B 'a' an die aktuelle Cursor Position ?

Hier erst mal der code:

lcd.h:


//Frequenz MicroProzessorUnit:
#define MPU_XTAL 8000000

//LCD-IO-Pins (nur 4-bit Betrieb!):
#define LCD_COM_DDR DDRB
#define LCD_COM_PORT PORTB
#define LCD_DATA_DDR DDRB
#define LCD_DATA_PORT PORTB
#define LCD_RS_PORT LCD_COM_PORT
#define LCD_RW_PORT LCD_COM_PORT
#define LCD_E_PORT LCD_COM_PORT
//Command lines(cmd pins müssen nicht auf selbem port liegen):
#define LCD_E_PIN 0
#define LCD_RS_PIN 1
#define LCD_RW_PIN 7
//Data lines(data pins müssen auf selbem port liegen reiehnfolge beliebig):
#define LCD_DATA4_PIN 2
#define LCD_DATA5_PIN 3
#define LCD_DATA6_PIN 4
#define LCD_DATA7_PIN 5

//User Konstanten:
#define LCD_ON_CURSOR_ON 14
#define LCD_ON_CURSOR_OFF 12
#define LCD_ON_CURSOR_BLINK 15
#define LCD_OFF 0

#define LCD_CLS 1
#define LCD_HOME 2

#define LCD_CFG_4BIT_5x07 56
#define LCD_CFG_4BIT_5x10 60

#define LCD_INCR_CURSOR 20
#define LCD_DECR_CURSOR 16

//LCD Interne Konstanten:
#define LCD_WR_DATA 1
#define LCD_WR_COMMAND 0

//LCD-Init-Funktionen:
void cfgLcdCommandLines(void);
void cfgLcdDataByteLinesWrite(void);
void cfgLcdDataByteLinesRead(void);
void toggleE(void);
unsigned char mkOutNibble(unsigned char dataByte);
void lcdSendByte(unsigned char dataByte, unsigned char mode);
void lcdSendData(unsigned char dataByte);
void cfgLcd4Bit();
void lcdIncrCursor(void);
void lcdDecrCursor(void);
void lcdCls(void);
void lcdHome(void);
void lcd_init(unsigned char mode);
lcd.c



#include <avr/io.h>
#include <util/delay.h>

#include "lcd.h"
#include "usart.h"

void cfgLcdCommandLines(void)
{
LCD_COM_DDR |= (1<<LCD_E_PIN);
LCD_COM_DDR |= (1<<LCD_RS_PIN);
LCD_COM_DDR |= (1<<LCD_RW_PIN);
}

void cfgLcdDataByteLinesWrite(void)
{
LCD_DATA_DDR |= (1<<LCD_DATA4_PIN);
LCD_DATA_DDR |= (1<<LCD_DATA5_PIN);
LCD_DATA_DDR |= (1<<LCD_DATA6_PIN);
LCD_DATA_DDR |= (1<<LCD_DATA7_PIN);
}

void cfgLcdDataByteLinesRead(void)
{
LCD_DATA_DDR &=~ (1<<LCD_DATA4_PIN);
LCD_DATA_DDR &=~ (1<<LCD_DATA5_PIN);
LCD_DATA_DDR &=~ (1<<LCD_DATA6_PIN);
LCD_DATA_DDR &=~ (1<<LCD_DATA7_PIN);
}

void toggleE(void)
{
LCD_COM_PORT |= (1<<LCD_E_PIN);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LCD_COM_PORT &=~ (1<<LCD_E_PIN);
}
unsigned char mkOutNibble(unsigned char dataByte)
{
unsigned char out = 0;
out = ((dataByte & 1)<<LCD_DATA4_PIN);
out |= ((dataByte & 2)<<(LCD_DATA5_PIN-1));
out |= ((dataByte & 4)<<(LCD_DATA6_PIN-2));
out |= ((dataByte & 8)<<(LCD_DATA7_PIN-3));
return out;
}

void lcdSendByte(unsigned char dataByte, unsigned char mode)
{
unsigned char lNibble = dataByte & 15;
unsigned char uNibble = (dataByte>>4) & 15;
if(mode==LCD_WR_DATA)
{
LCD_COM_PORT |= (1<<LCD_RS_PIN);
_delay_ms(1);
}else
{
LCD_COM_PORT &=~ (1<<LCD_RS_PIN);
}
LCD_DATA_PORT = mkOutNibble(uNibble);
toggleE();
LCD_DATA_PORT = mkOutNibble(lNibble);
toggleE();
}

void lcdSendData(unsigned char dataByte)
{
unsigned char lNibble = dataByte & 15;
unsigned char uNibble = (dataByte>>4) & 15;
LCD_COM_PORT |= (1<<LCD_RS_PIN);

LCD_DATA_PORT = mkOutNibble(uNibble);
toggleE();
LCD_DATA_PORT = mkOutNibble(lNibble);
toggleE();
}

void cfgLcd4Bit()
{
LCD_COM_PORT &=~ (1<<LCD_RS_PIN);
LCD_DATA_PORT = mkOutNibble(3);
toggleE();
_delay_ms(10);
LCD_DATA_PORT = mkOutNibble(3);
toggleE();
_delay_ms(1);
LCD_DATA_PORT = mkOutNibble(3);
toggleE();
_delay_ms(1);
LCD_DATA_PORT = mkOutNibble(2);
toggleE();
_delay_ms(10);
}

void lcdIncrCursor(void)
{
lcdSendByte(LCD_INCR_CURSOR,LCD_WR_COMMAND);
_delay_ms(8);
}

void lcdDecrCursor(void)
{
lcdSendByte(LCD_DECR_CURSOR,LCD_WR_COMMAND);
_delay_ms(8);
}

void lcdGotoXY(unsigned char xVal, unsigned char yVal)
{

}

void lcdCls(void)
{
lcdSendByte(LCD_CLS, LCD_WR_COMMAND);
}

void lcdHome(void)
{
lcdSendByte(LCD_HOME, LCD_WR_COMMAND);
}

void lcd_init(unsigned char mode)
{
_delay_ms(200);
cfgLcdCommandLines();
cfgLcdDataByteLinesWrite();
cfgLcd4Bit();

lcdSendByte(mode, LCD_WR_COMMAND);
lcdSendByte(LCD_CFG_4BIT_5x10, LCD_WR_COMMAND);

lcdSendByte(7, LCD_WR_COMMAND);
_delay_ms(10);
lcdCls();
}
main.c



#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#include "init.h"
#include "usart.h"
#include "globals.h"
#include "lcd.h"

int main(void)
{
cfgPorts();
cfgUsart();
enableInterrupts();
lcd_init(LCD_ON_CURSOR_BLINK);

while(1)
{
asm("nop");
asm("nop");
}
return 0;
}


Ich währe über jedlichen Ansatz sehr dankbar !

Mfg Fugitivus

fugitivus
07.04.2011, 12:06
Hi !

ich glaube ich habe den Fehler... habsch mal eben mit nem osci gemessen und festgestellt das ich den RS pin nicht auf 1 setze, sprich ich habe vergessen auszumaskieren ^^ ich denke das wird es sein ^^ gebe rückmeldung wenn es dann mit dem maskieren klappt ^^

mfg Fugitivus

fugitivus
07.04.2011, 12:18
jup, falsch ausmaskiert..... jezt funst alles wunderbar....

Danke an alle....

Mfg Fugitivus

miicchhii
19.04.2011, 16:50
#include "init.h"
#include "usart.h"
#include "globals.h"

was sind das für bibliotheken bzw woher bekomm ich die?
ich will einen display ansteuern, hab aber keine ahnung wie und such schon seit stunden herum,
werd aber nicht schlau... gibt es vl irgendwo eine komplettlösung dafür?

mfg michi

fugitivus
21.04.2011, 16:03
Hi !
Die libs hab ich selber gebaut.....
Die usart.h brauchst du nicht für das lcd ebensowenig die init.h....
Die einzigen files die du brauchen würdest habe ich oben angegeben.... wobei in der lcd.h noch die display verdrahtung in form von konstanten angepasst werden muss.... eigendlich dürfte die lib sich von selber erklähren...
Der einzige unterschied zwischen dieser und der von z.B: Peter Fleurys (siehe :http://www.mikrocontroller.net/articles/HD44780), ist das ich das busyflag nicht abfrage und deshalb den RW Pin nicht verdrahten muss....

Die frage die sich mir jezt stellt.... Was für ein Display willst du denn genau beschreiben ? gibt ja 1000 verschiedene von rs232 über rs485 oder usb,SPI, Lan ist eigendlich alles möglich aso.... dann gibts noch vga dvi etc etc........ also währe ganz praktisch wenn du mal sagen könntest um was für ein display es sich handelt, dann kann ich vlt weiter helfen....

Ist es eins mit HD44780 (http://www.mikrocontroller.net/articles/HD44780) controller dann sollte das beispiel oben eigendlich ausreichend erklährung bieten... nen gutes tutorial gibt es bei oben genanntem link.....

Mfg Fugitivus....

miicchhii
23.04.2011, 12:14
Danke für die Antwort, ich hab mch am Freitag mit einem freund zusammengesetzt
und das Problem wurde mehr oder weniger gelöst. (8-bit Modus)
Ich denke schon, dass es einer ist, zumindest kann ich den cursor bewegen und zeichen setzen,
wie die codiert sind hab ich noch nicht herausen, aber ich hab ja genug zeit zum probieren xD

danke nochmal!