Hallo,
ich habe die Schaltung in Anhang aufgebaut.
Leider bekomme ich das LCD
(http://www.electronic-software-shop.com/product_info.php?pName=lcd-modul-4x20-zeichen-beleuchtet-blau-p-46)
nicht ans laufen.
Das Display zeigt immer nur die zwei weißen Balken an, sonst passiert
garnichts.
Habt Ihr eine Idee woran das liegen könnte.
Ich habe auch schon diverse Bibliotheken verwendet, allerdings leider
ohne Erfolg.
Hier mal mein Code:
astroscout schrieb:> ich habe die Schaltung in Anhang aufgebaut.
Welcher Teufel hat dich bloss geritten, die Datenleitungen
spiegelsymetrisch anzuschliessen?
Natürlich kann man das in Software wieder ausbügeln. Aber sowas macht
man nicht, wenn es nicht ansolut sein muss.
> Ich habe auch schon diverse Bibliotheken verwendet, allerdings leider> ohne Erfolg.
Die Fleury Lib kann man so konfigurieren, dass man auch die
Datenleitungen beliebig umverteilen kann.
>> # HD44780 kompatibel>> http://www.abacom-online.de/div/LCD20x4.pdf> Das Display zeigt immer nur die zwei weißen Balken an, sonst passiert> garnichts.
Welche Funktion hat R3?
> /*Interface auf 8-Bit setzen*/> PORTA = 0x0C;
Wie stellst du DDRA ein?
Wie stellst du PC6 (=> R/W) ein?
> Hintergrundbeleuchtung
Bist du sicher, dass du keine Strombegrenzung einbauen musst?
astroscout schrieb:> Habt Ihr eine Idee woran das liegen könnte.
/*Interface auf 8-Bit setzen*/
PORTA = 0x0C;
Wenn du das unbedingt selbst schreiben mußt, dann schreib dir als erstes
eine Funktion, die dir das Bitspiegeln bei der Ausgabe übernimmt.
Ansonsten wirst du ständig durcheinander kommen und dir durch
manuelles/gedankliches Umstellen mehr Fehler reinhauen als dir lieb
sind. Und spätestens bei der Zeichenausgabe brauchst du die Funktion
sowieso.
Danke für Eure schnellen Antworten.
R3 ist für die Kontrastspannung, das macht aber keine Probleme.
Die Hintergrundbeeuchtung funktioniert auch ohne Probleme.
Karl heinz Buchegger schrieb:>>> Welcher Teufel hat dich bloss geritten, die Datenleitungen> spiegelsymetrisch anzuschliessen?
Das war vom Platinenlayout nur schwierig anders möglichlich.
Hier mal meine Prozedur um die Ports zu initialisieren:
1
/*Initialisiert die I/O-Ports*/
2
voidinit_io_ports(void){
3
4
/*Port A*/
5
DDRA=0xff;//Ausgang: Datenport für LCD
6
PORTA=0x00;
7
8
9
/*Port B*/
10
DDRB&=~(1<<DDB1);//Eingang: USB-Meldung
11
DDRB&=~(1<<DDB2);//Eingang: on/off-Schalter
12
DDRB|=(1<<DDB3);//Ausgang: LCD-Helligkeit (PWM)
13
DDRB|=(1<<DDB4);//Ausgang: Power Control
14
PORTB=0x00;
15
PORTB|=(1<<PB2);//Pull-Up-Widerstand für on/off-Schalter aktivieren
Sorry wenn ich dich mit dauerndem Nachfragen nerve. Mit einem
vollständigen Minimalprogramm im Anhang, wäre es einfacher... Sei es
drum
Und, wird im Programm init_io_ports() vor init_lcd() aufgerufen?
Wieviel Zeit gibst du dem LCD bis nach dem Power-Up der Schaltung die
Funktion init_lcd() aufgerufen wird?
Stimmen deine Delays, ist F_CPU im Programm so definiert, wie am AVR per
AVR Fuses eingestellt? Delays ausgetestet?
> R3 ist für die Kontrastspannung, das macht aber keine Probleme.
Wenn dieses R3 verändert wird - verschwinden dann die weissen Balken?
Gibst du im Programm Zeichen aus? Wie? Erscheinen diese (oder wilde)
Zeichen, wenn du an R3 so gedreht hast, dass die weissen Balken gerade
verschwunden sind?
KH:
> Wenn du das unbedingt selbst schreiben mußt, dann schreib dir als erstes> eine Funktion, die dir das Bitspiegeln bei der Ausgabe übernimmt.
Hast du das schon gemacht? Mit dieser Funktion könnte man direkt die
Bitangaben aus dem Datenblatt im Quellcode verwenden und bräuchte nicht
nachzusehen, ob deine Angaben z.B. /*Zeilen (4) und Matrix (5x7)
setzen*/ => PORTA = 0x14; korrekt sind.
Stefan B. schrieb:> Hast du das schon gemacht? Mit dieser Funktion könnte man direkt die> Bitangaben aus dem Datenblatt im Quellcode verwenden und bräuchte nicht> nachzusehen, ob deine Angaben z.B. /*Zeilen (4) und Matrix (5x7)> setzen*/ => PORTA = 0x14; korrekt sind.
@TO
Nachsehen müsste man sicherlich ebenfalls.
Aber man muss dann keinen gedanklichen Spaghat mehr machen bzw. sich
jede einzelne Ausgabe bitweise aufschreiben und neu in umgekehrter
Reihenfolge zusammensetzen.
Das sind nämlich so klassische Falltüren und daher auch: Das Umdrehen
soll eine Funktion machen. Als Programmierer will ich mich nicht darum
kümmern, dass die Bits am Port anders angeordnet sind. Ich will
output_lcd_data( 0x30 );
aufrufen und an den Pins vom LCD liegt dann auch 0x30 an, egal über
welche Portpins das läuft. Das ist Sache dieser Funktion das wieder
hinzubiegen.
voidinit_io_ports(void);//Initialisiert die I/O-Ports
22
voidinit_lcd(void);//Initialisiert das LCD
23
intreverseBits(intinput);
24
25
26
27
28
/*-----------Main-Funktion-----------*/
29
intmain(void){
30
init_io_ports();
31
PORTB|=(1<<PB4);//Netzteil an
32
PORTB|=(1<<PB3);//Licht LCD an
33
34
35
_delay_ms(1000);
36
init_lcd();
37
PORTB&=~(1<<PB3);//Licht LCD aus
38
_delay_ms(100);
39
PORTB|=(1<<PB3);//Licht LCD an
40
41
42
while(1){};
43
44
}
Mein Delays sind komischerweise etwaslänger, zumindestens kommt es mir
so vor. ich werde mich darum auch noch kümmern, aber selbst mit längeren
Delays müsste es doch klappen.
Zeichen gebe ich noch keine aus, ich will ja erstmal das LCD löschen,
also diese beiden weißen Balken verschwinden lassen.
Der Kontrast lässt sich mit R3 ohne Probleme regeln.
zu der Reverse-Funktione: Ja ich muss mir diese noch schreiben, wollte
eber erstmal gucken, dass ich das LCD initialisiert bekommen.
Nochmal danke für Eure schnelle Hilfe
ich jetzt mal auf der Platine gemessen ob alle Leitungen okay sind und
dabei festgestellt, dass der Mikrokontroller die RS-Leitung nicht auf
Low ziehen kann. DIe Verbindung hier ist jedoch einwandfrei.
Habt Ihr eine Erklärung dafür?
Danke!
> ich jetzt mal auf der Platine gemessen ob alle Leitungen okay sind und> dabei festgestellt, dass der Mikrokontroller die RS-Leitung nicht auf> Low ziehen kann.
WOW!
Dieses Statement sollten wir hier einrahmen und allen 37.492
Fragestellern schicken, die Ihre LCDs nicht initialisiert bekommen:
Messen, messen, messen.
Statt uC Emulator anschliessen und im Single-Step Betrieb die Pegel
direkt am LCD messen.
Gruss
Michael
Hi
>Statt uC Emulator anschliessen und im Single-Step Betrieb die Pegel>direkt am LCD messen.
Klar. Das hat ja auch jeder zu Hause. Aber bei neuen Mietverträgen kann
man darauf bestehen. Gehört ja zu Grundausstattung einer Wohnung.
MfG Spess