Hallo Leute, Um vorhandene Schaltungen auf ihre Funktion zu testen würde ich einen "DHT22" Simulator benötigen. Dieser sollte am digitalen Interface immer 50% Feuchte und 30°C ausgeben. Inklusive CRC. Hat jemand so ein Projekt schon in Angriff genommen?
Sodala. Hab mir mal das Datenblatt durchgelsen. Kann mir die folgende Vorgangsweise bestätigt werden? Achtung: Pullup !!! 5,1K von SDA auf VCC Die Kommunikation ist wie folgt (Vom Sensor aus gesehen): Startsignal Sensor antwortet Sensor sendet Sensor Übertragungsende Startsignal: uC zieht SDA auf LOW min.800µs max.20ms typ. 1ms uC lässt SDA auf HIGH min.20µs max. 200µs typ. 30µs Sensor antwortet: Sensor zieht SDA auf LOW min.75µs max.85µs typ. 80µs Sensor lässt SDA auf HIGH min.75µs max.85µs typ. 80µs Sensor sendet: Es wird SDA für jedes Bit zuerst auf low gezogen, danach wird eine 1 oder 0 auf SDA gelegt. Ob High oder Low entscheidet die Zeit. Low ziehen vor jedem Bit: min.48µs max.55µs typ. 50µs Danach sofort High Bit: min.68µs max.75µs typ. 70µs Danach sofort Low Bit: min.22µs max.30µs typ. 26µs Aufbau der Bytes: High humidity, Low humidity, High temp, Low temp, Parity byte Das Parity byte ist eine AND Verknüfung zwischen den folgenden Bytes: High humidity, Low humidity, High temp, Low temp Für unsere Testübertragung werden folgende Werte angenommen: High humidity = &b0000 0010 Low humidity = &b1001 0010 High temp = &b0000 0001 Low temp = &b0000 1101 Parity byte = &b1010 0010 Das entspricht: 65.8%RH 26.9°C Sensor Übertragungsende: Sensor lässt SDA wieder auf High min.45µs max.50µs typ. 55µs
Nun habe ich folgenden Code:
Stimmt das Ende der Transmission, oder muss ich SDA nochmals auf low
setzen?
program MyProject
sub Procedure InitHW
CMCON = 0x07 'Set the comparators
GPIO = 0 'Set all Pins to LOW Level
TRISIO = 255 'Set all Pins to Input
WPU = 0 'Disabel all Pullups
end sub
sub function Wait_For_Start as boolean
dim TimeKeeper as integer 'This is the timeout counter
Timekeeper = 0 'Set Timeout to zero
TRISIO.2 = 1 'Set SDA as Input
if GPIO.2 = 1 then 'SDA is high. No Start
Wait_For_Start = 0 'Timeout
return
end if
while GPIO.2 = 0 'Wait until SDA Get High
Delay_us(20) 'Wait
inc(Timekeeper) 'Increment the timeoutcounter
if timekeeper >= 1000 then 'Timeout
Wait_For_Start = 0 'Timeout
Return
end if
clrwdt 'Clear Watchdog
wend
delay_us(20) 'Security delay
Wait_For_Start = 1
end sub
sub Procedure Response_To_Master
GPIO.2 = 0 'Set SDA State to low
TRISIO.2 = 0 'Set SDA as Output
delay_us(80)
TRISIO.2 = 1 'Set SDA as Input
delay_us(80)
end sub
sub Procedure Send_Bit (dim SDA_State as boolean)
GPIO.2 = 0 'Set SDA State
TRISIO.2 = 0 'Set SDA as Output
delay_us(50)
TRISIO.2 = 1 'Set SDA as Input
if SDA_State = 1 then
delay_us(70) 'Set time for High
else
delay_us(26) 'Set time for Low
end if
end sub
sub Procedure Send_Byte (dim Byte_To_Send as byte)
dim i as byte 'Helper for Loop
for i = 7 to 0 step -1
Send_Bit (Byte_to_send.i)
next i
end sub
sub Procedure End_Of_Transmission
'GPIO.2 = 0 'Set SDA State ????????????????????
'TRISIO.2 = 0 'Set SDA as Output ????????????????
delay_us(50) 'Let SDA high
TRISIO.2 = 1 'Set SDA State
end sub
main:
'The following values are set statical: 65.8%RH 26.9°C
InitHW
while TRUE 'Endless loop
if Wait_for_Start = 1 then 'Start detected
Response_To_Master 'Response to master
Send_Byte(%00000010) 'High Humidity
Send_Byte(%10010010) 'Low Humidity
Send_Byte(%00000001) 'High Temp
Send_Byte(%00001101) 'Low Temp
Send_Byte(%10100010) 'Parity
End_Of_Transmission 'Set End of Transmission
end if
clrwdt 'Clear Watchdog
wend
end.
Da wird sich kein Schwanz dafür interresieren. Versuch es, ob der Code funktioniert oder lass es bleiben. Basic ist ohnehin keine Programmiersprache. Und so blöd leserlich aufgebaut. Das kann man in ein paar Zeilen lösen. Und nicht 1000ende Subs aufrufen.
Schaut eigentlich recht passabel aus. Sicher kann man das "in einer Wurst" schreiben. Aber so ist es doch übersichtlicher. Und wenn man was am Timing ändern muss macht man das an einer Stelle. Und nicht an 20 oder mehr. Das mit dem End_Of_Tranmission kann ich leider auch nicht beantworten. Must du probieren. Ich würde eigentlich SDA auf Eingang umschalten, damit, falls der Master etwas falsch interpretiert und den SDA Bus aktiv auf LOW oder High setzt kein Kurzschluss entsteht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.