Initialisierung LCD Display DOG-M163v5 mit BASCOM

Markus

BASCOM-Experte
11. Jan. 2008
1.190
6
38
Lonsee
Sprachen
Hallo zusammen,

habe gestern Abend eine komische Beobachtung gemacht die ich mir nicht erklären kann und bei der ich Hilfe gebrauchen könnte. :eek:

Habe versucht ein LCD-Display DOG-M 16x3 unter BASCOM in einer GOSUB-Routine zu initialisieren. Interessanter Weise fuktioniert dann der darauf folgende Locate 2,1 : Lcd "Testtext" nicht und es wird kein Text in Zeile 2 ausgegeben.
Locate 1,1 : Lcd "Testtext" funktioniert und Locate 3,1 : Lcd "Testtest" funktioniert auch nicht. Wenn ich aber anstelle des Locate Befehls den Lowerline Befehl verwende dann wird der Testtext in Zeile 2 ausgegeben.

OK, so sieht der Code aus:

$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40

Gosub Lcd_konfig

' Locate 1 , 1 funktioniert
Locate 2 , 1 ' funzt nicht
' aber Lowerline für 2. Zeile funktioniert

Lcd "Test Test Test !"
Wait 1

Do
' tue nix
Loop

Lcd_konfig:
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 3 , Chipset = Dogm163v5
Config Portc = Output
Config Lcdbus = 4
Initlcd
Waitms 100
Cursor Off Noblink
Cls
Return


Wenn ich stattdessen die Gosub-Routine auflöse und die Initialisierung direkt im Kopf mache dann funktioniert alles richtig, auch Locate 2,1.

$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40

Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 3 , Chipset = Dogm163v5
Config Portc = Output
Config Lcdbus = 4
Initlcd
Waitms 100
Cursor Off Noblink
Cls

Locate 1 , 1
Lcd "Test Test Test !"
Wait 1

Do
' Tue nix
Loop


Hmmmm, kann mir jemand das Verhalten erklären. Warum kann ich das LCD nicht in einer Gosub-Routine initialisierung und warum zeigt sich dort das teilweise komische Verhalten?

Grüße,
Markus
 
Hallo Markus,

das hört sich alles schon sehr seltsam an, ich kann auch keinen Fehler in deinem Programm finden.

Für mich hört sich das irgendwie nach einem Timingproblem an. Der letzte Befehl von der Initialisierung des LCD ist Cls. Für ClearScreen (ClearDisplay) benötigt der LCD-Controller im Vergleich zu den anderen Befehlen sehr viel mehr Ausführungszeit, mindestend 600us. Ich gehe mal davon aus, dass Bascom den Displayinhalt nicht manuell durch Schreiben von Leerzeichen, sondern durch Ausführung des LCD-Controller-Befehls ClearDisplay löscht. Bascom muss diese Instruction-Ausführungszeit erst abwarten, bevor ein Locate Befehl gesendet werden kann. Ich könnte mir vorstellen, dass es hier irgendwie ein Problem gibt, wenn mit einem Return aus einer Subroutine zurückgesprungen wird, es wäre möglich, dass hierbei diese Wartezeit (Busyflag abfragen) nicht eingehalten wird.

Um das austesten zu können, "baue" doch mal vor dem Locate eine Pause von 2ms ein, mit der Subroutinen-Version. Wenn Locate hierbei funktioniert, liegts am Timing.

Ansonsten fällt mir so auf Anhieb nichts anderes ein.

Ein Tipp beim Schreiben von Code: Du kannst den Code in eine CodeBox einbinden, wenn du oben in der Editormenüleiste "#" drückst, dann läßt sich der Beitrag besser lesen ... obwohl du es auch mit dem Einfärben des Textes machen kannst, der Beitrag läßt sich auch so gut lesen.

Grüße
Dirk
 
Hallo Dirk,

das ist in der Tat komisch.
Solche Verhalten habe ich mit BASCOM immer wieder mal aber komme nur selten auf die wirkliche Lösung. Meistens läuft es auf einen funktionierenden Workaround hinaus.

Es ist wohl bei BASCOM so, das alles was mit config anfäng nach oben in den Programmkopf, also an den Anfang muss!!!

Nur warum das so ist, darauf habe ich noch keine Antwort. Habe zu diesem Thema auch im BASCOM-Forum mal gewühlt.
Dein Tipp mit der Wartezeit ist plausibel und daran habe ich auch schon gedacht, ich habs sogar schon ausprobiert und es hat nicht funktioniert.
Habe dann gestern Abend noch mit einem Freund telefoniert der mit BASCOM auf einem ATmega einen Universal Timer für die Fernsteuerung von digitalen Spiegelreflexkameras realisiert hat. Er kannte diesen Effekt auch noch nicht und hatte dafür auch keine Erklärung.

So gilt halt mal erst "alles was config heißt nach oben" :(

Danke auch für Deinen Tipp mit der CodeBox. habe sowas schon gesucht, hatte leider # übersehen. Mache ich das nächste Mal garantiert, denn praktischer ist das :)

Mal sehen, jetzt nehme ich mal noch Kontakt mit MCS auf. Vielleicht kann mir der Hersteller vom BASCOM sagen was bei Config Sache ist.

By the Way, hatte schon andere schöne Dinger erlebt. Z.B. eine globale Konstante und eine Subroutine mit gleichem Namen. Wird vom Compiler nicht erkannt! Code wird compiliert und man wunder sich das er sich komisch verhält. Eine Anfrage bei MCS läuft aber ich habe bisher noch keine Antwort.

So, nun mach ich mich an meine DCF77 Clock mit DS1307 RTC und wenn der Code rennt dann gibt es einen neuen Beitrag im Forum. HW ist fertig und funktioniert :D

Grüßle,
Markus
 
So funktionierts

Der Beitrag ist zwar schon eine Weile her, aber es gibt immer wieder Newcommer, die etwas Hilfe brauchen können. Deshalb habe ich mir das mal genauer angeschaut:

Um Initialisierungen in einer Unterroutine vorzunehmen, wird die Anweisung $initmicro benötigt. Diese erwartet dann eine Routine mit dem Label _init_micro.

Dort können dann Initialisierungen vorgenommen werden.


Code:
$sim
$initmicro                                                  ' INITIALISIERUNG IN DER UNTERROUTINE: _init_micro

$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 32
$framesize = 40

'Gosub Lcd_konfig

' Locate 1 , 1 funktioniert
Locate 2 , 1 ' funzt nicht
' aber Lowerline für 2. Zeile funktioniert

Lcd "Test Test Test !"
Wait 1

Do
' tue nix
Loop

'  ----------------------------------------------
'  Initialisierung
'  ----------------------------------------------

_init_micro:
'Lcd_konfig:
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 3 , Chipset = Dogm163v5
'Config Portc = Output
'Config Lcdbus = 4
'Initlcd
Waitms 100
Cursor Off Noblink
Cls
Return

Übrigens, wenn LCD mit Pin (CONFIG LCDPIN=..) konfiguriert wird, macht es wenig sinn, das LCD nochmal auf 4-Bit Bus (CONFIG LCDBUS=4) zu konfigurieren.

Die verwendeten Pins für das LCD werden mit dem CONFIG-Befehl bereits als Ausgänge konfiguriert, so dass der Befehl Config PORTC=Output entfallen kann.

Der Befehl INITLCD wird ebenfalls bereits mit Config LCDPIN erschlagen und kann entfallen.

In der Simulation funktioniert es bei mir.

Gruß Mitch.
 
Hi Mitch,

super danke für den hinweis. Man lernt nie dazu und ich wusste das Thema mit $initmicro bisher auch nicht.

Grüße,
Ma
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)