PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Display zeigt nur Japanische Zeichen



µautonom
13.04.2008, 12:36
Hallo, ich werd wahnsinning... versuche schon seit paar Tagen mein Display zum laufen zu bringen.

Ich verwende einen ATmega16 interner Takt=1Mhz und dieses Display -> Reichelt : Artikel-Nr.: LCD 082 DIP

Das ganze wird 4-Bit angesteuert

Beim ersten Mal hat er mir nur japanische Zeichen angezeigt, da hatte ich PORTB benutzt ,R/W war nicht auf Masse gelegt und D0-D3 hatte ich offen gelassen (also nicht mit Masse verbunden)

Ach und da hatte ich das nach dem Beispiel aus dem WIki nach Peter Fluery programmiert , statt Hello World hat er mir eben diese japanischen Zeichen angezeigt , siehe Vid -> http://www.youtube.com/watch?v=W7P7eR_lpX0.

EDIT//: Hatt enoch was vergessen zu erwähnne, udn zwar sieht man im Video wie sich die Zeichen ändert das kommt daher das ich das Beispiel Prog aus dem Wiki etwas geändert hatte, hab da ne kleine Schleife eingebaut in der nach jedem Zähldurchgang ein Zeichen ausgegeben wird, was eh nicht geklappt hat , kam nur Müll raus, wie in dem Video zu sehen.

Danach hab ich alles umgelötet. Statt PortB mal den PORTA benutzt.
D4-D7 an PORTA PA0-PA3, sowie RS=PA4 und E=PA5 , R/W und D0-D3 hab ich diesmal auf Masse gelegt.
Hab auch nicht die Dateien von Peter Fluery benutzt, bin nach dem GCC_Tutorial (LCD) auf Mikroconroller.net vorgegangen. In der lcd-routines.h hab ich nur die Port definition geändert sowie die Portpins . Hello World wird gar nicht angeziegt bzw. ich sehe 0 auf dem Display....

Hab dann nochmal die Anschlussbelegung swoie die gelöteten Pins überprüft, stimmt alles.

Ich weiß es ist schwer mir so zu helfen, aber vielleicht hat jemand eine Idee oder weiß was ich falsch mache.

Mfg

_werwurm_
13.04.2008, 13:54
ich würde wild drauflosraten: pinbelegung falsch? 1-7 stimmte scheinbar - aber 8-14 evtl. in gegenläufiger reihenfolge? schau noch mal genau im datenblatt ob das nicht evtl. andersrum gehört..

http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A500%252Fd ips082%2523EAS.pdf

µautonom
13.04.2008, 14:13
Hi, hm auf einmal gehts hab nur den R/W Pin mal auf einen Portpin gelegt und nochmals das Programm von Fluery getestet und es klappt....

Es klappt aber nicht mit dem Code aus dme mikrocontroller.net Tutorial.



void lcd_data(unsigned char temp1);
void lcd_string(char *data);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);

// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#define F_CPU 8000000

// LCD Befehle

#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME 0x02

// Pinbelegung für das LCD, an verwendete Pins anpassen

#define LCD_PORT PORTA
#define LCD_DDR DDRA
#define LCD_RS PA4
#define LCD_EN PA5


Hab nur was in der lcd-routines.h geändert alles andere hab ich so übernommen wie im Tut.



#include <avr/io.h>
#include "lcd-routines.h"
#include "lcd-routines.c"

int main(void)
{
lcd_init();

lcd_data('T');
lcd_data('e');
lcd_data('s');
lcd_data('t');

set_cursor(0,2);

lcd_string("Hello World!");


while(1)
{
}

return 0;
}





Da zeigt er mir nix an, am LCD liegt es ja nicht habs ja mir der FLuery Code getestet muss am Code liegen.

Kann das sein das, wiel ich jetzt ja R/W am Portpin hab, noch abfragen muss wenn ich was auf dem Display schreibe? Habs ja jetzt nicht auf Masse wie im Tut steht.

Mfg

Hubert.G
13.04.2008, 14:22
Die Lib von Fleury funktioniert ohne R/W oder R/W auf GND nicht. Wenn du auf R/W verzichten willst musst du anstelle der Busy-Abfrage ein delay einbauen.

µautonom
13.04.2008, 14:27
Hi Hubert siehe Edit.
habs ja für den Fluery Code auf den PORTA PA6 gelegt.

Da ging ja alles wunderbar.

Jetz tmit dem neuen Code aus mikrocontroller.net siehe Code oben, klappts nicht wahrscheinlich liegts daran das ich R/W nicht auf Masse hab oder?
Es sind ja delays in der lcd.c eingebaut sowie wie im Tutorial.

EDIT:// Im Microcontroller.net cod emusste man das mit dem Busy Flag doch anpassen, habs nochmal auf Masse gelegt udn der Code ging.

Nun klappt alles :D

Aber trotzdem ein dankeschön

Mfg

µautonom
13.04.2008, 14:35
Ein paar Fragen hab ich doch noch. Was genau wird in deisem Code gemacht, also der teil nachdem RS gesetzt wird?



void lcd_data(unsigned char temp1)
{
unsigned char temp2 = temp1;

LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen

temp1 = temp1 >> 4;
temp1 = temp1 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();

temp2 = temp2 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();

_delay_us(42);
}


Mfg

Hubert.G
13.04.2008, 14:47
Ich kenne den Codeteil nicht genau, aber es dürfte das Nibble-schieben sein. Also die 4 höherwertigen Bit zuerst und dann die 4 niederwertigen zum LCD.

µautonom
13.04.2008, 14:55
Hi Hubert, du hast Recht. Danke



temp1 = temp1 >> 4;


was für ein Wert hat den temp1 ? in dem Befehl wird ja der Wert in temp1 um 4 stellen nach Rechts verschoben und dann wieder temp1 übergeben.

Was soll das bringen? Versteh ich irgendwie nicht.

Mfg