Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Reset magistrali 1-wire. Inicjalizacja 1-wire i czujnika ds1820.

noman 25 Nov 2006 12:41 3610 21
  • #1
    noman
    Level 10  
    Witam,
    Mam problem z inicjalizacja magistrali 1-wire. Ponizej przedstawiam program ktory powiniem zainicjowac 1-wire i czujnik ds1820 powinien dac znak ze jest obecny w systemie:

    ;P0.0 to linia danych, na porcie P2 zapalam sobie diody dla sprawdzenia
    ; co sie wykonalo a co nie

    org 00h
    LJMP PROGRAM_GLOWNY

    org 100h
    PROGRAM_GLOWNY:

    REPEAT:
    CLR P0.0
    LCALL CZEKAJ_600us
    clr p2.0
    SETB P0.0
    LCALL CZEKAJ_30us
    clr p2.1
    JNB P0.0, SLAVE_OK
    clr p2.2
    SJMP REPEAT
    SLAVE_OK:
    clr p2.3

    PETLA_GLOWNA:
    NOP
    SJMP PETLA_GLOWNA

    ;--------------- Opoznienia -------------------------------
    CZEKAJ_20us:
    MOV R6,#14
    POWTORZ1:
    DJNZ R6,POWTORZ1
    RET

    CZEKAJ_30us:
    MOV R6,#20
    POWTORZ2: ;jedno przelecenie petli trwa 1.5us
    DJNZ R6,POWTORZ2 ; cykl trwa 0.75us, mam kwarc 16Mhz
    RET

    CZEKAJ_60us:
    MOV R6,#40
    POWTORZ3:
    DJNZ R6,POWTORZ3
    RET

    CZEKAJ_80us:
    MOV R6,#53
    POWTORZ4:
    DJNZ R6,POWTORZ4
    clr p2.6
    RET

    CZEKAJ_600us:
    MOV R6,#200
    POWTORZ5:
    NOP
    NOP
    DJNZ R6,POWTORZ5
    clr p2.7
    RET

    END

    Wydaje mi sie ze wszystko jest tak jak byc powinno, ale nie dziala :cry:
    Probowalem z roznymi opoznieniami, a takze jako linie danych probowalem P1.0 P0.0 P3.0 i nic. DS1820 zasilam osobno, 4.7kOhm mam, poradzcie cos. Aha to wszystko na procku AT89S8252

    Dzieki
  • #2
    bolek
    Level 35  
    Jak wklejasz kod to wklej go jako kod (Code)- lepiej się patrzy.
    nie mam teraz czasu analizować twoje dzieło, ale dam ci moje prcedury może pomogą znaleźć byka.
    Są nieco dziwne bo dla 2szt dallasów podpiętych pod inne porty
    ;**************************************************************************************************       PROCEDURY 1 WIRE
    W_WRITE: 		;PZREPISUJE ZAWAROSC ACC  NA LINIE 1WIRE 
    
    	MOV R0, #8	;LICZNIK, BO WYŚLEMY 8 BITOW
    CW:	
    	CLR WIREP	;LINIA NA ZERO
    	CLR WIREB
    	RRC A		;PRZEWIN W PRAWO (POBIERZ BAJT LSB DO CY)
    	NOP
    	NOP		;ZWLOKA CZASOWA
    	JC SET_1W	;JESLI DANY BIT JEST = 1 TO SKOCZ DO "SET_1W", JESLI NIE TO NA DOL
    	LCALL WAIT_70us	;CZYLI PRZETRZYMAJ STAN NISKI PRZEZ NASTEPNE 70us
    	SETB WIREP	;POCZYM USTAW LINIE 1WIRE- ODPOWIADA TO WYSLANIU LOGICZNEGO ZERA
    	SETB WIREB
    	NOP		;TEZ ZWLOKA
    	LJMP END_CLR	;SKOCZ NA KONIEC PODROGRAMU 
    SET_1W:	SETB WIREP	;JESLI DANY BIT BYŁ USTAWIONY, TO USTAW 1WIRE I POCZEKAJ 70us
    	SETB WIREB
    	LCALL WAIT_70us	;ODPOWIEDA TO WYSLANIU LOGICZNEJ JEDYNKI 
    END_CLR:		
    	DJNZ R0, CW	;JESLI WYSLANO CALY BAJT TO POWRUC, JESLI NIE TO WYSLIJ KOLEJNY
    	RET 
    ;---------------------------------------------------------------------------------------
    W_READ:
    
    	MOV R0, #8
    CR:			;PIERWSZY DALLAS
    	CLR WIREP
    	NOP
    	SETB WIREP
    	LCALL WAIT_10us 
    	NOP
    	MOV C, WIREP
    	RRC A
    	LCALL WAIT_70us
    	DJNZ R0, CR
    	MOV B,A		;DROGI DALLAS
    	MOV R0, #8
    CR1:	
    	CLR WIREB
    	NOP
    	SETB WIREB
    	LCALL WAIT_10us 
    	NOP
    	MOV C, WIREB
    	RRC A
    	LCALL WAIT_70us
    	DJNZ R0, CR1
    	RET
    ;---------------------------------------------------------------------------------------
    W_RESET:
    	SETB ERR_1WP
    	SETB ERR_1WB
    	CLR WIREP		;1W NA ZERO
    	CLR WIREB
    	LCALL WAIT_600us	;POCZEKAJ 600uS
    
    	SETB WIREB		;USTAW 1W
    	SETB WIREP
    	LCALL WAIT_70us		;POCZEKAJ 
    	JNB WIREP, ERROR	;JESLI LINIA ZWARTA DO PLUSA TO BLAD
    	CLR ERR_1WP
    ERROR:	JNB WIREB, ERROR1
    	CLR ERR_1WB
    ERROR1:	LCALL WAIT_600us	;
    	JB WIREP, ERROR2		;JESLI DALLAS ODPOWIEDZIAL NA RESET USTAW BIT ERR 
    	CLR ERR_1WP	
    ERROR2:	JB WIREB, ERROR3
    	CLR ERR_1WB
    ERROR3: RET
    ;---------------------------------------------------------------------------------------
    WAIT_600us: 			;PROCEDURA ZWLOKI 600us (30 *20) + KILKA us NA
    	MOV WAIT1, #10		;WEJSCIE, WYJSCIE Z PROGRAMU I WEWNETRZNE OPERACJE
    us600:	MOV WAIT, #60		
    	DJNZ WAIT, $		
    	DJNZ WAIT1, us600	
    	RET
    ;---------------------------------------------------------------------------------------
    WAIT_70us:
    	MOV WAIT1, #1		
    us70:	MOV WAIT, #70		
    	DJNZ WAIT, $		
    	DJNZ WAIT1, us70	
    	RET
    ;---------------------------------------------------------------------------------------
    WAIT_10us:
    	MOV WAIT1, #1		
    us10:	MOV WAIT, #10		
    	DJNZ WAIT, $		
    	DJNZ WAIT1, us10	
    	RET
    ;************************************************************************************************** 
  • #3
    noman
    Level 10  
    Wydaje mi sie ze program jest ok, dalbym sobie reke uciac, port P0 jest typu open drain wiec podlaczenei tez jest ok, czy mozliwe ze uszkodzony jest ds1820? Istnieje jakas mozliwosc sprawdzenia tego czujnika, bo jesli czujnik padl to chcialbym byc pewnym na 100% zanim wyloze pieniazki na nowy.
    Dzieki
  • #4
    szod
    Level 32  
    Do każdej procedury opóźniającej musisz dodać około 5us na wejście
    do tej procedury, wyjście i instrukcję mov. Czyli zamiast 30us będziesz
    miał gdzieś około 35us. Próbowałeś zwiększyć opóźnienie 30us na
    60 - 70us? To zaraz po SETB P0.0. To może być przyczyną.
    Tak poza tym to wygląda ok... No jeszcze musisz dać po całej procedurze
    resetu opóźnienie 600us aby zamknąć szczelinę czasową. Ale to nie powinno
    mieć wpływu przy jednokrotnym sprawdzeniu obecności. Sprawdziłeś
    poprawną pracę kwarcu 16MHz?
  • #5
    noman
    Level 10  
    Tak, probowalem rozne opoznienia zarowno po CLR P0.0 jak i po SETB P0.0, tzn z zakresu co podaja w katalogach to startowalem od minimum i zwiekszalem co 10us i za kazdym razem nic, kwarc chyba jest ok bo procedurka odliczajaca 1 sek odlicza ja :), postaram sie sprawdzic u kogos tego ds'a ale cos czuje ze jest zepsuty, a jeszcze mam pytanie o sposob zasilania bo gdy Vdd jest podpiete pod +5V to na lini danych jest caly czas napiecie, natomiast przy zasilaniu pasozytniczym Vdd do masy to na lini danych jest caly czas 0, a wiec chyba cos nie tak?
  • #6
    bolek
    Level 35  
    odepnij DSa i sprawdz czy dalej sie utrzymuje 0V na tym pinie. Opóźnienia masz prawidłowo wyliczone, ale intryguje mnie procedura czekania 30us po resecie od mastera. W pfdie pisze że dallas odpwoiada na reset po maksymalnie 60us. Czyli czekając 30us może sie zdażyć że dallas nie zdąży odpwiedzieć. Daj mu zwłoke po resecie 100us, w tedy z pewnością powinieneś się wstrzelić w odpowedzi z DS
  • #7
    matgaw
    Level 15  
    Spróbuj się skomunikować z tym czujnikiem przy pomocy funkcji 1-wire wbudowanych w bascom albo fastavr. Jeśli będzie działać to problem jest w twoim sofcie. Dodatkowo, możesz skompilować program w fastavr i podejrzeć jakie źródło w assemblerze on generuje (zapisuje też plik .asm przed .hex).
  • #8
    noman
    Level 10  
    Odpialem ds razem z rezystorem, i dalej jest 0 na P0.0 kurde nie wiem co jest przecierz ustawiam SETB P0.0, o co chodzi?
  • #9
    bolek
    Level 35  
    rezystor w takim razie zostaw. napięcie na pinie sprawdzałeś oscylokopem?
    Jeśli nie to sie nie dziw że tam będzie cały czas zero. Stan ten trwa kilkaset us, stan wysoki kilkadziesią- miernik ci tego nie wychwyci.
    Wstaw w ten program może jakąs procedure zwłoki 2 sekund.
  • #10
    szod
    Level 32  
    Port P0 nie ma rezystorów podciągających do plusa. Podłącz rezystor i
    dopiero sprawdź.

    Dodano po 14 [minuty]:

    :arrow: bolek - z tym odpowadaniem DS-a to chyba nieco inaczej jest.
    W pdf-ie jest podany czas odpowiedzi od 15us do 60 us. DS też może
    odpowiadać impulsem od 60us do 240us. Zakładając skrajny przypadek że
    DS może odpowiedzieć po 15us impulsem trwającym 60us lub po 60us
    odpowie impulem 60 - 240us to wychodzi okno czasowe od 60us do 75us.
    W takim mniej więcej czasie należy ustawić odbiór obecności DS-a na linii.
    Najlepiej gdzieś pośrodku. Jeśli faktycznie czujniki mają parametry jak w
    pdf-ie to podane okno czasowe powinno działać z praktycznie każdym
    DS-em. Dlatego pytałem autora czy testował ten czas. Ja tak robiłem u siebie
    i zarówno DS1820 jak i DS18B20 znajdywały się bez problemu choć były
    produkowane w różnych latach. Więc chyba producent prawdę pisze w pdf :)
  • #11
    noman
    Level 10  
    Resetuje tylko raz, wyrzucilem petle i teraz miernikiem mierze i z resystorem na porcie P0.0 jest 1 (z ds i bez), natomiast przy zasilaniu pasozytniczym jest 0, jesli chodzi o opoznienia to jak wczesniej pisalem probowalem rozne mozliwosci idac od dolnego ograniczenia do gornego jakie sa podane w katalogach, zarowno dla trwania impulsu resetu jak i odpowiedzi ds'a. Tylko dziwne bo przy zasilaniu pasozytniczym mimo ze ds'a nie odpowiada to i tak powinno byc 1 na lini czy tak?

    A taki programik: ..CLR P0.0.. czyli ustawiam tylko 0 na P0.0 to bez ds'a jest zero natomiast z ds jest 4.30V to normalne? (rezystor zostawilem)
    Z tego wynika ze linia danych nie jest sciagana do 0 i dlatego ds siedzi cicho, czy tak?
  • #12
    bolek
    Level 35  
    wklej tuostatnia wersję programu. fakt faktem powinno tam byc 1, zwłaszcza dla wersji parasite.

    -> SZOD, masz racje. Dopadła mnie chyba jakaś pomroczność, sam w wklejonych procedurach mam 70us
  • #13
    szod
    Level 32  
    Może pytanie banalne, ale zmierzyłeś rezystor czy ma faktycznie 4k7?
  • #14
    noman
    Level 10  
    
       CLR P0.0
       LCALL CZEKAJ_600us
       SETB P0.0
       LCALL CZEKAJ_30us
       LCALL CZEKAJ_80us
       JNB P0.0, SLAVE_OK 
       LCALL CZEKAJ_20us
       JNB P0.0, SLAVE_OK
       clr p2.6 
    SLAVE_OK:
    clrp2.7
    


    to sie wykonuje tylko raz po 1 sek na poczatku programu, petla glowna jest potym, tak rezystor jest 4.7k

    po wykonaniu tego programu:
    przy zasilaniu osobnym na P0.0 jest 1
    przy zas pasozytniczym na P0.0 jest 0 a tez powinno byc jeden

    jesli natomiast wykonal program ktory tobi tylko CLR P0.0 to:
    przy zasilaniu osobnym z ds jest na P0.0 4.20V zas bez ds jest 0
    przy Vdd ->masy z ds na P0.0 jest 0 a bez ds tez 0
  • #15
    szod
    Level 32  
    Trochę masz ten programik nie tak. P2.7 zostanie zawsze wyzerowane
    czy jest czujnik czy go nie ma. P2.6 się wyzeruje jak czujnik nie ustawi 0.
    Rozumiem że masz zawsze wyzerowane oba?
  • #16
    noman
    Level 10  
    Tak oba sa wyzerowane, tylko prosze zauwazyc jak pisalem poprzednio jesli chce wyzerowac P0.0 to na lini danych utrzymuje sie 4.20V czyli linia danych nie jest sciagana do 0 a tym samym nie ma resetu, jesli wyjme ds'a to normalnie spada do 0 (z rezystorem)
    p2.6 i p2.7 sa tylko informacja, jesli slave odpowie nie zeruje sie p2.6
  • #17
    szod
    Level 32  
    Jak wyzerujesz końcówkę portu to tranzystor ściąga ją do masy.
    Nie może tam być 4,2V... Może końcówka portu padła?
    Drobne zwarcie końcówki do plusa przy wyzerowaniu i kłopot gotowy.
    Spróbuj na innym porcie jak chodzi.
  • #18
    noman
    Level 10  
    na P0.2 i P0.3 to samo, daje reset na 5 sek i napiecie na lini spada do 4.20V, a przy zasilaniu pasozytniczym to caly czas jest 0 wogole nie wskakuje tam 1. Ale jak wypne ds to normalnie koncowka portu jest sciagana do zera, tylko gdy ds jest wpiety to spada do 4.20V
  • #19
    szod
    Level 32  
    A na całkiem innym porcie, np. P2 to samo?
  • #20
    noman
    Level 10  
    Tak wszystkie porty sprawdzalem i to samo, tez spada do 4.20V w obecnosci ds'a. Ale tylko port P0 jest typu open-drain. Czyli mam rozumiec ze jest problem sprzetowy bo w momencie resetu na lini danych w obecnosci ds powinno byc 0V?
  • #21
    szod
    Level 32  
    Wiesz co, to wygląda tak, jakby nie było rezystora 4k7. Na pewno dobrze
    wszystko kontaktuje? Rezystor do plusa? Jak ok, to już nie wiem. Spróbuj
    z innym DS-em.
  • #22
    noman
    Level 10  
    Podlaczenie jest dobre na bank. No nic, zostawiam to dopoki nie sprawdze u kogos tego ds'a lub nie kupie nowego.
    Dzieki wszystkim za pomoc
    Pozdrawiam