Anzeigefehler auf 16 *1a LCD

pcprofi

Neues Mitglied
12. Apr. 2008
90
0
0
Sprachen
Hallo Forenmitglieder,

ich bin mal ganz neu hier... Ich habe erst vor kurzem mit Bascom und der AVR-Geschichte angefangen. Mittlerweile stehe ich aber vor einem für mich unlösbaren und unerklärlichem Problem, vll könnt ihr mir da helfen:

Wenn ich in diesem "Menü" den Wert hinter Set Min angezeigt bekomme, dann wird dort korrekt die Zahl angezeigt.
Sobald ich dann aber die Taste "add" drücke, und der Wert aktualisiert wird, ist folgendes zu sehen:

p4120757_111.jpg


Es tauchen diese STriche und alle möglichen Zeichen auf, jedesmal wenn ich Add drücke - und hinten, wo jetzt die 1 steht, da wird korrekt die Zahl dann angezeigt....

Jetzt hab ich keine Idee woran das liegt.

Code:
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 1a , Chipset = Ks077
Config Lcdbus = 4
Initlcd
Cls
Cursor Off Noblink

Das ist der Display-Init...

Und hier der Entsprechende Ausschnitt aus dem Quelltext:

Code:
While Settings_pos < 5
  Cls
  Select Case Settings_pos
  Case 0
    Text = "Set min: "
    Lcd Text ; Str(_min)
  Case 1
    Text = "Set Std: "

[...]

  End Select
  While Set_sw = 1
    If Add_sw = 0 Then
    Cls
      Select Case Settings_pos
        Case 0
          Var = _min
          If Var = 59 Then
            Var = 0
           Else
            Incr Var
          End If
          _min = Var
          Lcd Text ; Str(_min)
        Case 1
          Var = _hour

[...]

      End Select
      Waitms 400
    End If
  Wend
  Settings_pos = Settings_pos + 1
Wend

Man muss vll noch dazu sagen, dass es sich dabei um eine Uhr handelt, die mit dem internen Config Clock und nem 32768kHz-Quarz läuft.

Achja - bin Anfänger, also bitte unsauberheiten im Code mal übersehen:D

Gruß Rainer
 
Hallo Rainer,

hab zwar grad wenig Zeit und kann mir Dein Problem nicht näher und tiefergehend ansehen aber vielleicht hilft Dir ja ein kleiner Tipp.

Mir sieht sich Dein Probem sehr stark nach einem Formatfehler in dem Zeichenstring aus den Du ausgeben möchtest. Vermutlich ist da im String noch was mit drin was da nicht hingehört.

Hab da was im Hinterkopf, das _min im BCD-Format abhelegt ist. Würde bedeuten Du kannst nicht einfach den STR nehmen. Schau mal in der BASCOM-Hilfe nach, ich glaube aber das ist so.

Dann kannst Du mal probieren die Minuten mit
Code:
Print "Set min : " ; Bcd(_min) bzw.
LCD "Set min : " ; Bcd(_min).
auszugeben.

Wenns so ist dann musst Du auch beim befüllen der Variable aufpassen und mit den Funktionen "Makebcd" und "Makedec" arbeiten.

Aber wie gesagt, hab noch nicht genauer reingeschaut, ist erstmal ne Vermutung aufgrund Reaktionen einzelnen grauer Hirnzellen. Probiers aus, geb mir Bescheid und wenns net funzt dann schau ich die nächsten Tage mal genauer rein!

Grüße,
Markus
 
Erstmal danke für deine Antwort....

Also, ich hab die von dir gepostete Vorschläge mal getestet - leider ohne Erfolg.

Ich hatte die Uhr vorher auch bereits am laufen allerdings nicht mit dem internen Config Clock, sonder extern mit 16MHz Quarz, und alles von Hand gelöst, die ganzen Zähler und so... mit dem Internen RC-Oszillator lief das Ding wie ne Eieruhr.

Komischerweise hat das Menü - vom Aufbau her völlig gleich, nur halt eben auf Byte-Vars zugreifend - völlig problemlos funktioniert.

Die BASCOM Referenz sagt dazu leider nur Schwamm - oder ich bin zu blöd es zu übersetzen, ich finde die interne Clock schlecht dokumentiert - oder ich weiß nciht wo es steht.


Gruß Rainer

[edit]

Ich habe gerade festgestellt, wenn man wieder beim Reset auf 0 ankommt, dann wird wieder richtig angezeigt.
 
Hallo,

konvertiere die _min mal in eine gültige String-Variable und zeige die dann an. Bascom kann teilweise nicht 2 oder mehr Funktionen gleichzeitig machen. Also so :

Dim Test_string as String*2
.
.
.
Test_string = Str(_min)
Lcd Text ; Test_string

Thomas
 
Wenn ich das so mache, tritt ein neuer Effekt auf: Es wird nur nch eine Stelle Müll angezeigt und dann zweimal hintereinander der eingestellte wert, auf dem Foto hier gerade die 12.

Und wie gehabt bei der Null ist die Anzeige korrekt.

Gruß Rainer
 

Anhänge

  • P4120758.jpg
    P4120758.jpg
    23,2 KB · Aufrufe: 15
Hallo,

ich habe es eben getestet und so funktioniert es:

dim Temp as byte

Code:
 Temp = Val(string2)
          If Temp = 59 Then
            Temp = 0
           Else
            Incr Temp
          End If
          String2 = Str(temp)
          String2 = Format(string2 , "00")
          _min = Temp
          'Time$ = Mid(string1 , 1 , 3) ; String2 ; Mid(string1 , 6 , 3)
          Lcd Text ; String2

Der Auskommentiere befehlt funktioniert NICHT; obwohl er imho nach der Befehlsreferenz auch gehen müsste, soll mir aber egal sein - jetzt funktioniert das ganze.

danke schön,

Gruß Rainer
 
Hallo Rainer,

super wenn Dein Problem gelöst ist. Einige Fragen und Anregungen haben ich noch.

Frage: Welche Version von BASCOM verwendest Du? Lizenz oder Demo-Version? Ggf. kommt der Effekt mit der auskommentierten Zeile durch einen Bug in BASCOM bzw. durch eine Wechselwirkung in der BASCOM-Version die es laut MCS nicht giebt aber die in der Praxis auftauchen.

Dann noch ein kleienr Tipp zur Vorgehensweise bei der Analyse von solchen Fehler. Es bietet sich an, wenn BASCOM wieder was macht was man icht versteht mit "Print" auf der RS232 Debug-Informationen auszugeben. Ggf. rentiert es sich auch mal mit Print Bin(x) eine Variable im Binär-Format oder mit Hex(x) im Hex-Format auszugeben um zu verstehen, was im Code gerade passiet. Um ein Problem einzukreisen habe ich schon in jeder 2. Zeile nach einer Operation eine Art "Trace" auf der RS232 rausgeschrieben und mir im Terminla-Fenster angesehen um zu verstehen was passiert. Das hilft manchmal wirklich weiter. Bei dem Problem wo das "zerschneiden" von String nicht richti geklappt hat bzw. in der Original-Variablen noch andere Inhalte dring waren die Du nicht brauchen konntest hätte eine Ausgabe von Zusatzinformationen auch geholfen.
Ist nur so ne Idee die ich in meinen Programmen prinzipiell immer nutze. Oft lasse ich die Debug-Informationen sogar drin und verschachtle sie mit einem "if define" so dass ich sie zur Compilezeit abschalten oder zuschalten kann.

Grüße,
Markus
 
Hallo Rainer,

super wenn Dein Problem gelöst ist. Einige Fragen und Anregungen haben ich noch.

Frage: Welche Version von BASCOM verwendest Du? Lizenz oder Demo-Version? Ggf. kommt der Effekt mit der auskommentierten Zeile durch einen Bug in BASCOM bzw. durch eine Wechselwirkung in der BASCOM-Version die es laut MCS nicht giebt aber die in der Praxis auftauchen.

Ich arbeite mit der Version 1.11.9.1 DEMO - leider hat man als Abiturient nicht mal eben 80€ über... Soll aber eine der nächsten Anschaffungen werden

Dann noch ein kleienr Tipp zur Vorgehensweise bei der Analyse von solchen Fehler. Es bietet sich an, wenn BASCOM wieder was macht was man icht versteht mit "Print" auf der RS232 Debug-Informationen auszugeben. Ggf. rentiert es sich auch mal mit Print Bin(x) eine Variable im Binär-Format oder mit Hex(x) im Hex-Format auszugeben um zu verstehen, was im Code gerade passiet. Um ein Problem einzukreisen habe ich schon in jeder 2. Zeile nach einer Operation eine Art "Trace" auf der RS232 rausgeschrieben und mir im Terminla-Fenster angesehen um zu verstehen was passiert. Das hilft manchmal wirklich weiter. Bei dem Problem wo das "zerschneiden" von String nicht richti geklappt hat bzw. in der Original-Variablen noch andere Inhalte dring waren die Du nicht brauchen konntest hätte eine Ausgabe von Zusatzinformationen auch geholfen.
Ist nur so ne Idee die ich in meinen Programmen prinzipiell immer nutze. Oft lasse ich die Debug-Informationen sogar drin und verschachtle sie mit einem "if define" so dass ich sie zur Compilezeit abschalten oder zuschalten kann.

Über diese (sehr gute) Idee habe ich auch schon nachgedacht - allerdings gehts ja nicht über die ISP-Schnittstelle und ne UART bzw. nen MAX232 (man bedenke - es handelt sich um eine Uhr!) will ich Platz und Stromspartechnisch eg auch nciht einbauen.

Ich habe da gerade Übrigens noch dran gebastelt:
Dass es eben funktioniert hatte war Zufall durch einen Tippfehler bei mir - es lag NICHT daran, wie eben gepostet.
Vielmehr scheint es sich hier um einen Bug in BASCOM zu handeln - jetzt kommt meine Begründung für die Behauptung.

Das ist ein 161A-LCD-Display. Das bedeutet, 16Zeichen, ABER jeweils als 8 Zeichen in 2 Zeilen gehandelt. BASCOM kann das - mit der Config 16 * 1a. Aber: Der Fehler tritt genau dann auf, wenn der String nicht genau das 9. Zeichen im Display ist. Genauer: wenn er nicht auf der "2.Zeile" anfängt. Die Zeichen, die es von diesem "Zeilenanfang" weg ist, die werden mit solchem Datenmüll gefüllt - habe das mit mehreren Leerzeichen davor getestet.
Dann vermute ich, dass letztenendes dort mehrere Sachen dazu kamen - wie zum Beispiel nicht näher spezifizierte Datentypen bei _min, _hour usw :mad:

Was ich nachhr ncoh testen werde ist das ganze jetzt doch mit einem Locate() zu machen - muss aber erst herausfinden, was ich im Locate x,y für x und y angeben muss.

Gruß Rainer
 
Achtung mit dem Locate! Hier könnte es besonders wichtig sein nicht 1,1 oder 1,2 zu schreiben. Bei manchen Displays beginnt die 2. Zeile z.B. bei 40. Das hat mit dem Speichermanagement des Displays und der Organisation des LCD-Controllers zu tun. Du solltest hier sehr aufmerksam das Datenblatt nach möglichen Anzeichen durchwühlen bzw. mal im Internet suchen ob es bei anderen Herren ähnliche Erfahrungen in diesem Bereich gab und einer einen Tipp veröffentlicht hat.

Siehe hierzu auch den Thread
http://www.avr-praxis.de/forum/showthread.php?t=86
im Forum

[2] Architektur des LCD-Display:
Soweit ich verstanden habe kann man nur die Zeichen 1 - 8 mit "Locate 1,1" ansprechen. Versucht man jedoch mit "Locate 1,9" die Zeichen ab 9 anzusprechen scheitert dieses. Den Zeichen ab 9 sind die Werte 40 - 47 zugeordnet. Das Locate muß also "Locate 1,40" lauten. Probiers aus!
Ich glaube das hat mit der Speicherstruktur des LCD-Chip und mit Paging zu tun, wie der Controller die Daten im Speicher mapped.

Unter Umständen zeigt Dein Display eine ähnliche Organisation.

Grüße,
Markus
 
Also ich habe das grad mal ausgetestet. Zeichen 1-8 Mit Locate 1,1-8 und 9-16 dann mit Locate 2,1-8... Aber fragt mich nciht warum

Ich werd den Chip aber mit 8 MHz rechnen lassen (jaja- damit ist Stromsparen wieder dahin mit 13mA) - aber dann hab ich das Problem nicht mehr - ich kann das ganze Display löschen und komplett neu beschreiben (jede Sekunde bei der Uhrzeit) ohne das man es bei ungenauen Hinsehen sieht. Fertig. Spart außerdem Code - hab ja nur die Demo.

Aber zum testen werde ich den Locate bei dem Problemcode dann doch noch mal versuchen - weil iwie stört mich das jetzt schon.

Wie gesagt - deswegen noch mal eine Anfängerfrage: Kann man den ADC nur auf bestimmte Ports des PC# anwenden - so dass man davon noch welche als I/Os verwenden kann?

Gruß Rainer
 
Hallo Rainer,

leider erschließen sich mir Deine zum Teil verwendeten Abkürzungen nicht einmal beim 20x durchlesen. Somit fange ich jetzt mal das Raten an.

Ich vermute dass Du einen Mega8 verwendest, richtig?
Weiter vermute ich, dass Du mit ADC die allgemein übliche Funktion "analog digital converter" meinst und dass Du einen oder mehrere der 6 möglichen ADC's im Mega8 verwenden möchtest/musst und die restlichen als GPIO-Pins benutzen möchtest. GPIO steht übrigens für General Purpose Input/Output devices und damit sind programmierbare Eingänge und Ausgänge gemeint.

Sollte ich mit meinen Annahmen nicht ganz falsch liegen so lautet die Antwort auf Deine Frage nach dem ADC "JA" du kannst.
Du kannst jeden einzelnen ADC separat konfigurieren und die anderen nicht benutzten PIN's für andere Aufgaben verwenden. Dies gilt übrigens beim ATmega bis auf ganz wenige Ausnahmen für alle PIN's! Wenn Du zum Beispiel einen Timer verwendest so sind die mit dem jeweiligen Timer verbundenen PIN's nicht automatisch dem Timer zugeordnet sondern sie werden dies erst nach Konfiguration.

Manchmal geht BASCOM hier seltsame Wege, z.B. werden bei einem CONFIG durchaus mal die internen PullUps konfiguriert die man aber dann doch nicht braucht. Wie auch immer, in allen Fällen ist ein Blick ins Datenblatt notwendig und so manche Sachen muss mann auch über die Register direkt machen. Aber keine Angst, Dein ADC-Problem bekommst Du mit BASCOM-Standard-Dingen hin.

Wenns Dich interessiert dann schau Dir mal meinen Thread zur Lichtmessung an. Ich verwende in meinem Mega128 auch nur einen einzigen ADC und die restlichen PIN's sind normale Ein- und Ausgänge. Wie gesagt, hängt einfach mit der Konfig zusammen.

Grüße,
Markus
 
Hallo Rainer,

leider erschließen sich mir Deine zum Teil verwendeten Abkürzungen nicht einmal beim 20x durchlesen. Somit fange ich jetzt mal das Raten an.

Ich vermute dass Du einen Mega8 verwendest, richtig?
Weiter vermute ich, dass Du mit ADC die allgemein übliche Funktion "analog digital converter" meinst und dass Du einen oder mehrere der 6 möglichen ADC's im Mega8 verwenden möchtest/musst und die restlichen als GPIO-Pins benutzen möchtest. GPIO steht übrigens für General Purpose Input/Output devices und damit sind programmierbare Eingänge und Ausgänge gemeint.

Da hast du aber alles richtig verstanden.

Sollte ich mit meinen Annahmen nicht ganz falsch liegen so lautet die Antwort auf Deine Frage nach dem ADC "JA" du kannst.
Du kannst jeden einzelnen ADC separat konfigurieren und die anderen nicht benutzten PIN's für andere Aufgaben verwenden. Dies gilt übrigens beim ATmega bis auf ganz wenige Ausnahmen für alle PIN's! Wenn Du zum Beispiel einen Timer verwendest so sind die mit dem jeweiligen Timer verbundenen PIN's nicht automatisch dem Timer zugeordnet sondern sie werden dies erst nach Konfiguration.

Damit hast du mir jetzt gleich 2 Fragn beantwortet. Bei einem Projekt mochte der nämlich nen Taster net an einem Pin - jetzt weiß ich warum, es lag der Timer drauf.
Das mit dem ADC (wie kürzt man den denn nun richtig ab???) war schon wichtig, weil eine Uhr mit dem ATMega8 und 5 Tastern + Display im 4Bit - da werden die Pins recht schnell knapp, dafür kann man dem Mega dann auch was an Arbeit geben, obwohl der sich bei einer Uhr an allen Funktionen langweilen wird.

Manchmal geht BASCOM hier seltsame Wege, z.B. werden bei einem CONFIG durchaus mal die internen PullUps konfiguriert die man aber dann doch nicht braucht. Wie auch immer, in allen Fällen ist ein Blick ins Datenblatt notwendig und so manche Sachen muss mann auch über die Register direkt machen. Aber keine Angst, Dein ADC-Problem bekommst Du mit BASCOM-Standard-Dingen hin.

Das ist scon mal gut - als Anfänger hat man es da leider nicht immer ganz leicht, zumal mein Englisch nicht wirklcih das allerbeste ist - aber ich werde mich weiter schlau machen, wie ich ein Thermometer hinbekomme.

Wenns Dich interessiert dann schau Dir mal meinen Thread zur Lichtmessung an. Ich verwende in meinem Mega128 auch nur einen einzigen ADC und die restlichen PIN's sind normale Ein- und Ausgänge. Wie gesagt, hängt einfach mit der Konfig zusammen.

Grüße,
Markus

Welcehn Thread meinst du denn? Konnte leider unter deinen jetzt nichts in die Richtung finden - oder ich bin einfach mal wieder zu blöd...

Gruß Rainer
 
Hallo Rainer,

mit dem Thread habe ich meinen Beitrag
http://www.avr-praxis.de/forum/showthread.php?t=66
gemeint. Dort verwende ich einen ADC und die restlichen PIN's als Input und / oder Output.
Wenns Dich interessiert schau einfach mal rein, vielleicht kannst Du ja was verwenden.

Dann zum Thema Themperatur. Wenn Du Lust hast einen tollen Sensor einzusetzen dann schau Dir mal den SHT11 oder SHT71 an. Ist ein I2C Sensor der auch gleichzeitig Luftfeuchtigkeit messen kann und Du brauchst dazu keinen ADC da man sich über TWI mit dem Ding unterhalten kann.

Mehr Infos dazu gibt es unter:
http://www.avr-praxis.de/forum/showthread.php?t=46

Knickohr hat das Ding übrigens auf einem Mega8 zusammen mit mir in Betrieb genommen und das Ding rennt auch mit 1 MHz. Nur so als Idee!

Grüße,
Markus
 

Ü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)