Forum: Mikrocontroller und Digitale Elektronik Blinkende LCD Anzeige


von Newbee (Gast)


Lesenswert?

Guten Morgen zusammen!

Hab mir mit nem 2x16 Zeichen Display und einem DS18S20 ein Thermometer 
gebastelt. Jetzt habe ich das Problem, dass die Gradanzeige im 
Sekundentakt blinkt. Wie bekomme ich das so hin, dass es normal 
angezeigt wird? Falls einer von euch eine Idee hat, dann nur zu. Ich bin 
jedenfalls ratlos.

Grüße

Code:

$lib "lcd4busy.lbx"
$regfile = "m8def.dat"
$crystal = 4000000

Config Lcd = 16 * 2
Const _lcdport = Portd
Const _lcdddr = Ddrd
Const _lcdin = Pind
Const _lcd_e = 1
Const _lcd_rw = 2
Const _lcd_rs = 3

Cls

Cursor Off Noblink

'Config Pinb.0 = Output


'***** DS1820 Befehle
Const Read_rom = &H33
Const Skip_rom = &HCC
Const Convertt = &H44
Const Read_ram = &HBE
Const Write_ram = &H4E
Const Copy_ram = &H48
Const Recall_ee = &HB8
Const Read_power = &HB4
Const Match_rom = &H55


Declare Sub 18s20_auslesen
Declare Sub Temperatur

Dim Bd(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , T1 As Single , Grad As Single
Dim V As Byte
Dim Temp_anzeige As String * 7 , Zeichen As Byte
Dim Temp As Word
Dim Messen As Bit , Empfang As Byte

Config 1wire = Portb.2                                      ' DS18s20 an 
Pin b.2


Locate 1 , 1
Lcd "Temp:"


Do
        Temperatur

        Waitms 5000

Loop

End


'/////////////////////////////////////////////////////////////////////// 
///////
Sub Temperatur



1wwrite Skip_rom
1wwrite Convertt              ' Messung starten

'**** warten bis abgeschlossen
   Do
      Temp = 1wread()
   Loop Until Temp.7 = 1      '***** Bit 8 muss 1 sein!

   18s20_auslesen             ' 9 bytes einlesen



         Temp_anzeige = Fusing(grad , "##.#" )       '**** um 
aufzurunden!

        Locate 1 , 7
        Lcd Temp_anzeige

End Sub

'/////////////////////////////////////////////////////////////////////// 
///////
Sub 18s20_auslesen
    1wreset                   ' Reset
    1wwrite Skip_rom          ' Chip ansprechen
    1wwrite Read_ram          ' Befehl zum Auslesen des Rams
    Bd(1) = 1wread(9)         ' 9 Bytes lesen
    1wreset                   'Reset

    Temp = Bd(2)
    Shift Temp , Left , 8
    Temp = Temp + Bd(1)
    T = Temp
    T = T / 2
    Grad = Bd(8) - Bd(7)
    Grad = Grad / Bd(8)
    Grad = Grad + T
    Grad = Grad - 0.25
End Sub

von Newbee (Gast)


Lesenswert?

Hat denn keiner ne Ahnung an was das liegen könnte?

MfG

von crazy horse (Gast)


Lesenswert?

liegt wahrscheinlich an deiner Initialisierung des Displays. Es gibt 
einen Punkt "Display on/off control"
RS=0
R/W=0
DB7..DB4=0
DB3=1
DB2 Display on or off
DB1 Cursor on or off
DB0 Display blinkt (oder eben nicht :-))

von Newbee (Gast)


Lesenswert?

Danke für die Antwort.

Komischerweise blinkt ja nicht das ganze Display, sondern nur die 
Gradanzeige. Der Text "Temp:" steht ganz normal drauf, flackert nicht 
mal.
Müsste also irgend etwas mit der Temperarurauslesung vom DS18S20 sein.

Grüße

von crazy horse (Gast)


Lesenswert?

jo, dann liegt es nicht daran.
Mit Basic kann ich allerdings nicht allzuviel anfangen.
Prüf doch als erstes einfach die Ausgabe des DS auf Plausibilität, bevor 
du ausgibst. Das ändert zwar nichts am evtl. falschen Auslesen, 
verhindert aber die Symptome :-), ja, ich weiss, nicht die feine Art.
Habe mit DS1820 noch nichts gemacht, aber es gibt Unmengen von threads 
mit Problemen darüber :-)
Oder gib der SUB 18s20_auslesen erst mal einen festen Rückgabewert, dann 
kannst du den Fehler schon mal eingrenzen.

von Karl H. (kbuchegg)


Lesenswert?

Gleich vorweg: Ich bin auch kein BASCOM Spezialist.

Aber ich würde mal alles weg lassen, was nicht unbedingt
notwendig ist. Als erstes würde mal die rundung mit
Fusing dran glaucben müssen.
Als nächstes würde ich mal kontrollieren, per Ausgabe,
welche Werte denn vom Temp Sensor kommen.

Wenn du 'blinken' sagst: Wie ist das gemeint?
Ist das der Zahlenwert ist da, und in der nächsten Sekunde
sind dort nur Leerzeichen, oder 'blinkt' da die korrekte Zahl
abwechselnd mit 0?

Eigentlich kann der erste Fall nicht auftreten, denn die Variable
'Grad' enthält immer eine Zahl. Die Zahl mag falsch sein, die
Zahl mag mehr als 3 Stellen haben, aber es ist immer noch eine
Zahl. Daher auch mein erster Testvorschlag, das FUsing mal
wegzulassen und Grad direkt auszugeben.

von Carsten P. (papa_of_t)


Lesenswert?

taste Dich an das Problem langsam 'ran.

Wofür ist die erste Zeile? ($lib "lcd4busy.lbx") Mein LCD geht auch ohne 
die. Außerdem: Kopiere einfach Dein Programm, setze die LCD-Ausgabe 
immer auf den gleichen Wert und kommentiere immer weitere Programmteile 
aus, bis es geht.

von Paul Baumann (Gast)


Lesenswert?

Ich denke, daß die erste Do-Loop Schleife das Problem ist. Laß doch mal
die Sub Temperatur als Hauptprogramm laufen und oberste Do-Loop Schleife
weg.

MfG Paul

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.