Witajcie !
Wiem, że temat był wielokrotnie sygnalizowany na forum, przejrzałem wszystkie tematy z tym problemem związane i niestety nie uzyskałem satysfakcjonującego rezultatu.
Cała idea jest w tym, żeby całą obsługę odczytu temperatur z 4rech DSów, połączonych na oddzielnych liniach, wcisnąć w obsługę przerwań. Krótko mówiąc, chodzi o to, aby odczyt temperatury odbywał się ZAWSZE, niezależnie od tego, co program innego wykonuje.
Po kilku zmianach sugerowanych na forum (ustawienie stosu, wyłączanie przerwania podczas odczytu) mam taki oto kod :
Sęk w tym, że po kilkunastu sekundach od uruchomienia, pojawiają się sporadycznie zerowe odczyty temperatur, w różnych momentach, z różnych czujników.
Czy ktoś ma jakiś rozsądny pomysł ? (nierozsądne to np. : oddzielna atmega do DSów, wywalić DSy z przerwań, itp.)
Pozdrawiam ! Pomocy !
Pomogłem? Kup mi kawę.
Wiem, że temat był wielokrotnie sygnalizowany na forum, przejrzałem wszystkie tematy z tym problemem związane i niestety nie uzyskałem satysfakcjonującego rezultatu.
Cała idea jest w tym, żeby całą obsługę odczytu temperatur z 4rech DSów, połączonych na oddzielnych liniach, wcisnąć w obsługę przerwań. Krótko mówiąc, chodzi o to, aby odczyt temperatury odbywał się ZAWSZE, niezależnie od tego, co program innego wykonuje.
Po kilku zmianach sugerowanych na forum (ustawienie stosu, wyłączanie przerwania podczas odczytu) mam taki oto kod :
$regfile = "m16def.dat"
$crystal = 16000000
$baud = 1200
$hwstack = 150 'wartosc stosu
$swstack = 150 'wartosc stosu
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
Cls
Cursor Off Noblink
Deflcdchar 0 , 12 , 18 , 18 , 18 , 12 , 32 , 32 , 32
Config Timer0 = Timer , Prescale = 256 'timer przerwania odczytu DSow
Enable Interrupts
Enable Ovf0
On Ovf0 Przerwanie_0
Dim T1 As Single 'temperatura
Dim T2 As Single 'temperatura
Dim T3 As Single 'temperatura
Dim T4 As Single 'temperatura
Dim T_pom_1 As Integer 'zmienna pomocnicza odczytu temperatury
Dim T_pom_2 As Integer 'kolejna zmienna pomocnicza do przeliczania temperatury
Dim T_pom_3 As Integer 'kolejna zmienna pomocnicza do przeliczania temperatury
Dim T_pom_4 As Integer 'kolejna zmienna pomocnicza do przeliczania temperatury
Dim Opoznienie As Byte
Dim Licznik_opoznienia As Byte
Dim Odczyt1 As Bit 'informacja, ze trwa odczyt (0-3 - numer DSa)
Dim Numer_odcz As Byte 'numer aktualnie czytanego DSa
Opoznienie = 255
Odczyt1 = 0
Numer_odcz = 1
Licznik_opoznienia = Opoznienie
Dim X As Byte 'zmienna pomocnicza
Dim Y As Word 'zmienna pomocnicza 0-65535
Dim Z1 As Byte 'zmienna pomocnicza migania
Dim Z2 As Byte
'*************************************************
'*********** POCZĄTEK PROGRAMU ****************
'*************************************************
Do
Locate 1 , 1
Lcd Fusing(t1 , "#.#") ; Chr(0) ; "C"
Locate 1 , 8
Lcd Fusing(t2 , "#.#") ; Chr(0) ; "C"
Locate 2 , 1
Lcd Fusing(t3 , "#.#") ; Chr(0) ; "C "
Locate 2 , 8
Lcd Fusing(t4 , "#.#") ; Chr(0) ; "C "
Loop
End
'**********************************
'**** P R O C E D U R Y *****
'**********************************
'*** obsługa przerwania 0
'***********************************
Przerwanie_0:
' odczyt temperatur z DSow
Load Timer0 , 250
If Odczyt1 = 0 Then
Disable Timer0
1wreset Pinb , 0
1wwrite &HCC , 1 , Pinb , 0
1wwrite &H44 , 1 , Pinb , 0
1wreset Pinb , 1
1wwrite &HCC , 1 , Pinb , 1
1wwrite &H44 , 1 , Pinb , 1
1wreset Pinb , 2
1wwrite &HCC , 1 , Pinb , 2
1wwrite &H44 , 1 , Pinb , 2
1wreset Pinb , 4
1wwrite &HCC , 1 , Pinb , 4
1wwrite &H44 , 1 , Pinb , 4
Enable Timer0
Odczyt1 = 1
End If
Decr Licznik_opoznienia
If Licznik_opoznienia > 0 Then
Goto Wyj_ds_przerw
End If
Licznik_opoznienia = Opoznienie
Disable Timer0
1wreset Pinb , 0
1wwrite &HCC , 1 , Pinb , 0
1wwrite &HBE , 1 , Pinb , 0
T_pom_1 = 1wread(2 , Pinb , 0)
T1 = T_pom_1 / 16
1wreset Pinb , 1
1wwrite &HCC , 1 , Pinb , 1
1wwrite &HBE , 1 , Pinb , 1
T_pom_2 = 1wread(2 , Pinb , 1)
T2 = T_pom_2 / 16
1wreset Pinb , 2
1wwrite &HCC , 1 , Pinb , 2
1wwrite &HBE , 1 , Pinb , 2
T_pom_3 = 1wread(2 , Pinb , 2)
T3 = T_pom_3 / 16
1wreset Pinb , 4
1wwrite &HCC , 1 , Pinb , 4
1wwrite &HBE , 1 , Pinb , 4
T_pom_4 = 1wread(2 , Pinb , 4)
T4 = T_pom_4 / 16
Enable Timer0
Odczyt1 = 0
Wyj_ds_przerw:
Return
Sęk w tym, że po kilkunastu sekundach od uruchomienia, pojawiają się sporadycznie zerowe odczyty temperatur, w różnych momentach, z różnych czujników.
Czy ktoś ma jakiś rozsądny pomysł ? (nierozsądne to np. : oddzielna atmega do DSów, wywalić DSy z przerwań, itp.)
Pozdrawiam ! Pomocy !

