PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM log. ausgeben (DS18S20 Problem bei Berechnung)



Marten83
27.10.2007, 07:58
Guten Morgen!

Ich hatte je schon erwähnt, dass ich mir momentan aus Spaß an der Freude ein Moodlight bauen will um es später in meinem Wohnzimmer nutzen zu können.
Jetzt habe ich mich mit der Wahrnehmung von Licht noch nicht so intensiv beschäftig, bzw. ich habe gerade bei meiner Recherche noch nicht eine eindeutige Antwort gelesen. Jedoch bin ich momentan der Meinung dass unser Lichtempfinden, bezogen auf die Helligkeit, logarithmisch ist.
(Wenn ich falsch liege bitte sagen!)
Mein Problem mit der Programmierung ist nun, dass ich einen Wert von einem Temperatursensor (DS18S20) aufbereiten und logarithmieren will, damit die Helligkeit in Abhängigkeit der Temperatur für das Auge linear gesteuert werden kann.
Gibt es in Bascom einen Befehl, der aus einer logarithmierten Variable eine für das PWM Register lesbare Variable macht, bzw auch umgekehrt?

Oder kann ich mir da mit andern Mitteln behelfen?
Hatte schon daran gedacht alles einzeln zuzuordnen, finde ich aber nicht sehr gut.

Vielen Dank im Vorraus!

Marten83

Yossarian
27.10.2007, 08:12
Hallo
Dem Register ist es egal, ob Du die Werte mit den Fingern abgezählt oder über exponentielle Gleichungen bestimmt hast.

Mit freundlichen Grüßen
Benno

Marten83
27.10.2007, 08:14
Ja das schon, aber muss das nicht ein Byte Wert sein?

Marten83
27.10.2007, 08:40
Ok, ich hab das mal gerade getestet.
Mit Single Werten klappt das auch.
Ich werd jetzt noch n bisschen damit rumspielen, vieleicht klappts ja doch ganz einfach.

Marten83
27.10.2007, 18:17
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):

$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

robocat
27.10.2007, 20:17
zur wahrnehmung von helligkeit:
http://de.wikipedia.org/wiki/Helligkeit
http://de.wikipedia.org/wiki/Weber-Fechner-Gesetz
(wobei du da sicherlich auch schon geguckt hast)

zu deiner rechnung kann ich nichts sagen, ich kann kein basic -.-

gruesse

Marten83
28.10.2007, 06:19
Ich bin so langsam am Ende mit meinem Latein!

Ich schaffe es nicht den Fehler rauszubekommen.
Ich denke mal an meinem Programmer (MysmartUSB) kann es nicht liegen. Die Demoversion (eins Älter) habe ich auch schon probiert.
Hat jemand noch einen Vorschlag was ich mal probieren könnte?