Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięds1820 + multipleks
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Witam
Mam w bascomie zrobione wyswietlanie multipleksowe na 4 x 7led i oczywiscie sterowane na przerwaniu.
Dodalem procedurki do pomiaru temp z ds-a i mam problem .
bo albo pieknie wyswietla ale co jakis czas z bledem mimo obliczania crc
albo jak zablokuje przerwanie na czas odbierania danych z ds-a to wyswietlanie mruga no ale nie ma przeklaman .
jak polaczyc jedno z drugim ?
pozdrawiam
JacekR
Mam w bascomie zrobione wyswietlanie multipleksowe na 4 x 7led i oczywiscie sterowane na przerwaniu.
Dodalem procedurki do pomiaru temp z ds-a i mam problem .
bo albo pieknie wyswietla ale co jakis czas z bledem mimo obliczania crc
albo jak zablokuje przerwanie na czas odbierania danych z ds-a to wyswietlanie mruga no ale nie ma przeklaman .
jak polaczyc jedno z drugim ?
pozdrawiam
JacekR
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Pokaż źródło to zobaczymy dlaczego CRC poprawne a wynik zły.
Ja robiłem to poprzez blokadę przerwań a efekt przygaszania wyświetlacza można trochę zmniejszyć rozdzielając transmisję po 1wire na części, czyli pomiędzy poszczególnymi poleceniami transmisji coś wrzycić i na chwilę włączyć przerwania.
Pozdrawiam.
Ja robiłem to poprzez blokadę przerwań a efekt przygaszania wyświetlacza można trochę zmniejszyć rozdzielając transmisję po 1wire na części, czyli pomiędzy poszczególnymi poleceniami transmisji coś wrzycić i na chwilę włączyć przerwania.
Pozdrawiam.
po wielu testach wyszlo ze wylaczyc przerwanie trzeba tylko na czas odbioru danych
reszta dziala ok tylko to mruganie albo przeklamania mnie draznia
1wreset
For H = 1 To R
Disable Timer0
1wwrite &H55
Gosub Nume
1wwrite &HBE
Bd(1) = 1wread(9)
Enable Timer0
1wreset
Suma 'obliczenie sumy kontrolnej crc
If Crc = 0 Then
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
If H = 1 Then Temp1 = T
If H = 2 Then Temp2 = T
If H = 3 Then Temp3 = T
End If
Next
End Sub
i obliczenie CRC
Sub Suma:
Local I As Byte , Tempp As Byte
Crc = 0
For I = 1 To 9
Tempp = Crc Xor Bd(i)
Crc = Lookup(tempp , Crc8)
Next
End Sub
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53
[glow=darkred][/glow][glow=444444][/glow]
reszta dziala ok tylko to mruganie albo przeklamania mnie draznia
1wreset
For H = 1 To R
Disable Timer0
1wwrite &H55
Gosub Nume
1wwrite &HBE
Bd(1) = 1wread(9)
Enable Timer0
1wreset
Suma 'obliczenie sumy kontrolnej crc
If Crc = 0 Then
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
If H = 1 Then Temp1 = T
If H = 2 Then Temp2 = T
If H = 3 Then Temp3 = T
End If
Next
End Sub
i obliczenie CRC
Sub Suma:
Local I As Byte , Tempp As Byte
Crc = 0
For I = 1 To 9
Tempp = Crc Xor Bd(i)
Crc = Lookup(tempp , Crc8)
Next
End Sub
Crc8:
Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
Data 10 , 84 , 215 , 137 , 107 , 53
[glow=darkred][/glow][glow=444444][/glow]
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Co to jest to:
Jeśli wewnątrz nie ma komunikacji 1wire to możesz na czas tego podprogramu włączyć przerwania - zależy ile czasu trwa, może trochę zmniejszy to efekt przygasania wyświetlacza.
Kod: Zaznacz cały
Gosub Nume
Ostatnio zmieniony 5 kwie 2006, o 10:21 przez K_o_n_r_a_d, łącznie zmieniany 2 razy.
-
- -
- Posty:58
- Rejestracja:30 lip 2005, o 00:36
- Lokalizacja:Lublin
Taka mała uwaga:
ten reset przed pętlą umieść lepiej na początku pętli i wtedy możesz usunąć ten na końcu (to jest lepsze rozwiązanie i mniej programożerne) .
Kod: Zaznacz cały
1wreset
For H = 1 To R
Disable Timer0
1wwrite &H55
Gosub Nume
1wwrite &HBE
Bd(1) = 1wread(9)
Enable Timer0
1wreset
OK
zmienilem ten reset
ale pozmienialem metada prob i bledow i poprawilem troche ale tylko troche to mruganie
For H = 1 To R
1wreset
1wwrite &H55
Gosub Nume
1wwrite &HBE
Disable Timer0
Bd(1) = 1wread(9)
Enable Timer0
Suma
najbardziej krytycznym momentem jest samo odbieranie danych z ds-a
i podczas odbieranie nie jest wskazane jakiekolwiek przerwanie
ale czy da sie to obejsc ??
zmienilem ten reset
ale pozmienialem metada prob i bledow i poprawilem troche ale tylko troche to mruganie
For H = 1 To R
1wreset
1wwrite &H55
Gosub Nume
1wwrite &HBE
Disable Timer0
Bd(1) = 1wread(9)
Enable Timer0
Suma
najbardziej krytycznym momentem jest samo odbieranie danych z ds-a
i podczas odbieranie nie jest wskazane jakiekolwiek przerwanie
ale czy da sie to obejsc ??
Tak , można to obejść...
najbardziej krytycznym momentem jest samo odbieranie danych z ds-a
i podczas odbieranie nie jest wskazane jakiekolwiek przerwanie
ale czy da sie to obejsc ??
Zapoznaj się z tym tematem.
Piotrek
Masz na myśli błędy odczytu...
p.s.
pospieszylem sie niestety wtenczas czesciej wystepuje blad
no ale nie mruga
Ponieważ nie wiem w jaki sposób podłączyłeś DS-y (DQ+GND, czy VCC+DQ+GND),to nie bardzo wiem co Ci dalej doradzić Może dajesz zbyt mało czasu na pomiar , a może ...
Gdybyś pokazał więcej kodu to ... coś napewno da się z tym zrobić.
Piotrek
DS-y podlaczone mam raz tak a raz tak
pelna procedura odczytu ponizej
obsluga przerwania :
On Timer0 Int_timer0
Config Timer0 = Timer , Prescale = 256
Timer0 = 65450
Enable Timer0
Enable Interrupts
Int_timer0:
( tu sa procedury wysylania co ma sie zaswiecic
czyli 4 x 7led)
Flaga = 1
Return
Sub Wait_for_interrupt
Flaga = 0
While Flaga = 0 : Wend
End Sub
Sub Temperature
'Disable Timer0
1wreset
1wwrite &HCC
1wwrite &H44
'Enable Timer0
Waitms 750 'czas na konwersję
Read1820
End Sub
'odczyt danych z DS1820 po konwersji
Sub Read1820
Local Tmp As Byte
'1wreset
'For H = 1 To R
1wreset
1wwrite &H55
Gosub Nume
1wwrite &HBE
Disable Timer0
'Wait_for_interrupt
Bd(1) = 1wread(9)
Enable Timer0
Suma
'obliczenie sumy kontrolnej crc
If Crc = 0 Then
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
If H = 1 Then Temp1 = T
If H = 2 Then Temp2 = T
If H = 3 Then Temp3 = T
End If
'Next
End Sub
Nume:
If H = 1 Then : For Rr = 1 To 8 : 1wwrite Adres1(rr) : Next Rr : End If
If H = 2 Then : For Rr = 1 To 8 : 1wwrite Adres2(rr) : Next Rr : End If
If H = 3 Then : For Rr = 1 To 8 : 1wwrite Adres3(rr) : Next Rr : End If
pelna procedura odczytu ponizej
obsluga przerwania :
On Timer0 Int_timer0
Config Timer0 = Timer , Prescale = 256
Timer0 = 65450
Enable Timer0
Enable Interrupts
Int_timer0:
( tu sa procedury wysylania co ma sie zaswiecic
czyli 4 x 7led)
Flaga = 1
Return
Sub Wait_for_interrupt
Flaga = 0
While Flaga = 0 : Wend
End Sub
Sub Temperature
'Disable Timer0
1wreset
1wwrite &HCC
1wwrite &H44
'Enable Timer0
Waitms 750 'czas na konwersję
Read1820
End Sub
'odczyt danych z DS1820 po konwersji
Sub Read1820
Local Tmp As Byte
'1wreset
'For H = 1 To R
1wreset
1wwrite &H55
Gosub Nume
1wwrite &HBE
Disable Timer0
'Wait_for_interrupt
Bd(1) = 1wread(9)
Enable Timer0
Suma
'obliczenie sumy kontrolnej crc
If Crc = 0 Then
Tmp = Bd(1) And 1
If Tmp = 1 Then Decr Bd(1)
T = Makeint(bd(1) , Bd(2))
T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
T1 = T1 / Bd(8) : T = T + T1 : T = T / 10
If H = 1 Then Temp1 = T
If H = 2 Then Temp2 = T
If H = 3 Then Temp3 = T
End If
'Next
End Sub
Nume:
If H = 1 Then : For Rr = 1 To 8 : 1wwrite Adres1(rr) : Next Rr : End If
If H = 2 Then : For Rr = 1 To 8 : 1wwrite Adres2(rr) : Next Rr : End If
If H = 3 Then : For Rr = 1 To 8 : 1wwrite Adres3(rr) : Next Rr : End If
Nie wziąłeś sobie do serca moich radKod: Zaznacz cały
'Tak (w przybliżeniu) zrobiłbym ja ;) ... Sub Wait_for_interrupt Flaga = 0 While Flaga = 0 : Wend End Sub Sub Temperature 'Disable Timer0 Wait_for_interrupt 1wreset Wait_for_interrupt 1wwrite &HCC 1wwrite &H44 'Enable Timer0 Waitms 750 'czas na konwersję Read1820 End Sub 'odczyt danych z DS1820 po konwersji Sub Read1820 Local Tmp As Byte '1wreset 'For H = 1 To R Wait_for_interrupt 1wreset Wait_for_interrupt 1wwrite &H55 Gosub Nume Wait_for_interrupt 1wwrite &HBE 'Disable Timer0 Wait_for_interrupt Bd(1) = 1wread(3) Wait_for_interrupt Bd(4) = 1wread(3) Wait_for_interrupt Bd(7) = 1wread(3) 'Enable Timer0 ...
Odczyt 9-ciu bajtów troszkę trwa. Praktycznie każda transmisja na magistrali , powinna być poprzedzona Wait_for_interrupt
Piotrek
Witam
hmmmm
krytycznym momentem jest samo odbieranie danych
bo przy wysylaniu nie trzeba synchronizowac transmisji (przynajmniej mnie tak wyszlo kombinujac na wszelkie sposoby)
ale jezeli odbior danych bede synchronizowal bajt po bajcie :
For Rr = 1 To 8 : Wait_for_interrupt : 1wwrite Adres1(rr) : Next Rr
Wait_for_interrupt
1wwrite &HBE
Wait_for_interrupt
Bd(1) = 1wread(1)
Wait_for_interrupt
Bd(2) = 1wread(1)
Wait_for_interrupt
Bd(3) = 1wread(1)
(...)
to prawie kazdy odebrany wynik ma poprawne CRC
i na razie testuje ale nie mruga i obsluguje mi 2 x ds bez problemu , przynajmniej na razie
ale jezeli odbior danych dam w petle :
For Rr = 1 To 8 : Wait_for_interrupt : Bd(rr) = 1wread(1) : Next Rr
no to juz crc sie nie zgadza.
hmmmm
krytycznym momentem jest samo odbieranie danych
bo przy wysylaniu nie trzeba synchronizowac transmisji (przynajmniej mnie tak wyszlo kombinujac na wszelkie sposoby)
ale jezeli odbior danych bede synchronizowal bajt po bajcie :
For Rr = 1 To 8 : Wait_for_interrupt : 1wwrite Adres1(rr) : Next Rr
Wait_for_interrupt
1wwrite &HBE
Wait_for_interrupt
Bd(1) = 1wread(1)
Wait_for_interrupt
Bd(2) = 1wread(1)
Wait_for_interrupt
Bd(3) = 1wread(1)
(...)
to prawie kazdy odebrany wynik ma poprawne CRC
i na razie testuje ale nie mruga i obsluguje mi 2 x ds bez problemu , przynajmniej na razie
ale jezeli odbior danych dam w petle :
For Rr = 1 To 8 : Wait_for_interrupt : Bd(rr) = 1wread(1) : Next Rr
no to juz crc sie nie zgadza.
Mylisz się.Krytycznym momentem na magistrali 1wire jest tzw. TIME SLOT , który nie może być przerwany i nie jest ważne , nadajesz czy odbierasz....
krytycznym momentem jest samo odbieranie danych
bo przy wysylaniu nie trzeba synchronizowac transmisji (przynajmniej mnie tak wyszlo kombinujac na wszelkie sposoby)
Hmm ... dziwne.Cały "pic" polega na policzeniu , ile mamy czasu pomiędzy przerwaniami , bo wtedy wiadomo , ile bajtów naraz można wysłać/odebrać , bez obawy zakłócenia transmisji przez przerwanie Timera.Załóżmy , że przerwania wywoływane są co 4ms , a maksymalny czas jaki zajmuje wykonanie procedury przerwania to np. 2ms , czyli na obsługę 1wire pozostaje 2ms.Teraz tylko sprawdź ile trwa transmisja 1 bajtu , a będziesz wiedział ile naraz możesz wysłać/odebrać.Niemal ideałem było by napisać własną bibliotekę 1wire w assemblerze , gdzie wysłanie/odbiór 1 bitu , można by poprzedzić zablokowaniem przerwań , co przy 60 do 120 us na slot , nie powinno wpłynąć na stabilne działanie wyświetlaczy.Jedynie 1wreset zsynchronizować z timerem , a reszta bez synchronizacji....
ale jezeli odbior danych dam w petle :
For Rr = 1 To 8 : Wait_for_interrupt : Bd(rr) = 1wread(1) : Next Rr
no to juz crc sie nie zgadza.
To tak na marginesie
Piotrek
No oczywiscie zgadza sie z toba
Ale mam znow problem do rozwiazania jak sprawdzic czy jakis czujnik jeszcze jest i czy odpowiada tzn jezeli mamy kilka/kilkanascie ds-ow najlepiej sprawdzic jest poprzez odpowiedz i sprawdzenie zmiennej ERR .ALE jak mamy wiecej niz 1 czujnik to jakis czujnik zawsze odpowie.
Mamy mozliwosc sprawdzic takze poprzez :
1wverify Adres1(1)
czy sprawdzamy po konkretnym adresie ds-a ,no i tu mamy ale .W sumie jest tu wykonywanych kilka czynnosci miedzy innymi wyslanie adresu a to zajmuje czas i rozwiazanie w stulu :
Wait_for_interrupt
1wverify Adres1(1)
tu calkowicie odpada, na szybko lekarstwem jest :
Disable Timer0
1wverify Adres1(1)
Enable Timer0
No i tu mamy drugie ale - znow mamy mruganie wyswietlacza no ale jest sprawdzany konkretny czujnik i pytanie jak sprawdzic inaczej czy jest ten konkretny czujnik aktywny
a czy nie zostal odlaczony?
Ale mam znow problem do rozwiazania jak sprawdzic czy jakis czujnik jeszcze jest i czy odpowiada tzn jezeli mamy kilka/kilkanascie ds-ow najlepiej sprawdzic jest poprzez odpowiedz i sprawdzenie zmiennej ERR .ALE jak mamy wiecej niz 1 czujnik to jakis czujnik zawsze odpowie.
Mamy mozliwosc sprawdzic takze poprzez :
1wverify Adres1(1)
czy sprawdzamy po konkretnym adresie ds-a ,no i tu mamy ale .W sumie jest tu wykonywanych kilka czynnosci miedzy innymi wyslanie adresu a to zajmuje czas i rozwiazanie w stulu :
Wait_for_interrupt
1wverify Adres1(1)
tu calkowicie odpada, na szybko lekarstwem jest :
Disable Timer0
1wverify Adres1(1)
Enable Timer0
No i tu mamy drugie ale - znow mamy mruganie wyswietlacza no ale jest sprawdzany konkretny czujnik i pytanie jak sprawdzic inaczej czy jest ten konkretny czujnik aktywny
a czy nie zostal odlaczony?
Odczytujesz kompletny scratchpad , sprawdzasz CRC więc ... w czym problem... i pytanie jak sprawdzic inaczej czy jest ten konkretny czujnik aktywny
a czy nie zostal odlaczony?
Teraz ja zapytam: Jakie wartości znajdą się w tablicy Bd , po zaadersowaniu i odczytaniu scratchpada , z nieistniejącego DS-a
Piotrek
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości