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

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL
ds1820 + multipleks

Postautor: JacekR » 4 kwie 2006, o 18:21

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

jacur
-
-
Posty:24
Rejestracja:21 lut 2004, o 15:40
Kontaktowanie:

Postautor: jacur » 4 kwie 2006, o 21:10

Licz CRC tak jak producent DS-a proponuje

K_o_n_r_a_d
-
-
Posty:58
Rejestracja:30 lip 2005, o 00:36
Lokalizacja:Lublin

Postautor: K_o_n_r_a_d » 4 kwie 2006, o 23:08

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.

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 5 kwie 2006, o 06:44

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]

K_o_n_r_a_d
-
-
Posty:58
Rejestracja:30 lip 2005, o 00:36
Lokalizacja:Lublin

Postautor: K_o_n_r_a_d » 5 kwie 2006, o 10:16

Co to jest to:

Kod: Zaznacz cały

Gosub Nume
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.
Ostatnio zmieniony 5 kwie 2006, o 10:21 przez K_o_n_r_a_d, łącznie zmieniany 2 razy.

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 5 kwie 2006, o 10:18

nume to wyslanie adresu DS-a bo w programie jest mozliwosc podlaczeniu kilku sztuk

K_o_n_r_a_d
-
-
Posty:58
Rejestracja:30 lip 2005, o 00:36
Lokalizacja:Lublin

Postautor: K_o_n_r_a_d » 5 kwie 2006, o 10:26

Taka mała uwaga:

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
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) :).

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 5 kwie 2006, o 10:43

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 ??

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 5 kwie 2006, o 13:02

...
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ść ;)
Zapoznaj się z tym tematem.

Piotrek

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 5 kwie 2006, o 13:49

Dzieki za info
Rozwiazanie genialne.Dziala wysmienicie
Nad czyms takim myslalem ale nie wymyslilem :)
jeszcze raz wielkie dzieki

p.s.
pospieszylem sie :( niestety wtenczas czesciej wystepuje blad
no ale nie mruga :)

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 5 kwie 2006, o 15:54

...
p.s.
pospieszylem sie :( niestety wtenczas czesciej wystepuje blad
no ale nie mruga :)
Masz na myśli błędy odczytu :?:
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

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 5 kwie 2006, o 17:07

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

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 5 kwie 2006, o 19:36

Kod: 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 ...
Nie wziąłeś sobie do serca moich rad ;)
Odczyt 9-ciu bajtów troszkę trwa. Praktycznie każda transmisja na magistrali , powinna być poprzedzona Wait_for_interrupt

Piotrek

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 6 kwie 2006, o 07:38

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.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 6 kwie 2006, o 16:59

...
krytycznym momentem jest samo odbieranie danych
bo przy wysylaniu nie trzeba synchronizowac transmisji (przynajmniej mnie tak wyszlo kombinujac na wszelkie sposoby)
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.
...
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.
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.
To tak na marginesie ;)

Piotrek

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 7 kwie 2006, o 11:27

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?

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 7 kwie 2006, o 14:47

... 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 :?:
Teraz ja zapytam: Jakie wartości znajdą się w tablicy Bd , po zaadersowaniu i odczytaniu scratchpada , z nieistniejącego DS-a :?:

Piotrek

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 18 gości