Forum: Mikrocontroller und Digitale Elektronik LCD +Bascom zeigt 1. Zeile Nix 2. Zeile voll


von Daniel H. (Gast)


Lesenswert?

Hi

Ich such jetzt schon seit stunden hier im Forum nach der Lösung aber
leider nix da und nun will ich es mal selber versuchen.

Ich hab ein Atmega 8 L denn ich über Bascom Progge. Wenn ich folgenden
Prog code nutze:

$regfile = "m8def.dat"                                      'ATMega
8L
$crystal = 4000000                                          'Quarz: 4
MHz

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

Initlcd
Cls
Lcd "Hallo"

End

passiert folgendes. Die erste Zeile bleibt leer die zweite Zeile ist
komplett voll d.h. das alle punkte belegt sind. Ich denke das das ein
init fehler ist bin mir aber da nicht sicher.

jemand eine Idee?

von Hannes L. (hannes)


Lesenswert?

Könnte es sein, dass du das LCD umdrehen musst? Dann wären in der oberen
Zeile alle Punkte aktiv, was auf ein nicht korrekt initialisiertes LCD
schließen lässt (falsche Pinbelegung oder so...).

Zum BASCOM-Programm kann ich dir mangels BASCOM-Wissen keinen Tip
geben.

...

von Ratber (Gast)


Lesenswert?

Ja müßte eigentlich so funktionieren.


Bist du sicher das du das LCD auch richtig angeschlossen hast ?
Nicht alle haben die gleiche Belegung undne schwarze Zeile sieht so aus
als ob da ne Leitung falsch ist bzw. vieleicht nen kurzen vorliegt.




Ws steht unter Options->Compiler->LCD ?
Gegensätzliche anweisungen ?
Wenn ja dann nureins von beiden.(Anweisungen im Listung stehen vor
Menüeintrag aber in seltenen Fällen gibts da Ärger)

von Frank (Gast)


Lesenswert?

INITLCD musst du weglassen.
Sonst nimmt der Compiler die Einstellungen aus
Options->Compiler->LCD.
INITLCD ist in deinem Code nach dem Config Lcdpin aufgelistet und wird
somit eincompiliert.

In der Hilfe steht unter INITLCD

Remarks

The LCD display is initialized automatic at start up when LCD
statements are used by your code.
If fore some reason you would like to initialize it again you can use
the INITLCD statement.

von Daniel H. (Gast)


Angehängte Dateien:

Lesenswert?

ok hab jetzt initlcd weggelassen und so wie in der Beschreibung steht
angeschlossen (anhang). Kann man den LCD nicht irgendwie anderster noch
initen? PS: Ja hatte den LCD laschrum also ist die oberste Zeile voll.

von Ratber (Gast)


Lesenswert?

Nochmal meine Frage:

Stimmt die Reihenfolge der Anschlüsse und sind keine Kurzen bzw.
Unterbrechungen drinn ?

Entspricht das Display auch der Anleitung bzw. andersrum ?

von Daniel H. (Gast)


Lesenswert?

Ja Ich habe es jetzt schon dreimal überprüft. Habe alle nicht
angeschlossenen auf der LCD Platine gebrückt und mit PIN 1 der
verbunden.

Ich habe sowohl in Optionen und im Prog Text die Pin belegung drinne
aber immer die gleiche.

von Ratber (Gast)


Lesenswert?

Hmm


Fassen wir mal zusammen.

Es ist richtig Angeschlossen und die Einstellungen im Compiler sind
auch ok.

Der Controller läst sich beschreiben und auch der Verify (Machste doch
,oder ?) zeigt keine Fehler.



Da fallen mir noch fragen ein:

1.
(Weil wir es gerade in nem anderen Topic haben.)

Die Spannungsversorgung ist so wie gedacht ?

Also Controller und andere Chips mit 100nF geblockt und der
Spannungsregler (wenn vorhanden) auch am Ausgang mit 100nF geblockt
(wegen Schwingneigung) ?

2. Das Kabel vom LCD nicht zu lang ?
So nen Meter Flachbandleitung kann da schon jkede Komunikation
verhindern.


Ja und die Letzte Frage wäre ob das LCD überhaupt in ordnung ist.
Weißt du ob das ok ist oder hast du ein anderes zum vergleichen ?

Wenn wir hier die ganze Zeit nen Toten Gaul reiten dann bringt das ja
nicht viel.


Ja,ansonsten fällt mir da nicht mehr viel ein.

Die Schaltung und der Compiler sind eigentlich recht Einfach das da
nicht viel daneben gehen kann.

von Ratber (Gast)


Lesenswert?

@Daniel



Mir ist noch ne Möglichkeit eingefallen (aus der Ferne zu
diagnostizieren is eben nicht leicht).
Da du komplett im Code Konfigurierst sollte man nichts dem Compiler
überlassen.

Setz mal die "Config Lcd = 20 * 2" vor die "Config Lcdpin....." und
füge  hinter beiden mal diese beiden Zeilen hier ein.

Config Lcdbus = 4
Config Lcdmode = Port



Ich vermute mal der Controller versucht im 8-Bit Mode zu komunizieren
und dein Diplay ist nur 4-Bittig angeschlossen.
"Config Lcdbus = 4" gibt da die richtige Einstellung.

"Config Lcdmode = Port" ist nochmal zur Sicherheit.


Warum mir das nicht früher aufgefallen ist ?

Nun,ich arbeite meist mit I2C für LCD,Tastaturen usw. um Ports zu
sparen.(Normalerweise braucht es beim LCD keinen "Speed" und
Tastaturen haben auch Zeit)
Da konfiguriert es sich ganz anders.

von Daniel H. (Gast)


Lesenswert?

Also

Hab jetzt mal die änderungen gemacht ohne erfolg. Wenn ich den LCD mit
spannung versorge und hintergrund spannung (ohne den Microcontroller)
dann ist da genau das gleiche zu sehen als ohne.

Der LCD und der Controller werden von einem 7805 (3-Pin) versorgt der
unter Last 4,95V abgibt. Das ganze wird im mom über eine neue 9V Block
Batterie gespeist.

Kondensatoren hab ich keine in der Schaltung drinne. Aber der
Microcontroller funzt da ich auf einem anderen Port eine ausgabe laufen
lasse.

Danke schon mal für die ganze mühe die du dir gemacht hast.

von Sven (Gast)


Lesenswert?

Hallo an euch alle,

vergiß nicht, das du den Port auch als Ausgang konfigurieren mußt,
das geschieht nämlich nicht automatisch.

will heißen,

config portd = output
initlcd
cls

lcd "Hello world"

end.

das müßte schon laufen, sofern du das lcd auch im Compilermenü
eingestellt hast.

Gruß

Sven

von Ratber (Gast)


Lesenswert?

@Daniel

Ja 4.95V ist kein Problem.


Mal meine Fragen abgeackert ?

von Christian Axtmann (Gast)


Lesenswert?

Hallo,

ich darf zuerst Mal das AVR-Tutorial (der Teil über das LCD) zitieren:

"Ok, alles ist verbunden, wenn man jetzt den Strom einschaltet sollten
ein oder zwei schwarze Balken auf dem Display angezeigt werden."

Dein Problem scheint zu sein, dass das Display nicht initiiert wird. In
deinem Code kann ich gerade keinen Fehler sehen, bis auf das
"initlcd", das solltest du streichen, das braucht man nu um das LCD
erneut zu initialisieren.
Und das "config PortD = Output" ist obligatorisch, du musst ja
festlegen, in welche Richtungen die Daten fließen sollen.In der
Beispieldatei von Bascom "LCD.bas" steht im Prinzip genau das selbe
drin (abgesehen von den anderen Pinbelegungen).

Zuerst solte man sicher gehen, dass das Display auch HD44780 kompatibel
ist. Dann würde ich mir an deiner Stelle das Multimeter schnappen und
die Verbindungen vom AVR zum Display testen. Am Besten direkt am
AVR-Bein und an der Lötstelle am Display ansetzen.
Und dabei auch noch die Belegung am Display prüfen (siehe hierzu das
Tutorial, ist wirklich gut). Zu Beachten ist hier, dass im 4-Bit-Modus
nicht DatenBit0-3 verwendet werden, sondern das obere Nibble, Db4-7.


So, genug für heute,

Gruß Christian

von Daniel H. (Gast)


Angehängte Dateien:

Lesenswert?

so jetzt gehts mal wieder weiter.

zu ratbers fragen

1. die spannungsversorgung ist nur ein 7805 ohne kondies.

2. die kabellänge beträgt 20cm

3. ich weiss nicht ob er geht aber er ist neu. ich kann ja noch ein
bestellen.

so hab dan noch den Port d aus ausgang eingestellt aber leider auch
ohne funktion. die Leitungen habe ich alle durch gepiepst und sind alle
in ordnung

Hab mir mal das orginal LCD Datenblatt geholt und da sthet drin das das
Ding HD44780 befehle nimmt. ich henge das Datenblatt noch mal an
(anhang) Ich versteh da slangsamm nicht warum das ding nicht funzt.

Der momentane Code sieht so aus:

$regfile = "m8def.dat"                                      'ATMega
8L
$crystal = 4000000                                          'Quarz: 4
MHz

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

Config Portd = &11111111

Config Lcdbus = 4
Config Lcdmode = Port

Cls
Lcd "Hallo"

End

jemand noch eine idee?

von Rene W. (Gast)


Lesenswert?

Hi,

ich habe letztens auch zum ersten mal ein LCD in Betrieb genommen und
hatte genau die gleichen Probleme.

Kontrollier mal ob dein Mega8 auch tatsächlich mit 4MHz taktet.

Bei mir war der Fehler einfach, dass mein Mega16 noch mit dem
Default-Takt von 1Mhz lief. Ich wollte eigentlich gar nicht höher
takten, doch trotz Programm-Anpassung konnte ich das LCD nicht
ansprechen. Nach dem ich das entsprechende Fusebit auf 4Mhz gesetzt
hatte ging alles einwandfrei.

von Daniel H. (Gast)


Lesenswert?

Rene wäre nett wenn du es mir ein bischen detailirter erklären
könntest.

1. Was ist der Default Takt?

2. Fusebit auf 4Mhz = "$crystal = 4000000"?

dann komm ich der ganzen sache etwas näher (hoffe ich).

von Rene W. (Gast)


Lesenswert?

1.) Der Mega8 müsste ab Werk auf den internen Oszillator mit 1MHz
eingestellt sein.

2.) Nein, die "crystal = ..." -Direktive ändert nichts an den Fuses

Ich weiß nicht welche Hard- und Softwareaustattung du hast.
Ich benutze ein STK500 mit AVRStudio, damit ist das Ändern der Fuses
recht simpel. Welche anderen Möglichkeiten es gibt weiß ich nicht genau
(brauchte mich damit noch nicht weiter ausseinander gesetzt), 'hab aber
noch PonyProg(?) im Hinterkopf.
Das müsste dann also jemand anderes beschreiben( das rumflashen am µC
ist ja auch nicht ohne Risiko...).

von Ratber (Gast)


Lesenswert?

@Daniel

Was Rene meint findest du im Programmer.

Klick das Rote Icon für den Programmer an und wäre "Manual Programm"
Wenn dein Controller erkannt wird dann siehste es ja an der passenden
Bezeichnung.

Dann gehste auf den Reiter "Lock an fuse Bits"
Im Fenster runterscrollen bis zur Abteilung "Fusebits" (Direkt vor
"Fusebits High").

Du wirst einen Eintrag erkennen (Beim M16 der letzte eintrag der
Sektion) der bei Fabrikfrischen Controllern auf "0001 Internal
RC-Osscilator 1 Mhz" (Andere Controller = Andere Möglichkeiten) stehen
sollte.
Dort mußt du auf "External Clock" umstellen um mit einem Quarz
arbeiten zu können.

Anschließend mit "Write FS" (Der Button findet sich Rechts am Rand
vom Fenster) in den Controller übertragen.

Damit sollte der M8 dann mit dem von dir angeschlossenen Quarz laufen.


Aber das sollte nicht das Problem mit dem LCD erklären.

Ich hab mal eben aus Spaß bei einem M16 die Fuse von Extern (16 Mhz
Generator) auf Intern 1 Mhz gestellt.

Das Ergebnis ist das natürlich alles jetzt 16 mal langsamer abläuft und
auch eventuelle Pausenzeitien 16 mal länger sind.
Auch das LCD wird in Zeitlupe bedient (Schrifft baut sich sichtbar
langsam auf) aber es läuft einwandfrei.

von Christian Axtmann (Gast)


Lesenswert?

Oder ersetze mal "$crystal = 4000000" durch "$crystal = 1000000".
Wenn dein AVR noch fabrikneu ist und du noch keine Fusebits
umprogrammiert hast könnte das eine Ursache sein.

Im 2. Posting von deinem Code hast du jetzt die Datenbits anderst herum
dem PortD zugewiesen (1. Posting: Db4 = Portd.0; 2. Posting: Db4 =
Portd.3 usw.), Absicht?

von Daniel H. (Gast)


Lesenswert?

@christian

Ja das war absicht da ich ihn beim überprüfen so angeschlossen hatte.
Da ich auf meiner Paltine stecker aufgelötet hatte war ich dann zu faul
auf dem lcd rum zu löten da hab ich es halt im prog geändert.

von Sssssss (Gast)


Lesenswert?

>1. die spannungsversorgung ist nur ein 7805 ohne kondies.
Das schwingt dann doch wie blöde hin und her ?! Guck dir mal die 5V auf
nem Oszi an :-X
Versorg den mal als erstes mal mit vernünftigen Kondensatoren...

von Ratber (Gast)


Lesenswert?

Yo,da hab ich extra noch nach gefragt und glatt die Antwort überlesen.

Richtig,erstmal die Versorgung richtig hinbauen.

Im Anhang eine Denkstütze.

Wie im anderen Topic noch die anmerkung das die Elkos entsprechend der
Leistungen angepasst werden müssen.
Für C1 die Faustformel "1000uF pro A" wenn davor nen Trafo mit
Gleichrichter sitzt.
Wenn da schon nen Geregeltes Netzteil sitzt reicht auch die hälfte.

C2 wird nur bei besonders verseuchten Netzen benötigt

Bau das erstmal um und schau obs das gewesen ist.

von Daniel H. (Gast)


Lesenswert?

Ok dann schon mal vielen dank für die ganzen antworten. Werde dann mal
morgen eine neue Platine ätzen mit einem 1000uF Kondensator zur
Glätung.

Melde mich danach wieder was rausgekommen ist.

von Sssssss (Gast)


Lesenswert?

vergess nicht einige 100nF mit draufzupacken ;)

von Hannes L. (hannes)


Lesenswert?

Und nicht dem Irrtum verfallen, dass ein großer (langsamer) Elko mehrere
kleine (schnelle) Keramik-Kondensatoren ersetzen könnte...

...

von Ratber (Gast)


Lesenswert?

Ja,den Fehler machen viele.

Eine Erklärung mit Luftmodell:


Eine Firma hat einen Großkompressor nebst vorratsdruckbehälter.
Der Kompressor kann den Tagesschnitt bereitstellen.

In der Firma gibt es unzälige Kleinverbraucher wie zb. Druckluftmotore
und kleinere Stellzylinder die einen stetigen Luftstrom durch die
Leitungen verursachen.

Aber es gibt auch Maschinen die Schlagartig eine Größere Menge Luft
brauchen (zb. Pneumatische Pressen).

Da die Durchflußmenge einer Leitung vom Querschnitt abhängt und man
nicht bis in jeden Winkel riesige Rohre legen kann (Kosten und
Raumbedarf) würden diese Maschinen in ihrem Umkreis einen Druckabfall
verursachen der die anderen Geräte beeinflusst.
Aus diesem Grund bringt man an solchen Geräten einen Lokalen
Vorratsbehälter an aus dem die Maschine den Kurzfristigen Bedarf ziehen
kann.(Das Entspricht dem Elko am Gleichrichter und den Elkos an größeren
Schaltstufen.zb. Motoren).
Ergebnis: Der Druck bleibt in der Umgebung stabil.

Kleinere Verbraucher die sporadisch und arythmisch Luft ziehen
(Digitale Schaltkreise) ziehen das Netz zwar nur in geringem Maße in
Mitleidenschaft aber viele davon sorgen für ein Stakato auf dem
Manomenter (Digitales Rauschen) und stören uu. das Verhalten anderer
Komponennten (Eine Turbofeile die dauernd die Drehzahl ändert ist
erlich zum Kotzen)
Hier kämen dann entweder lokale Druckminderer (Spannungsregler) zum
einsatz oder man nutzt hier die Leitungskapüazitäten als Lokalen
Druzckbehälter zum Entstören.
Diesen Effekt erzielt man mit den kleinen 100nF Kondensatoren an jedem
IC.

Ich kann ja mal ne Digitalschaltung aufbauen (Muß ja nicht Sinvoll
sein,nur irgendwelche Digitalfunktionen) und die Versorgung auf dem
Oskar darstellen.
Mal mit und mal ohne Blockkondensatoren.

Vieleicht wäre das hilfreicher denn ich denke mal das die meisten Leute
es eher kapieren wenn sie es sehen können.

von Daniel H. (Gast)


Lesenswert?

Hi

ich mal wieder. Bin gerade am umzeichnen der Platine (hatte die letzten
tage wenig zeit). Was ich noch anmerken wollte ist das die
hintergrundbeleuchtung und die versorgungsspannung über die selbe
leitung läuft. Ist das sehr störend? so wollte ich mir 2 leitungen
sparren. Hab also auf der LCD Platine gerade eine Brücke an die
hintergrund Platine gelötet (mit vorwiederstand).

von Ratber (Gast)


Lesenswert?

Könnte sein.

Da stellt sich die Frage ob die Spannung am Diplay eventuell etwas
einbricht abewr das kannste ja schnell nachmessen.

Die Andere ist welche Beleuchtung du hast.
LED oder ne EL-Folie also mit Wandler.

Der Aussage mit dem Vorwiderstand entnehme ich aber das es ne
LED-Beleuchtung ist.

Mess mal nach oder häng einfach die Beleuchtung ab.

von Marko (Gast)


Lesenswert?

Schon gemerkt, das Bascom für den Controller HD44780 initialisiert,

dein Display aber einen KS0076B hat?

Die sind zwar im groben kompatibel, aber eben nicht ganz :o)

Ich arbeite mit nem KS0078 Display, die Initroutine

findest Du hier im Forum ... HomeCon1.2.Lib oder so.

Die Initioalisierung ist ähnlich dem KS0076B, kannste aber in dem Lib

entsprechend anpassen

von Ratber (Gast)


Lesenswert?

Ja,stimmt,is mir noch garnicht aufgefallen.

von Tobias M. (twam) Flattr this


Lesenswert?

Ich hatte auch schon Displays mit den KS0073 Chipsatz und da musste ich
auch die Routinen anpassen (war allerdings GCC)...

von Christian Axtmann (Gast)


Lesenswert?

Wenn ich das hier gerade richtig sehe, gibts die Displays auch im
Reichelt, aber da steht dabei, dass die den "Kontroller KS0073/HD44780
kompatibel" haben.

von Julian Straub (Gast)


Lesenswert?

Hi
Ich hab auch ein Problem mit meinem Reichelt LCD.
Es ist ein 20*4er Display mit dem Controler KS0076B.
Ich kann nix auf dem Display ausgeben. hab die Anschlüsse schon 3 mal
nachgemessen und die stimmen.
Ich hab mir das obeige durchgelesen. und mir diese LIB mal angeschaut
und auch in Bascom eingebunden. Dadurch ist das schon ein bisschen
besser geworden. Wobei ich immer noch das gefühl habe das meine Befehle
nicht ankommen. Wenn ich zB "hallo" Ausgeben will dann bekomme ich 5
fast schwarze Felder.
Ich hab auch schon versucht die LIB abzuändern, aber ich kenn mich
nciht so mit Asembler aus.
Kann mir vlt jemand von euch ne LIB für den KS0076B schreiben?
Oder mir irgendein Dataseeht geben, wo drin steht was es beim KS0076B
für Befehle gibt?
Vielen Dank!

von Ratber (Gast)


Lesenswert?

>Wenn ich zB "hallo" Ausgeben will dann bekomme ich 5
>fast schwarze Felder.

Nur mal so ganz dumm gefragt weils bei "Hallo" zufällig auch 5
Schwarze kästchen sind.

Den Kontrastregler haste aber drann ja ?

von Simon K. (simon) Benutzerseite


Lesenswert?

Genau, Kontrast umstellen..

von Julian Straub (Gast)


Lesenswert?

Nein ich hab den Kontrast eingestellt. das passt.
Ich bekom auch keine ganz schwarzen felder sondern so ungefär so:
|| (also 2 durchgehende Striche wobei zwischendrin noch eine Rihe nicht
schwarz ist....)
bei hallo sieht das dann so aus: ||||||||||
Find ich halt sonderbar ^^
Fällt jemand dazu was ein?!

von Ratber (Gast)


Lesenswert?

Is schwer zu sagen.

Ich kann hier bei mir immer mit einem anderen LCD gegenprüfen ob die
Komunikation im generellen stimmt oder nicht.

Es ist auch immer ne Frage ob das LCD auch ok ist.

Ne Alternative wäre das LCD an den Parport vom Rechner zu hängen und
mit Jalcd (es gibt natürlioch auch andere Soft) versuchen ob sich was
zeigt.
Das Programmist für viele unterschiedliche Displays ausgelegt und
sollte am ehesten mit Exoten klarkommen.

von Julian Straub (Gast)


Lesenswert?

Hmm. Ich denk halt das es nicht richtig initialisiert wird. Aber ich hab
leider ka wie ich diese Homecon.lib ändern muss um das LCD genau so zu
intialisieren wie es das gerne möchte ^^

Ich hab auch schon ein anderes LCD hingehängt mit dem gleichen
ergebnis. :(

Ich denk ich werds nciht an mein Pc anschliesen, weil ichs auf nem
mobielen Robo brauche ;) das würd nich so viel bringen oder?
Hast du vlt irgendwo was wo ich sehn kann wie man einen KS0076B richtig
initialisiert ?

von Ratber (Gast)


Lesenswert?

>ch denk ich werds nciht an mein Pc anschliesen, weil ichs auf nem
>mobielen Robo brauche ;) das würd nich so viel bringen oder?

Es ging darum mit der obigen Soft zu testen ob das Display überhaupt
funktioniert.

von Pascal Köhler (Gast)


Lesenswert?

Hallo.
Bin aufgrund gleicher Probleme auf dieses Forum gestoßen, obwohl die
Beiträge wohl älter sind. Habe aber nun die Lösung gefunden.

1. Muss der Port, wo das LCD angeschlossen ist, als Ausgang definiert
werden.
2. Dann den Typ vorgeben
3. PIN-Belegung definieren
4. Übertragungsmodus
5. Anschlußmodus
...zum Schluß dann initialisieren lassen.

Bei mir wir folgender Text zur Definition und Initialisierung
eingegeben

Config Portc = Output
Config Lcd = 16 * 2
Config Lcdpin = Pin , R = Portc.7 , E = Portc.5 , Db4 = Portc.4 , Db5 =
Portc.3 , Db6 = Portc.2 , Db7 = Portc.1
Config Lcdbus = 4
Config Lcdmode = Port
Initlcd

danach:

Cls
Lcd "Message."

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.