Forum: Mikrocontroller und Digitale Elektronik LCD geht nicht, ich Bitte um hilfe


von Martin (Gast)


Lesenswert?

Hallo,

bin Anfänger und habe schon ein Teil der Tutorial "BESTANDEN"

habe ein LCD angeschlossen und Nach langem rumsuchen, lesen und 
probieren compeliert mein Code jetzt ohne Probleme,
dann an der Controller und hat erst nicht funktioniert! wieder lesen 
lesen und lesen, dann mit verschiedene Code in
Assembler probiert (Ini Routinen usw.) und nichts! dann wollte fast 
schon alles zum Fenster WEG SCHMEISSEN zum letzt
habe ich gestern Abend mit dem C Code (von Turorial) probiert und auf 
ein Mal hat funktioniert!

ABER !! wenn ich die Spannung weg nehme und wieder anschließe kommt 
nichts erst wenn ich an den Controller
(Atmega16) 3 bis 5 mal reset drucke kommt an der LCD die "Hallo Welt“!

Heute wollte ich mal wieder testen und nichts, Spannung an reset 
reset... und auch nichts!

jetzt bin ich genau wie am Anfang ohne eine Ahnung was da los ist!


Ausgang Situation:

Atmega16
Quartz 14745600
LCD HD44780 im 4 bit Modus

ich bin für jede Hilfe dankbar!!

bevor ich das ganze weg schmeiße möchte mindestens verstehen warum nicht 
funktioniert!!

besten Dank
Gruß
Martin

von Bernhard M. (boregard)


Lesenswert?

Könnte das übiche timing Problem sein..

Hast Du in lcd-routines.h F_CPU richtig angepasst?
Bist Du sicher, daß der Prozessor richtig resettet?

von Martin (Gast)


Lesenswert?

Hallo Bernhard,

danke für deine Antwort.

>> Hast Du in lcd-routines.h F_CPU richtig angepasst?
meinst du den Wert von Quartz in .h oder? wenn dann ja ich habe es in 
der Makefile und in lcd-routines.h angepasst.

>> Bist Du sicher, daß der Prozessor richtig resettet?
ups... da habe ich keine Ahnung bzw. wie kann ich das testen?

wie kann ich hier in Forum 3 Dateien posten oder hängen, so kann ich 
dann die .h und .c hier posten.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Martin wrote:

>>> Bist Du sicher, daß der Prozessor richtig resettet?
> ups... da habe ich keine Ahnung bzw. wie kann ich das testen?

Mach als erste Aktion in deinem Programm eine LED an und nach einer
kurzen Wartezeit wieder aus. Dieses Signal erkennst du auf jeden
Fall: Wenn nach dem Reset die LED kurz aufleuchtet, dann hat
der Prozessor resettet.

Das könnte unter Umständen sogar dann dein LCD Problem lösen.
Der Controller am LCD braucht auch nach einem Reset etwas Zeit
um das LCD 'hochzufahren'. Wenn dein Programm mit der Initialisierungs-
sequenz ein klein wenig zu früh anfängt, dann ist das LCD noch
nicht soweit.

Ist aber nur eine Vermutung.
Wenn ein LCD nicht spurt, dann ist eine Verlängerung aller Zeiten
erst mal keine so schlechte Idee.

> wie kann ich hier in Forum 3 Dateien posten oder hängen, so kann ich
> dann die .h und .c hier posten.

Mach 3 Postings draus.

von Dominik B. (dominik123)


Lesenswert?

Hallo,
habe mich auch letztens mit so was rum geschlagen.
Gucke doch mal hier:
http://www.goblack.de/desy/digitalt/aktoren/lcd-hd44780/eigenschaften.html

Überprüfe noch mal alle Leitungen am Controller ob er auch richtig 
angeschlossen ist. Den R/W Pin kannst du auch zum Testen auf GND(0V) 
legen (Nur Senden möglich dann). Das hier ist meine Init für einen 
KS0076B aber im 8Bit Modus sollte aber auch für den HD4478 Controller 
gehen.

Quelltext (in C):

void Display_Init(void)
{
_delay_ms(15);                   //Zeit laut Datenblatt
Display_Enable = 0;              //Enable Pin auf 0
PORTD          = 0x30;  //Init 1 //Daten Setzen DB0 bis DB7 bzw. DB3
Display_Enable = 1;              //Enable Pin auf 1 (Daten werden 
Gelesen)
_delay_ms(5);                    //Zeit damit Daten gelesen werden 
können
//-------------------------------
Display_Enable = 0;             //usw...........
PORTD          = 0x30;  //Init 2
Display_Enable = 1;
_delay_ms(5);
//-------------------------------
Display_Enable = 0;
PORTD          = 0x30;  //Init 3
Display_Enable = 1;
_delay_ms(5);
//-------------------------------
Display_Enable = 0;
PORTD          = 0x38;  // Set Function = 8Bit interface, 2 Line<Hier 
4Bit Display,5x7 Dots
Display_Enable = 1;
_delay_ms(5);
//-------------------------------
Display_Enable = 0;
PORTD          = 0x0F;  // Display On = On,Curser On, Blinking on
Display_Enable = 1;
_delay_ms(5);
//-------------------------------
Display_Enable = 0;
PORTD          = 0x01;  // Display Clear
Display_Enable = 1;
_delay_ms(5);
//-------------------------------
Display_Enable = 0;
PORTD          = 0x06;  // Entry Mode Set = Increase, not shifted
Display_Enable = 1;
_delay_ms(5);
Display_Enable = 0;
}//ENDE der Init

Wenn alles geklappt hat Solltest du einen Blinkenden Cursor sehen.


Gruß
Dominik

von Martin (Gast)


Lesenswert?

Hallo,

danke für die Antworte, so fühlt sich man nicht allein mit dem ganzem 
Kram :-) oder?

@ Karl heinz

>> Mach als erste Aktion in deinem Programm eine LED an und nach einer
>> kurzen Wartezeit wieder aus.

alles klar, am andere Port oder?

@ Dominik

>> Überprüfe noch mal alle Leitungen am Controller ob er auch richtig
>> angeschlossen ist.

habe ich etwa 1000 mal gemacht und sollte iO sein da nach dem 
Kompilierung und übertragen des C-Codes auf ein Mal war mein Text am LCD 
ohne ein Hardware eingrifft.

- Quelltext (in C):

- void Display_Init(void)
- {
-_delay_ms(15);                   //Zeit laut Datenblatt

umm... habe von LCD leider kein Datenblatt

anbei mein Code bzw. habe von Tutorial übernommen

Gruß

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

lcd-routines.c.

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

lcd-routines.h.txt

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hauptprogramm.txt

von Martin (Gast)


Lesenswert?

Hallo,

also jetzt ist wieder Zeit zum testen :-)

ich habe gerade der Zeit der Initialisierung von 15 auf 100ms erhöht 
also
>> _delay_ms(100);
und sieht besser aus wenn die Spannung da ist dan ist mein Text da!

@Karl heinz
>> Mach als erste Aktion in deinem Programm eine LED an und nach einer
>> kurzen Wartezeit wieder aus.

habe ich folgendes gemacht:

int main(void)
{
  PORTB |= (1<<PB1);

    lcd_init();

    lcd_data('T');
    lcd_data('e');
    lcd_data('s');
    lcd_data('t');
    set_cursor(0,2);

    lcd_string("Hola Mundo!");

    while(1)
    {
    }

    return 0;
}

Pin 1 leuchtet, wenn ich reset drucke dann geht er aus und wieder an, 
also ist der reset von Controller in Ordnung oder?

Gruß
Martin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.