Mam tutaj na Atmedze162 taki problem.
Zrobiłem odczyt z DS18B20, wykorzystując taką funkcję :
i wszystko jest ok, o ile wykonuję pomiar wywołując tą funkcję z pętli do...loop w normalnym programie.
Ale chciałem przenieść wykonywanie pomiaru do przerwania, i zaczęły się schody.
Ogólnie, przeniosłem do przerwania (timer0) całą procedurę odczytu, w tym wywołanie funkcji. I ku mojemu zaskoczeniu nie działa.
Najpierw myślałem, że problem jest w przekazywaniu parametrów z/do funkcji pod przerwaniem. ALe potem przeniosłem całą procedurę odczytu do przerwania ;
przy czym:
DS_count to liczba czujników wykryta wcześniej (w tym przypadku=1)
DS_ID1 to identyfikator czujnika
I teraz jest tak, że przy pierwszym wywołaniu przerwania ds_val zawiera prawidłowy pomiar , a następne są już równe 0.
Na początku obsługi przerwania timer0 jest wyłączany, na końcu włączany.
"Normalny" program nic nie robi (pusta pętla do...loop), żeby nie byłą wątpliwości, że coś tam miesza.
W czym może być problem ?
Poprawiłem tytuł.
[zumek]
Zrobiłem odczyt z DS18B20, wykorzystując taką funkcję :
Function Ds_read(byref Sensor As Byte) As Integer
1wreset
1wwrite &H55
1wwrite Sensor , 8
1wwrite &HBE
Ds_val = 1wread(2)
Ds_val = Ds_val * 10
Ds_val = Ds_val / 16
Ds_read = Ds_val
End Function
i wszystko jest ok, o ile wykonuję pomiar wywołując tą funkcję z pętli do...loop w normalnym programie.
Ale chciałem przenieść wykonywanie pomiaru do przerwania, i zaczęły się schody.
Ogólnie, przeniosłem do przerwania (timer0) całą procedurę odczytu, w tym wywołanie funkcji. I ku mojemu zaskoczeniu nie działa.
Najpierw myślałem, że problem jest w przekazywaniu parametrów z/do funkcji pod przerwaniem. ALe potem przeniosłem całą procedurę odczytu do przerwania ;
' PRZERWANIE /////////////////////////////////////////////////////////////////////
Przerwanie:
Disable Timer0
' miganie ledem
Incr Czas
If Czas = Tempo Then
Toggle Led_online
Czas = 0
End If
'pomiar temperatury
If Ds_count > 0 Then
1wreset
1wwrite &HCC
1wwrite &H44
Wait 2
' to zamiast funkcji
1wreset
1wwrite &H55
1wwrite Ds_id1(1) , 8
1wwrite &HBE
Ds_val = 1wread(2)
Ds_val = Ds_val * 10
Ds_val = Ds_val / 16
Print "wynik=" ; Ds_val
End If
Enable Timer0
Return
' KONIEC PRZERWANIA //////////////////////////////////////////////////////////////
przy czym:
DS_count to liczba czujników wykryta wcześniej (w tym przypadku=1)
DS_ID1 to identyfikator czujnika
I teraz jest tak, że przy pierwszym wywołaniu przerwania ds_val zawiera prawidłowy pomiar , a następne są już równe 0.
Na początku obsługi przerwania timer0 jest wyłączany, na końcu włączany.
"Normalny" program nic nie robi (pusta pętla do...loop), żeby nie byłą wątpliwości, że coś tam miesza.
W czym może być problem ?
Poprawiłem tytuł.
[zumek]