imam 8 ds1820 temperaturca na jednom onewire linku
16*4 lcd i 18f452, stvar čita 8 temperatura neki hladnjača i kad negdje kiksa javlja čim moze
telefonom, mejlom itd... ok komunikacija je stara priča, kao i lcd, elektronika i sl sve 5 ali kako
nikad nisam radio sa ovim onewire senzorčićima malo me zafrkava nekoliko sitnica pa ko zna....
1 dali mogu poslati globalno komandu za konverziju (bez match-rom-a) a čitati pojedinačno po match-romu
za sad radim sve pojedinačno a mogo bi uštedit 7 owout komandi
2 čitao sam da u pbp komandi owin ili owout poslje parametara ima i option label, ako je slanje/primanje neuspjelo da pošalje na label.. meni to ne radi, čim dodam label dodje mi neki error :
"Symbol not previusly defined (OWRDONE)
argument out of range ('389 not betveen -128 and 127)"
3 ako ovo pod 2 ne postoji, kako da najjednostavnije/točnije provjerim dal su svaki pojedinačno match-rom senzori na linku ? probao sam sa pokupljenim word-om temperature ako je sve %1111111111111111 ali kad je 0'c onda isto prijavi grešku što je bed......
4. dal je tko negdje iskopao kako napraviti onewire dewice discowery (pretraživanje multidrop linka) ima u pdf-u od ds1820 algoritam kako ih nači sve u par mili sekundi (jer da ideš 64bit brutforsat trajalo bi 15 dana) ali mene to totalno zbunjuje, t.j. nisam skuzio kako onoliko priče prevesti u funkcionalni kod...
evo komadić koda gdje čitam temperature i pakiram u array(jeve)
temp_disp aray je prilagođeniji prikazu na disp, da ne moram pretumbavati jer imam nekoliko prikaza
ima i nešto bit array-ja minus, ako je neg, nul5 ako ima ono .5 stupnjeva i sl....
Code: Select all
GetTemp:
FOR B = 0 TO BR_SENS
FOR A = 0 TO 7 ' load ROM pattern
READ eeROMS+(B*8)+A,ID[A]
NEXT A
OWOUT OW1,1,[MatchROM,STR ID\8,ConvertTemp]
NEXT B
PAUSE 500
LCDOUT $FE,1
FOR B = 0 TO BR_SENS
FOR A = 0 TO 7 ' load ROM pattern
READ eeROMS+(B*8)+A,ID[A]
NEXT A
OWOUT OW1,1,[MatchROM,STR ID\8,ReadScratch]
OWIN OW1,2,[tInLow,tInHigh]',NIJE_TU
OWPRESENT[B] = DA
GOTO TU_JE
NIJE_TU:
OWPRESENT[B] = NE
TU_JE:
TMINUS[B] = MINUS
t05[B] = NUL5
W = tempIn
' tempIn = tempIn/2 ' DJELIL0 BI SE NA POLA ZA STUPANJ ALI OVAKO IMAMO SVE <<1
'FORMAT: BIT 7 = +-, BIT 6-1 STUPNJEVI, BIT 0 = .5/.0 ZBOG BROJANJA I KOMPARACIJE
' tRESTO[b] = W|%00000001 ' tRESTO IF .5
IF !TMINUS[B] THEN NoNeg1
tempIn = tempIn | $FF00 ' extend sign bits for negs
NoNeg1:
TEMPERATURA[B] = tempIn.lowbyte ' save Celsius value
TEMP_DISP[B]=TEMPERATURA[B]&%11111110 ' IzDVOJI 6 TEMP.BITOVA U "D"
TEMP_DISP[B]=TEMP_DISP[B]>>1
IF TMINUS[B] THEN TEMP_DISP[B]=TEMP_DISP[B]|128 'PRIPREMI ZA SDEC PRIKAZ NA DISP.
'IF tRESTO[b] THEN TEMPERATURA[B] = TEMPERATURA[B] | %01000000 'PAKIRANJE
tIND[B]=$0
GOSUB KOMP_TEMP
' SETIRATI INDIKATOR PO FLAGU !
IF LCD_PRIKAZ = 2 THEN
IF B = 1 THEN LCDOUT $FE,$01,$FE,$02, BIN16 W
ENDIF
'PRIKAZ NA LCD............... SVIH 8 TEMPERATURA
IF LCD_PRIKAZ = 1 THEN
SELECT CASE B
CASE 0,1
C = $2
CASE 2,3
C = $C0
CASE 4,5
C = $90
CASE 6,7
C = $D0
END select
LCDOUT $FE,C
SELECT CASE B
CASE 1,3,5,7
FOR A = 1 TO 8
LCDOUT $FE,$14
NEXT A
END SELECT
' IF W = 65535 OR W = 0 THEN
' lcdout "T-ERR ",5
' ELSE
IF !tMINUS[B] THEN lcdout "+"
lcdout SDEC2 TEMP_DISP[B],".",#(t05[B]*5),DegSym,tIND[B]
' ENDIF
ENDIF
'-------------- LCD END
NEXT B