Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: DS18S20 ohne I2C to 1Wire Converter 2 Kategorie: Programmierung Basic (von PeterS - 1.03.2009 8:56)
Als Antwort auf DS18S20 ohne I2C to 1Wire Converter 2 von AndreasK - 28.02.2009 18:23

> Hallo,
>
> ich komme beim Programmieren nicht weiter...
> Dieses Programm läuft:
>
> 'Benötigte Libs´s:  IntFunc_lib.cc
> 'Funktion: Auslesen EINES Temperatursensors DS18B20 (pro Port)
> 'ohne I2C to 1-Wire Converter
>
> '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> ' Mögliche Ports (RAM besser über JP7 ausschalten):
> ' PortA.0 = Portbit 0 ... PortA.7 = Portbit 7
> ' PortB.0 = Portbit 8 ... PortB.7 = Portbit 15
> ' PortC.0 = Portbit 16 ... PortC.7 = Portbit 23
> ' PortD.0 = Portbit 24 ... PortA.7 = Portbit 31
> ' PortE.0 = PortBit 32 ... PortE.6 = PortBit 38 (39 geht nicht)
> ' PortF.0 = PortBit 40 ... PortF.7 = PortBit 47
> ' PortG.0 = PortBit 48 ... PortG.4 = PortBit 52
> '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
>
> Dim Port As Integer            ' das PortBit
> Dim TextaufAnzeige(5) As Char  ' AusgabeTextaufAnzeige auf LCD
> Dim i As Integer               ' Zählervariable
> Dim temp As Integer            ' Temperaturwert LCD
> Dim scratch_pad(1) As Byte     ' Temperaturwert DS18B20
>
> Sub main()
>
>     LCD_Init()
>     LCD_ClearLCD()
>     LCD_CursorOff()
>     Port = 7
>     TextaufAnzeige = "A7:"    ' + temp
>
>     Do While True
>       OneWire_Reset(Port)
>       OneWire_Write(0xcc)   ' ROM überspringen Kommando
>       OneWire_Write(0x44)   ' starte Temperatur Messung Kommando
>       AbsDelay(50)          ' Wert ausprobieren...
>       OneWire_Reset(Port)
>       OneWire_Write(0xcc)   ' ROM überspringen Kommando
>       OneWire_Write(0xbe)   ' scratchpad lesen (bis i=9 nicht notwendig)
>       For i = 0 To 1
>           scratch_pad(i)= OneWire_Read()
>       Next
>       temp= scratch_pad(1) * 256 + scratch_pad(0)
>       LCD_Locate(1,1)       ' Zeile 1, Spalte 1
>       LCD_WriteText(TextaufAnzeige)
>       LCD_WriteFloat(temp*0.06255,1)'Faktor 0.06255 für DS18B20
>     End While
>
> End Sub
>
> Nun wollte ich die Sache mit einer Funktion lösen:
>
> Sub DS18B20(PortBit As Integer)As Integer
>
> Dim i As Integer               ' Zählervariable
> Dim temp As Integer            ' Temperaturwert für LCD-Anzeige
> Dim scratch_pad(1) As Byte     ' Temperaturwert DS18B20
>
>       OneWire_Reset(PortBit)
>       OneWire_Write(0xcc)   ' ROM überspringen Kommando
>       OneWire_Write(0x44)   ' starte Temperatur Messung Kommando
>       AbsDelay(50)          ' Wert ausprobieren...
>       OneWire_Reset(PortBit)
>       OneWire_Write(0xcc)   ' ROM überspringen Kommando
>       OneWire_Write(0xbe)   ' scratchpad lesen (bis i=9 nicht notwendig)
>       For i = 0 To 1
>           scratch_pad(i)= OneWire_Read()
>       Next
>       temp= scratch_pad(1) * 256 + scratch_pad(0)
>       Return temp * 0.06255   'Faktor 0.06255 für DS18B20
>
> End Sub
>
>
> Sub main()
>
> Dim temp As Integer            ' Temperaturwert für LCD-Anzeige
>
>     LCD_Init()
>     LCD_ClearLCD()
>     LCD_CursorOff()
>
>
>     Do While True
>       DS18B20(7)
>       LCD_Locate(1,1)       ' Zeile 1, Spalte 1
>       LCD_WriteFloat(temp,1)
>     End While
>
> End Sub
>
> Nun ist der Anzeigewert unsinn.
> Wo steckt der Fehler ?

Wenn ich auf Programme schaue, die ein Problem haben, suche ich erstmal immer nach Array Problemen.
Zumindest ist hier erstmal die Dimensionierung falsch:

Dim scratch_pad(1) As Byte

ist ein Byte zuwenig.

Gruss Peter

>
> Grü�e aus Kiel
>
> Andreas Kunze
>
>


    Antwort schreiben


Antworten: