logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega8][C] 1-wire. Gdzie ewentualnie w kodzie może być błąd?

z3ro 02 Sty 2012 12:39 1765 22
  • #1 10336904
    z3ro
    Poziom 10  
    Wiem że zostanę pewnie wyklnięty ze społeczności za ponowne poruszanie tematu 1-wire ale przerobiłem trochę działający kod który sam kiedyś popełniłem na armie na potrzeby atmegi i kurcze nie chce to działać... siedzę i myślę co może być nie tak i szczerze nie mam już pomysłów, więc chciałbym prosić aby ktoś zerknął na kod i powiedział gdzie ewentualnie może być ten błąd.

    Nagłówek
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Bilbioteka
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I wykorzystanie w oparciu o ds18b20.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodam że na patrzyłem na oscyloskopie i coś się na linii dzieje a na wyświetlaczy mam cały czas FF.
  • #2 10337244
    _Robak_
    Poziom 33  
    Pytanie podstawowe, czy na obu procesorach delay działa tak samo?
  • #3 10337306
    z3ro
    Poziom 10  
    Nie, na armie miałem to zrobione na timerach tutaj skorzystałem z gotowego rozwiązania, ale funkcje działają chyba dobrze bo hd44780 wyświetla poprawnie.
  • #5 10337419
    z3ro
    Poziom 10  
    taaak, zapomniałem zmienić spowrotem chciałem spróbować bo gdzieś widziałem taką wersje kodu, anyway po zmianie rom dalej FF temp -16 O_O
  • #6 10337421
    snnaap
    Poziom 25  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tu też masz coś namieszane
    Linię powinieneś czytać w czasie do 15uS od CLEAR_1Wire; czyli chyba powinno być:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Po 64uS linia zawsze będzie w stanie wysokim.
  • #7 10337457
    z3ro
    Poziom 10  
    teraz mam same zera, ale co Ciekawe na armie ten kod działa bez problemów pozmieniałem tylko definicje.
  • #9 10338401
    z3ro
    Poziom 10  
    Próbowałem już tego wcześniej ale niestety dalej zera... przecież to jest nie możliwe... a sprawdzałem 4 czujniki i na każdym to samo...
  • #11 10338470
    z3ro
    Poziom 10  
    Piszę w winavr zegar ustawiałem w makefile ręcznie F_CPU = 12000000 i taki jest też kwarc poza tym tutaj chyba nie ma problemu bo wyświetlacz działa.
    Dam tutaj cały projekt bo może problem leży jeszcze gdzie indziej, gdzie nie udało mi się jeszcze zaglądnąć.
  • #12 10338966
    janbernat
    Poziom 38  
    Masz zasilanie na AVCC i kondensator blokujący?
  • #13 10339136
    z3ro
    Poziom 10  
    Na AVCC jest +5V a jak dokładnie ma być ten kondensator podłączony? Jeżeli masz na myśli filtrujący 100n na zasilaniu to jest.
  • #14 10339326
    janbernat
    Poziom 38  
    Na zasilaniu VCC-GND jeden i na AVCC-GND drugi.
    No i jeszcze jedno- zasilanie Dallasa jest w obu wypadkach takie samo?
    Albo pasożytnicze albo z trzeciego przewodu?
    I jeśli Dallasa choć na chwilę przez pomyłkę wsadziłeś odwrotnie to jego działanie jest zupełnie nieobliczalne.
    Potrafi nie działać, działać jak jest sam na linii i kompletnie blokować linię jak jest więcej itp., itd.
  • #15 10339367
    z3ro
    Poziom 10  
    Jest jeden kondensator, jak wrócę do domu wlutuję drugi i zobaczymy co się stanie, zasilanie jest z 3 przewodu takie samo jak uC, nie wsadziłem go odwrotnie aż tak zdesperowany nie jestem;p a jest na razie tylko jeden na linii.

    Dodano po 1 [godziny] 54 [minuty]:

    Nie mam już pomysłu, wlutowałem te kondensatory i dalej nie chce działać... podejdę jeszcze może jutro i kupie nowego dsa... chyba że ktoś na to wpadnie... ale ciekawy jestem czy zadziała ten kod u kogoś innego... jeżeli ktoś mógłby sprawdzić to bardzo bym prosił...
  • #17 10342217
    z3ro
    Poziom 10  
    O ile algorytm wysyłania reset_pulse jest poprawny to nie odpowiada, do godziny powinienem mieć nowe czujniki w domu to sprawdzę czy to aby napewno nie uszkodzenie ale szczerze w to wątpię.

    Dodano po 1 [godziny] 22 [minuty]:

    Czujniki doszły, jest to samo na nowym czujniku więc problem jest raczej po stronie programowej, no chyba że problem z układem całym ale nie wiem co mogłoby być źle w układzie który ma tylko zasilanie i to pobierane z usb 8 diód i wyprowadzenie wszystkich nóżek uC... i tyle

    Dodano po 32 [minuty]:

    Dodaje jeszcze schematy i pcb, może jest jakiś błąd w projekcie którego ktoś się dopatrzy. Jedyna różnica z oryginałem to dwa dodatkowe 100n na wejściach zasilania.
  • #18 10343168
    snnaap
    Poziom 25  
    Witam

    tak mi teraz wpadło do głowy po przejrzeniu tego:
    1. brak rezystora podciągającego na linii 1wire
    2. #define CLEAR_1Wire DDRD |=_BV(WE)
    #define SET_1Wire DDRD &=~(_BV(WE))

    tak patrząc na te definicje i ich użycie to całkiem dziwnie to robisz, ustawiasz
    kierunek portu (wy/we) a nie stan na porcie.
    CLEAR_1Wire powinno wyglądało tak:

    #define CLEAR_1Wire {DDRD |=_BV(WE); PORTD &=~(_BV(WE))}

    a SET_1Wire

    #define SET_1Wire {DDRD |=_BV(WE); PORTD |=(_BV(WE))}

    i nie używaj _BV(WE) tylko (1<<WE)
    3. czy bit_is_set ustawia port na wejście przed sprawdzeniem stanu końcówki?
  • #19 10343598
    z3ro
    Poziom 10  
    Rezystor podciągający oczywiście jest, 4k7 ohma

    Ustawiłem definicje w ten sposób:
    #define SET_1Wire {DDRC&=~(1<<(WE)); PORTC |= 1<<WE;}
    #define CLEAR_1Wire {DDRC |= 1<<WE; PORTC&=~(1<<(WE));}

    i chyba nie ustawia... czyli jak rozumiem powinienem przed każdym sprawdzeniem ustawić kierunek na wejściowy?

    Dodano po 39 [minuty]:

    Próbowałem ustawiania na wejście i dalej same zera

    Dodano po 9 [minuty]:

    nie ma ktos jakiegos działającego kodu całego żeby sprawdzić czy zadziała?
  • #20 10344312
    snnaap
    Poziom 25  
    z3ro napisał:
    Rezystor podciągający oczywiście jest, 4k7 ohma

    Ustawiłem definicje w ten sposób:
    #define SET_1Wire {DDRC&=~(1<<(WE)); PORTC |= 1<<WE;}
    #define CLEAR_1Wire {DDRC |= 1<<WE; PORTC&=~(1<<(WE));}



    no to źle ostawiłeś, powinno być tak:
    #define SET_1Wire {DDRC |= (1<<WE); PORTC |=( 1<<WE);}
    #define CLEAR_1Wire {DDRC |= (1<<WE); PORTC&=~(1<<WE);}
  • #21 10344433
    z3ro
    Poziom 10  
    No dobra masz racje... ale to dalej niczego nie zmienia... nie mam zielonego pojęcia jaka może być przyczyna nie działania tego przecież tak banalnego układu...

    Dodano po 2 [godziny] 14 [minuty]:

    Dzięki za pomoc:) udało mi się połączyć z dsem ale dalej nie jestem pewien na czym polegał błąd... krótko mówiąc nadal czuję się głupi :P chociaż zaczął reagować, dzięki jeszcze raz
  • #23 10346347
    z3ro
    Poziom 10  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i plik nagłówkowy

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pozmieniałem typy zmiennych na char bo w sumie w taki sposób powinny chyba być odbierane ale zaczęło w sumie działać bo zostawieniu funkcji RESET_PULSE w tak okrojonym stanie. Dzisiaj spróbuję zrobić potwierdzenie PRESENCE.
    Szczerze nie wiem dlaczego tak się to zachowało... Nieznacznie pozmieniałem tylko opóźnienia.

    Dodano po 2 [minuty]:

    Aaa.. no i popsprawdzałem opóźnienia, zrobiłem na jednym pine przebieg teoretycznie 100kHz, multimetr pokazał 99,99kHz więc całkiem nieźle.

    HEHE... No już wiem czemu nie działało... Boże jak się nad czymś za długo siedzi to się nie zauważa najbardziej oczywistych rzeczy...:P W RESET_PULSE funkcja kończyła się zanim mogła wykonać się instrukcja odczekania tych czterystu paru mikrosekund i podczas zczytywania czegokolwiek linia cały czas była w stanie wysokim. Dzięki za pomoc i pozdrawiam.
REKLAMA