Hi,
Ich habe in meinem Projekt ein (hoffentlich) "nur" kleines Problem.
Mein Programm soll immer auf eine Tastereingabe (Pind.7 nach GND) warten und dementsprechend eine Sub ausführen.
Das funktioniert auch soweit, allerdings wird im Programm nebenbei die Softclock mit einem DCF77 Signal synchronisiert, und ein DS1820 Temperatur Sensor wird ausgelesen und alle Daten auf ein Display ausgegeben.
Da der Temperatursensor ja mindestens 750ms zum konvertieren der Temperatur braucht, klappt die Abfrage nicht immer, ob der Pin auf GND liegt oder war.
Das ist etwas problematisch, da dies eine Klingelsteuerung werden soll und natürlich jederzeit geklingelt werden soll/kann
Verzeiht mir bitte die vielleicht blöden Texte oder Bezeichnungen
Wie kann ich nun dem Programm sagen, dass er immer auf den Tastendruck warten soll? Würde eine While oder Case Verzweigung in der Hauptschleife eventuell das Problem lösen?
Hier mein Code:
Wie man sehen kann, habe ich fast überall die Abfrage eingebaut, ob die Taste gedrückt wurde, allerdings klappt das ja leider nicht immer. Wenn man im Falschen Zeitfenster drückt, wird das nicht registriert und natürlich nichts gemacht.
Ich habe in meinem Projekt ein (hoffentlich) "nur" kleines Problem.
Mein Programm soll immer auf eine Tastereingabe (Pind.7 nach GND) warten und dementsprechend eine Sub ausführen.
Das funktioniert auch soweit, allerdings wird im Programm nebenbei die Softclock mit einem DCF77 Signal synchronisiert, und ein DS1820 Temperatur Sensor wird ausgelesen und alle Daten auf ein Display ausgegeben.
Da der Temperatursensor ja mindestens 750ms zum konvertieren der Temperatur braucht, klappt die Abfrage nicht immer, ob der Pin auf GND liegt oder war.
Das ist etwas problematisch, da dies eine Klingelsteuerung werden soll und natürlich jederzeit geklingelt werden soll/kann
Verzeiht mir bitte die vielleicht blöden Texte oder Bezeichnungen
Wie kann ich nun dem Programm sagen, dass er immer auf den Tastendruck warten soll? Würde eine While oder Case Verzweigung in der Hauptschleife eventuell das Problem lösen?
Hier mein Code:
Code:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portd.5 , Rs = Portd.6
Config Lcd = 20 * 4
Config 1wire = Portd.0
Config Dcf77 = Pinb.2 , Timer = 1 , Debug = 1 , Check = 1 , Inverted = 1
Config Pind.7 = Input
Config Pinc.5 = Output
Config Pinc.4 = Output
Config Portb.1 = Output
Config Date = Dmy , Separator = .
Portd.7 = 1
Enable Interrupts
Dim Dcf As Byte
Dim Temp As Byte
Dim Spp(9) As Byte
Dim T_integer As Integer
Dim T_real As Integer
Dim 1w_i As Byte
Dim 1w_t1 As Integer
Dim 1w_t As Integer
Dim T_komma As Integer
Dim T_komma1 As Integer
Declare Sub Anzeige_lcd
Declare Sub Temperatur_lesen
Declare Sub Temperatur_starten
Declare Sub Integer_real
Declare Function Ds1820_get_temp_f10() As Integer
Cursor Off Noblink
Cls
Waitms 100
Do
nop
If Pind.7 = 0 Then Gosub Dingdong
Call Temperatur_lesen
Waitms 800
Call Temperatur_starten
If Pind.7 = 0 Then Gosub Dingdong
Call Integer_real
Call Anzeige_lcd
Loop
End
Sub Anzeige_lcd
Locate 1 , 1
Lcd " Test Zeile 1"
Locate 2 , 1
Lcd " Test Zeile 2"
Locate 4 , 1
Lcd " " ; Time$ ; " " ; Date$
Locate 3 , 9
Lcd T_real ; "." ; T_komma1 ; Chr(223) ; "C "
If Pind.7 = 0 Then Gosub Dingdong
End Sub
Sub Temperatur_starten
1wreset
1wwrite &HCC
1wwrite &H44
End Sub
Sub Temperatur_lesen
1wreset
1wwrite &H33
Temp = 1wread(1)
1wreset
1wwrite &HCC 'Rom überspringen, nur 1 Sensor
1wwrite &HBE ' Temperatur auslesen
Spp(1) = 1wread(9) ' Daten in ein Array lesen
If Temp = &H10 Then
T_integer = Ds1820_get_temp_f10()
End If
If Pind.7 = 0 Then Gosub Dingdong
End Sub
Sub Integer_real
T_real = T_integer / 10
T_komma = T_integer Mod 10
If T_komma < 5 Then
T_komma1 = 0
Else
T_komma1 = 5
End If
End Sub
Dingdong:
Portb.1 = 1 'Schaltet Optokoppler/Klingel
Waitms 100
Portb.1 = 0
Locate 2 , 1
Lcd " Ding!"
Waitms 1000
Locate 2, 1
Lcd " Dong!"
Waitms 1000
Locate 2 , 1
Lcd " "
Return
Function Ds1820_get_temp_f10() As Integer
'Rechnung für Family Code 10
1w_i = Spp(1) And 1
If 1w_i = 1 Then Decr Spp(1)
1w_t = Makeint(spp(1) , Spp(2))
1w_t = 1w_t * 50
1w_t = 1w_t - 25
1w_t1 = Spp(8) - Spp(7)
1w_t1 = 1w_t1 * 100
1w_t1 = 1w_t1 / Spp(8)
1w_t = 1w_t + 1w_t1
1w_t = 1w_t / 10
' Temperatur in 0,1 Grad Schritten
1w_t1 = 1w_t / 10
Ds1820_get_temp_f10 = 1w_t '/ 10
End Function
Wie man sehen kann, habe ich fast überall die Abfrage eingebaut, ob die Taste gedrückt wurde, allerdings klappt das ja leider nicht immer. Wenn man im Falschen Zeitfenster drückt, wird das nicht registriert und natürlich nichts gemacht.