Forum: Mikrocontroller und Digitale Elektronik LCD- Wahnsinn!


von Jörg (Gast)


Lesenswert?

Hallo!
Bin kurz vor dem verzweifeln!
Habe ein LCD (4x16, mit einem HD44780) und will das Ding im 8 Bit Modus
ansteuern. Ich kriegs nicht hin das DIng zu initialisieren.
Alles was er mir zeigt sind schwarze Klötze in der 1. und 3 Reihe,die
zeigt er auch wenn ich nur Versorgungsspannung anlege. Sprich: Er macht
gar nüschd.
Hat vielleicht jemand ein richtig simples Programm in c, am besten
schon für nen Atmega8? (lcddemo.c funktioniert auch nicht)

Wäre dankbar für jegliche Hilfe, sonst gibt es hier bald lcd Schrott!

jörg

von peter (Gast)


Lesenswert?

Schon mal den kontrast eigestellt?

von Jörg (Gast)


Lesenswert?

Na ja, also ich seh ja was , nur eben nicht das was ich will.
zu wenig kontrast kanns ja nicht sein, die Balken sind ja absolut
klar...

von Dieter B (Gast)


Lesenswert?

Hallo Jörg

Das Zeile 1 und 3 schwarz sind zeigt doch schonmal, das deine
Initalisierung des LCD nicht klappt. Sonst wären alle 4 Zeilen
gleichmässig schwarz, je nach Kontrast.

Wartezeiten eingehalten ??

Poste deinen Code und dir wird geholfen.

MFG
Dieter

von Jörg (Gast)


Angehängte Dateien:

Lesenswert?

Ich hoff ihr lacht euch nicht gleich schlapp wenn ihr meinen Code seht,
denke es ist recht deutlich zu erkennen dass ich das noch nicht lange
mache.

Also, vielleicht hilft es ja was.
Kann es sein dass meine Pausen zu ungenau sind? also zu kurz kann es
fast nicht sein, das hab ich schon probiert, aber vielleicht zu lang?
(Oder einfach sch....!  ;-) )

von Dieter B (Gast)


Lesenswert?

Hallo Jörg

Auf den ersten Blick fehlen mir die Konfigurationen der Ports.

DDRB, DDRD  eingang oder Ausgang, sollte man schon einstellen.

Schreib mal, welchen Takt und wo genau die Steuerports liegen, habe
wenig Lust die jetzt zu suchen.

Am besten oben in die Datei rein als Kommentar.

Dieter

von Dieter B (Gast)


Lesenswert?

Hier noch eine sehr gute Seite zum Thema

http://www.sprut.de/electronic/lcd/index.htm


MFG
Dieter

von Jörg (Gast)


Angehängte Dateien:

Lesenswert?

sorry.hab das mal ergänzt.

von Maddin (Gast)


Lesenswert?

Hab das eben mal schnell überflogen,
weiß auch nicht welchen Compiler du benutzt,
aber das dürfte so nicht funktionieren:

"outp(00111000,PORTD);"

Du hast es nicht als binär gekennzeichnet, deshalb wird es als
Dezimal angesehen, und das haut nicht hin.
0b00111000 oder 0x38 oder 56.

Ob noch andere Fehler drin sind, danach hab ich jetzt nicht geguckt,
aber versuch es erstmal mit den Zahlen.

Gruß,
Maddin

von Jörg (Gast)


Lesenswert?

hallo,

also das hab ich schon probiert, aber das mit dem 0b001... akzeptiert
der compiler nicht. invalid suffix
aber ich probiers mal mit hex zahlen, danke.
ich hab  winavr.

von Jörg (Gast)


Lesenswert?

Hallo!

Erfolg!
Das mit den verdrehten zahlen wars!
wenn ich sie al sHex Zahlen eingebe dann funktionierts und er knallt
mir alles mit A´s voll!
Vielen dank!

Aber dann hab ich noch ne Frage: Wie kann ich ihm denn sagen dass es
eine binär zahl ist, wenn 0b nicht funktioniert?

von Dieter B (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Jörg

War wohl etwas langsam.

Schau den Code mal an.

Du solltest dir mal überlegen, ob man im 2. Schritt eine Funktion zum
schreiben von Befehlen erstellen sollte.

Weiterhin viel Spaß

Dieter

von Jörg (Gast)


Lesenswert?

Ja danke, das werde ich wohl als nächstes in Angriff nehmen, zumindest
wenn ich mein nächstes Problem gelöst habe.
Ich wollte jetzt so Spasshalber einfach mal nacheinander die Buchstaben
für "Hallo" ausgeben. Dabei gibts 2 Probleme.
1. Er fängt an der letzten Stelle der ersten Zeile an zu schreiben. Ich
ehme an da hab ich einfach was falsch initialisiert, oder?

2. Was mich mal wieder ziemlich  verwirrt: Ich kann nur jeden 2.
Buchstaben ausgeben. Also es er gibt z.B immer nur ein "C" aus wenn
ich eigentlich ein "B", will, ein F wenn ich ein E will. Woran kann
das liegen?


Also falls jemand eine Idee hat wäre ich sehr dankbar.

Ansonsten schöne Ostern allerseits.

von Jörg (Gast)


Lesenswert?

Zu 2.nochmal: also er gibt ein C aus wenn ich ein B will und er gibt
aber auch ein c aus wenn ich ein c will. Nur der vollständigkeit
halber.

von Dieter B. (Gast)


Lesenswert?

Hallo Jörg

Dann zeig mal deinen aktuellen Code.

MFG
dieter

von Stefan Kleinwort (Gast)


Lesenswert?

Ich tippe mal, dass eine Datenleitung nicht funktioniert (D0).
Vielleicht funktioniert deshalb die Initialisierung auch nicht
richtig.

Stefan

von Dieter B. (Gast)


Lesenswert?

Der Tip mir Datenleitung D0 ist gut. Schätze mal der liegt dauernd auf
HIGH.

Kannst du das Display über den Befehl löschen ?? Dürfte dann aber auch
nicht gehen.

MFG
Dieter

von Jörg (Gast)


Lesenswert?

Morgen!

Ihr hattet mal wieder recht! Hatte mir eine schöne Lötbrücke zwischen
Vcc und D0 eingebaut. Jetzt kommen alle Buchstaben wunschgemäß.
allerdings immer noch von der falschen Seite. Aber den Fehler werd ich
schon noch finden, kann ja eigentlich nur an der Initialisierung
liegen...

Danke
Jörg

von Christian Schifferle (Gast)


Lesenswert?

Hallo Jörg


(Aber dann hab ich noch ne Frage: Wie kann ich ihm denn sagen dass es
eine binär zahl ist, wenn 0b nicht funktioniert?)

Die binäre Darstellung von Konstanten mit 0bXXXXXXXX ist im C-Standard
nicht vorgesehen. Einige Compiler stellen so was zur Verfügung, damit
verlierst du jedoch die Portierbarkeit auf andere Systeme.

Du könntest dir jedoch ein Includefile basteln, in welchem du mittels
#define alle benötigten Zahlen einträgst.
Beispiel:

#define 0b00000000   0
#define 0b00000001   1
#define 0b00000010   2
#define 0b00000011   3
etc.

von Peter D. (peda)


Lesenswert?

Wenn Du portabel sein willst, geht das sehr einfach mit nachfolgendem
Macro:

#define B8(y)   ( 0x##y       &   1 \
                | 0x##y >>  3 &   2 \
                | 0x##y >>  6 &   4 \
                | 0x##y >>  9 &   8 \
                | 0x##y >> 12 &  16 \
                | 0x##y >> 15 &  32 \
                | 0x##y >> 18 &  64 \
                | 0x##y >> 21 & 128 )


test()
{
  P0 = B8(1);
  P0 = B8(11);
  P0 = B8(111);
  P0 = B8(0000111);
  P0 = B8(1000);
  P0 = B8(10000000);
  P0 = B8(11111111);
}


Peter

von Absoluter Anfänger (Gast)


Lesenswert?

Hey Peter!
Dein geniales Macro hat mich mächtig beeindruckt. Ich habe es auch
schon getestet. Ich suche schon seit Längerem eine Möglichkeit, für
Initialisierungen Binärwerte eingeben zu können.

Ich habe ein paar Fragen hierzu:
Wenn man nun die Zeile "P0 = B8(111);" hernimmt: Ist dieses Macro wie
ein Unterprogramm, das angesprungen wird zu verstehen oder wird der
angegebene Wert während des Compilierens fix in das Programm
integriert? Was ich damit meine - Geht es schneller, wenn ich schreibe:
P0 = 0x07; statt B8(111);

Kannst du mir bitte das Makro etwas genauer erklären? Ich würde es
nämlich gerne auf 16Bit ausdehnen.

Danke Tschüss!

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.