PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD ADD on 2,5



Tobax
17.01.2010, 16:52
Hallo...

ich habe einen LCD ADD ON 2,5 gekauft und habe es mit meine Atmega8 Board angeschlossen...es zeigt nur schwarze Balken....
was mache ich falsch??

lcd.h habe ich von Peter Fleury untergeladen und angepaßt.

Tobax
17.01.2010, 16:55
wäre nett wenn jemand mir einen Tip geben kann

Hubert.G
18.01.2010, 08:34
Wie sieht deine Anschaltung an dein Board aus.
Die lib von Fleury funktioniert sonst sehr gut.
Etwas genauerer Angaben zu dem LCD wären auch gut, Datenblatt.
Wie viele schwarze Balken zeigt dein Display, wenn es nur einer ist, dann ist das Disp nicht initialisiert, wenn alles schwarz ist, dann mal am Kontrastregler drehen.

Tobax
18.01.2010, 19:07
ich hab folgende Board Atmega8 MK1 LPT
http://shop.myavr.de/index.php?sp=article.sp.php&artID=4

und das Dsiplay ADD ON 2,5 auch von myavr.

das Display zeigt in der 1. Zeile nur 16 schwarze Balken.

ich habe auch and dem Kontarstregler gederht ...ich sehe keine zeichen auf dem Display außer schwarze Balken.

Gruß...

Tobax
18.01.2010, 19:15
leider ist das Datenblatt 700 kb und kann es nicht hochladen...aber unter der link kann man es sich runterladen (700kb)

http://shop.myavr.de/index.php?sp=article.sp.php&artID=15

KingTobi
18.01.2010, 19:18
Poste bloß nicht deinen Code... man könnte sonst nen Fehler finden.

Dann heisst es in der lcd1.h erst
#define LCD_PORT PORTD
dann
#define LCD_PORT PORTB
das kann nicht funktionieren.

Tobax
18.01.2010, 20:38
hier ist der Code....

KingTobi
18.01.2010, 20:44
Hast du den Port angepasst?!

Tobax
18.01.2010, 21:10
ja ich habe es angepaßt...aber es läuft trotzdem nichts.

KingTobi
18.01.2010, 21:13
Teste mal den Code:


//---------------------------------------------------------------------------
// Titel : myAVR Beispiel "LCD Ausgabe auf einer Zeile" für den ATmega8/48/88/168
//---------------------------------------------------------------------------
// Funktion : gibt eine Zeichenkette auf dem myAVR LCD Modul, 1 Zeile
// Schaltung : PORTD.2 = RS, PORTD.3 = E, PORTD.4-7 = D4-7
//---------------------------------------------------------------------------
// Prozessor :
// Takt : 3.6864 MHz
// Sprache : C
// Datum : 09.11.2007
// Version : 1.0
// Autor : S. Hänsel
// Programmer : ...
// Port : ...
//----------------------------------------------------------------------
#define F_CPU 3686400
#include <avr\io.h>
#include <util\delay.h>
/////////////////////////////////////////////////////////////////////////////
// allgemeine-Funktionen
//---------------------------------------------------------------------------
// waitMs(..) - Wartet einige Millisekunden
// Die Dauer ist nicht kalibriert.
// PE: miliSec=Anzahl der zu wartenden Millisekunden
//---------------------------------------------------------------------------
void waitMs(int miliSec)
{
_delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec); // 4 Zyklen warteschleife
}
void waitUs(int mikroSec)
{
_delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec); // 4 Zyklen warteschleife
}
//////////////////////////////////////////////////////////////////////////////
// LCD-Funktionen für myAVR-Board + myAVR-LCD
// 4-BitModus an PortD Bit 4-7
// PortD Bit 2 = RS, high=Daten, low=Kommando
// PortD Bit 3 = E, high-Impuls für gültige Daten
//---------------------------------------------------------------------------
// lcdSend(..) - sendet ein Byte an LCD im 4-Bit-Modus
// RS muss vorher richtig gesetzt sein
// PE: data=zu sendendes Byte
//---------------------------------------------------------------------------
void lcdSend(char data)
{
// aktuelles RS ermitteln
char rs=PORTD;
rs&=4;
// High-Teil senden
char tmp=data;
tmp&=0xf0;
tmp|=rs;
PORTD=tmp;
// Schreibsignal
sbi(PORTD,3);
cbi(PORTD,3);
// Low-Teil senden
tmp=data;
tmp&=0x0f;
tmp*=16;
tmp|=rs;
PORTD=tmp;
// Schreibsignal
sbi(PORTD,3);
cbi(PORTD,3);
// verarbeiten lassen
waitMs(1);
}
//---------------------------------------------------------------------------
// lcdCmd(..) - sendet ein Kommando an LCD
// PE: cmd=Kommando-Byte
//---------------------------------------------------------------------------
void lcdCmd(char cmd)
{
cbi(PORTD,2); // RS löschen = Kommando
lcdSend(cmd); // senden
}
//---------------------------------------------------------------------------
// lcdWrite(..) - sendet ein Zeichen (Daten) an LCD
// PE: text=Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char text)
{
sbi(PORTD,2); // RS setzen = Daten
lcdSend(text); // senden
}
//---------------------------------------------------------------------------
// lcdWrite(..) - sendet eine Zeichenkette an LCD
// Die Zeichenkette muss mit 0x00 abgeschlossen sein
// PE: pText=Zeiger auf Zeichenkette
//---------------------------------------------------------------------------
void lcdWrite(char* pText)
{
while(pText[0]!=0)
{
lcdWrite(pText[0]);
pText++;
}
}
//---------------------------------------------------------------------------
// lcdWrite(..) - sendet eine Zeichenkette an LCD
// PE: pText=Zeiger auf Zeichenkette
// count=Anzahl der zu sendenden Zeichen
//---------------------------------------------------------------------------
void lcdWrite(char* pText, int count)
{
while(count!=0)
{
lcdWrite(pText[0]);
pText++;
count--;
}
}
//---------------------------------------------------------------------------
// lcdHome(..) - Cursor auf Position 1,1
//---------------------------------------------------------------------------
void lcdHome()
{
lcdCmd(0x02);
waitMs(2); // warten
}
//---------------------------------------------------------------------------
// lcdClear(..) - löscht die Anzeige im LCD
//---------------------------------------------------------------------------
void lcdClear()
{
lcdCmd(0x01);
waitMs(2); // warten
}
//---------------------------------------------------------------------------
// lcdOn(..) - schaltet das LCD an
//---------------------------------------------------------------------------
void lcdOn()
{
lcdCmd(0x0E);
}
//---------------------------------------------------------------------------
// lcdOff(..) - schaltet das LCD aus
//---------------------------------------------------------------------------
void lcdOff()
{
lcdCmd(0x08);
}
//---------------------------------------------------------------------------
// lcdGoto(..) - setzt die Cursorposition
// PE: row = Zeile 1..2
// col = Spalte 1..16
//---------------------------------------------------------------------------
void lcdGoto(int row, int col)
{
row--; // Null-basierend
row&=0x01; // sicherheitshalber
row*=0x40; // Zeile nach Bit 6 bringen
col--; // Null-basierend
col&=0x0f; // sicherheitshalber
char tmp=row|col;
tmp|=0x80; // Cursor setzen
lcdCmd(tmp); // senden
}
//---------------------------------------------------------------------------
// lcdInit(..) - Schaltet die Ports und Initialisiert das LCD
//---------------------------------------------------------------------------
void lcdInit()
{
// Port D = Ausgang
DDRD=0xff;
PORTD=0;
// warten bist LCD-Controller gebootet
waitMs(50);
// SOFT-RESET
PORTD = 0x30; //0b00110000;
sbi(PORTD,3);
cbi(PORTD,3);
waitMs(5);
PORTD = 0x30; //0b00110000;
sbi(PORTD,3);
cbi(PORTD,3);
waitUs(100);
PORTD = 0x30; //0b00110000;
sbi(PORTD,3);
cbi(PORTD,3);
waitMs(5);

// 4-BitModus einschalten
PORTD=0x20;
// Schreibsignal
sbi(PORTD,3);
cbi(PORTD,3);
waitMs(5);

// ab hier im 4-Bit-Modus
lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
//lcdOff();
lcdCmd(0x06); // Entry Mode
lcdOn();
lcdClear();
}
//---------------------------------------------------------------------------
// Main-Funktion
//---------------------------------------------------------------------------
int main (void)
{
waitMs(200);
lcdInit();
lcdGoto(1,1);
lcdWrite("Hallo myAVR!");
while (1) { } // Mainloop
return 0;
}
//---------------------------------------------------------------------------

Hubert.G
18.01.2010, 21:46
Auf dem LCD ist ein Brückenstecker beim Poti, den musst du auf ON stecken und die Leitung R/W zum Kontroller führen.

Tobax
18.01.2010, 22:43
@Hubert :
habe de Brückenstecker auf ON gesteckt...leider hat sich nichts geändert außer die Hintergrundhelligkeit kurzzeiig Hell.

@Tobi:

habe dein code getestet, bekomme folgende Fehlermeldung.

28: error: expected unqualified-id before '{' token

werde Morgen nach den Fehler suchen.

Danke und ich melde mich wieder...

Hubert.G
19.01.2010, 09:29
Ist dieses Display nicht wie ein KS0073?
Der Kontroller ST7066U und das Datenblatt lassen zumindest darauf schließen.
Du müsstest in der lcd.h das dann auf 1 setzen.

KingTobi
19.01.2010, 13:52
@Hubert
Das ist ein HD44780, da muss man auch ncihts schliessen das steht so in der Beschreibung!

@Tobax
Das Programm funktionier bei mir ohne Probleme!

Tobax
20.01.2010, 17:08
es ist frustrierend, wenn es nicht klappt...:-(

murdocg
20.01.2010, 19:55
Hi habe fast das gleiche Problem. Heute kam mein LCD von Reichelt. (2x16)

Habs dann so verdrahtet:
1 Vss GND
2 Vcc 5V
3 Vee Poti (siehe oben)
4 RS PD4 am AVR
5 RW GND
6 E PD5 am AVR
7 DB0 GND
8 DB1 GND
9 DB2 GND
10 DB3 GND
11 DB4 PD0 am AVR
12 DB5 PD1 am AVR
13 DB6 PD2 am AVR
14 DB7 PD3 am AVR

Hier der Code:


$regfile = "m8def.dat"
$crystal = 4000000

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcdbus = 4

Cls
Locate 1 , 1
Lcd "Test"


Ganz am Anfang gings, dann habe ich mal Locate 2 , 5 Probiert.
Seitdem ist die erste Zeile voll mit schwarzen Balken. Habe das Programm schon mehrmals neu geflasht, das nützt aber nichts.

LG Fabian

Tobax
20.01.2010, 22:13
hi murdocg.
warum hast du RW mit GND verbunden?
ich bin mir nicht sicher aber RW muss man auf 1 setzten glaube ich..

1 Vss GND
2 Vcc 5V
3 Vee Poti (siehe oben)
4 RS PD2 am AVR
5 RW PB0 am AVR
6 E PD3 am AVR
7 DB0 GND
8 DB1 GND
9 DB2 GND
10 DB3 GND
11 DB4 PD4 am AVR
12 DB5 PD5 am AVR
13 DB6 PD6 am AVR
14 DB7 PD7 am AVR
meine Problem liegt bei LCD1.h. ich glaube die ist nicht richtig angepaßt, speziell RW am PB0

Tobax
20.01.2010, 22:16
also oben ist mein Verdrahtung ,

murdocg
21.01.2010, 17:02
RW muss auf GND das ist richtig, so stehts übrigens auch im RN-Wissen.

Ich werds nachher nochmal probieren.

LG Fabian

Hubert.G
21.01.2010, 18:08
Ich habe mir gerade noch mal deine lcd.h angesehen. Was macht diese Zeile?
#define LCD_PORT PORTD /**< port for the LCD lines */
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 4 */
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 5 */
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 6 */
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 7 */
#define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 2 /**< pin for RS line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 3 /**< pin for Enable line */


#define LCD_PORT PORTB /**< port for the LCD lines */?????????????????????????????????????????????????? ?????????????

#if LCD_READ_REQUIRED
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 0 /**< pin for RW line */
define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 1 /**< pin for Hintergrundbeleuchtung */
Die Zeile mit den Fragezeichen schaltet auf PORTB um. Lösch sie mal raus.

murdocg
21.01.2010, 18:40
So habe eben mal einfach so den Controler (Atmega 8) getauscht, neu geflasht und dann gings.
Allerdings flackert das Bild. Das heißt es wird im Takt von ca einer Sekunde schwächer und wieder stärker.
Woran könnte das liegen, an der Spannungsversorgung?

LG Fabian

Tobax
21.01.2010, 20:47
@Huber

das habe ich ausprobier ohne PORTB...leider kein Erfolg....

meine Frage ist folgendes..

brauche den RW PIN? ja oder Nein??? weil die ist bei mir mit PORTB0 verbunden.

Hubert.G
21.01.2010, 21:02
Der ist ja ohnehin nicht aktiv, da bei LCD_READ_REQUIRED eine 0 steht.
Der Jumper bei R/W muss auf AUS sein.

Tobax
23.01.2010, 19:40
Hallo...da es bei mir immer noch nichts funktionierte, habe ich mir LCD_riutine.c undlcd_routine.h aus der Tutorial genommen und angepaßt.

ich kriege immer noch nichts auf mein LCD was abgezeigt:-(

kann jemand vielleicht drüber schauen bin verzweifelt :-(

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Hubert.G
23.01.2010, 21:00
Die lcd.h hast du hoffentlich komplett übernommen.
Ich sehe sonst keinen Fehler drinnen. Nachdem die Lib von Fleury auch sicher funktioniert, nehme ich mal an das da ein HW-Fehler vorliegt.
Hast du schon mal die Leitungen vom Display zum Kontroller durchgemessen?
Mess mal alle Leitungen durch, auch ob R/W am Display wirklich auf GND liegt.
Du hast geschrieben das wenn du den R/W-Stecker umsteckst, das sich die Hintergrundbeleuchtung einschaltet, das kann nicht sein.