So, habe jetzt noch ein viel größeres Problem diesbezhüglich.
Die DS18S20 die ich habe funktionieren eigentlich wunderbar.
Jetzt habe ich mit verschiedenen Berechnungen rumexperimentiert und plötzlich berechnet der Mega8 keine Temperaturen zwischen x,7 und x,3°C.
Wie kann das sein?
Hier mein Code (wieder abgespeckt):
Code:
$regfile = "m8def.dat" ' specify the used micro
$crystal = 8000000
Declare Sub Lcdinit
Declare Sub Lcdwrite(byval Zeichen As Byte)
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 20 * 4a
Waitms 100 'damit das LCD etwas Zeit bekommt um nach dem Einschalten empfangsbereit zu sein...
Call Lcdinit
Cls
Dim I As Byte
Dim Bd(9) As Byte
Dim Tmp As Byte
Dim T As Integer , Temp As Single
Gruen Alias Pwm1a
Rot Alias Pwm1b
Blau Alias Ocr2
Config 1wire = Portd.4
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Counter Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Gruen = 0
Rot = 0
Blau = 0
Do
Waitms 300
1wreset 'reset the device
1wwrite &HCC 'read ROM command
1wwrite &H44
Waitms 500 'read ROM command
1wreset 'reset the device
1wwrite &HCC 'read ROM command
1wwrite &HBE 'read ROM command
Bd(1) = 1wread(9) ' read bytes in array
1wreset ' reset the bus
' if is OK, calculate for
Tmp = Bd(1) And 1 ' 0.1C precision
If Tmp = 1 Then
Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T / 2
Temp = Bd(8) - Bd(7)
Temp = Temp / Bd(8)
Temp = T + Temp
Temp = Temp - 0.25
End If
Locate 1 , 1
Lcd Temp
Locate 2 , 1
Lcd Bd(1)
Locate 3 , 1
Lcd Bd(7)
Locate 4 , 1
Lcd Bd(8)
Loop
End
Sub Lcdinit
Call Lcdwrite(&B00101100)
Call Lcdwrite(&B00001001)
Call Lcdwrite(&B00101000)
Call Lcdwrite(&B00000110)
Call Lcdwrite(&B00001100)
End Sub
Sub Lcdwrite(byval Zeichen As Byte)
' Höherwertiges Nibble setzen
If Zeichen.4 = 1 Then Portc.3 = 1 Else Portc.3 = 0
If Zeichen.5 = 1 Then Portc.2 = 1 Else Portc.2 = 0
If Zeichen.6 = 1 Then Portc.1 = 1 Else Portc.1 = 0
If Zeichen.7 = 1 Then Portc.0 = 1 Else Portc.0 = 0
' Höherwertiges Nibble übertragen
Portc.4 = 1
Waitms 1
Portc.4 = 0
Waitms 1
' Niederwertiges Nibble setzen
If Zeichen.0 = 1 Then Portc.3 = 1 Else Portc.3 = 0
If Zeichen.1 = 1 Then Portc.2 = 1 Else Portc.2 = 0
If Zeichen.2 = 1 Then Portc.1 = 1 Else Portc.1 = 0
If Zeichen.3 = 1 Then Portc.0 = 1 Else Portc.0 = 0
' Niederwertiges Nibble übertragen
Portc.4 = 1
Waitms 1
Portc.4 = 0
Waitms 1
End Sub
Und übrigens muss ich, denke ich, das Licht Exponentiell erhöhen um einen linearen Helligkeitsverlauf zu bekommen, oder?
Marten83
Lesezeichen