PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Problem



roboter
19.07.2007, 14:04
Hallo,

ich habe mal wieder ein LCD Problem.

ich habe das AV2040 Display von Conrad (4Zeilen*20Zeichen)

Hier mal mein Testcode, nur funktioniert der leider nicht.
Warum?

#include <util/delay.h>

#define RS PA5
#define RW PA6
#define E PA7

void RS_Low(void) {
PORTA &= ~(1<<RS);
}
void RS_High(void) {
PORTA |= (1<<RS);
}
void RW_Low(void) {
PORTA &= ~(1<<RW);
}
void RW_High(void) {
PORTA |= (1<<RW);
}

void busy(void) {
char richtungC = DDRC;
char richtungA = DDRA;
DDRC = 0x00;
RW_High();
RS_Low();
while(PINC & (1<<PINC7)) // warten solange busy
DDRC = richtungC;
DDRA = richtungA;
}
void enable(void) {
PORTA |= (1<<E);
_delay_us(1);
PORTA &= ~(1<<E);
}
void lcd_init(void) {
_delay_ms(30);
RS_Low();
RW_Low();
DDRC = 0xFF;
PORTC = 0b00111100; // Function set: 2 Line Mode / Display on
enable();
_delay_us(500);
PORTC = 0b00001111; // Display on / Cursor on / Blink on
enable();
_delay_us(500);
PORTC = 0b00000001; // Display Clear
enable();
_delay_ms(3);
PORTC = 0b00000110; // Entry Mode Set: auto inkrement
busy();
}
void Return_Home(void) {
RS_Low();
RW_Low();
DDRC = 0xFF;
PORTC = 0b00000010; // Return Home
enable();
busy();
}
void set_adr(char adr) {
RS_Low();
RW_Low();
DDRC = 0xFF;
PORTC = adr;
PORTC |= (1<<PC7);
enable();
busy();
}
void put_c_adr(char adr, char c) {
set_adr(adr);
RS_High();
RW_Low();
DDRC = 0xFF;
PORTC = c;
enable();
busy();
}


Kann mir das bitte jemand helfen?

Gruß

roboter
20.07.2007, 10:21
keiner der mir helfen kann?

PCMan
20.07.2007, 13:04
Hi,
hätte zunächst zwei Gegenfragen:
Wo ist deine main-Funktion?
Warum das Rad neu erfinden und nicht die Bibliotheken von P. Fleury verwenden?
vG Simon

roboter
24.07.2007, 08:53
Meine Main Funktion würde so aussehen:
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.c"

int main(void) {

lcd_init();
put_c_adr(0x01,0x30);
while(1);
}

Die Fleury Lib habe ich probiert, aber ich bekomme sie nicht zum laufen.
Das Problem: Wenn ich die Fleury lib nehme, wird das Display beim Initialisieren gelöscht. Danach kann ich aber nicht auf das Display schreiben, zumindest erscheint nichts. Aufhängen tut sich der Controller aber nicht und an der Kontrastspannung kanns eigentlich nicht liegen...

Der_Anfänger
24.07.2007, 09:46
Hi,

eins vorneweg: Ich habe keine Ahnung von C, kann dir also nicht helfen wenn das Problem in deinem Programm ist. Ich hatte mal das Problem (in Bascom Basic und mit einem billig-LCD). Ich wollte alle viertel Sekunde neue Werte meines Robby am LCD ausgeben. ALo immer schön ein Clear Screen Befehl( also Cls ; keine Ahnung wie der Befehl in C aussieht) davor. Das Problem dann: Das DIsplay kam nicht mehr mit löschen und schreiben hinterher und war dann auch sozusagen aus. Vielleicht gibt es dasselbe Problem bei dir auch, da ich jedoch kein C kenne konnte ich den Sourcecode von dir nicht absuchen.

Gruß Felix

PS.: Könnte es sein das (falls das Display selbst angelötet wurde)es irgendwo keinen Kontakt gibt?? War bei mir auch schonmal dann flitzen komische Zeichen übers Display.

PCMan
25.07.2007, 06:02
Alsi ich empfehle dir, die lib von p. Fleury zu verwenden. Die funktioniert nämlich mit sicherheit (so fern du einen HD44870 kompatiblen Controller auf dem LCD hast)! Ansonsten: hast du R/W angeschlossen oder auf Masse gelegt?
Was für'n Controller? (Bei ATMega32 kannst du z.B. PC6 (bin mir grad nicht ganz sicher) nicht benutzen, wenn das Fusebit JTAGEN enabled ist). Ich schätze mal, dass hier ein Softwareproblem vorliegt.
vG Simon

roboter
26.07.2007, 07:11
... wenn das Fusebit JTAGEN enabled ist

Ja, das JTAGEN wars, vergess ich immer wieder.... ](*,) ](*,) ](*,)

PCMan
26.07.2007, 08:12
aha, na also ;)