Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Tektronix
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Brak zgłoszenia na linii 1 - Wire

10 Maj 2006 16:10 2070 9
  • Poziom 17  
    Buduję sobie uProcesorowy zegar z termometrem. Po stoczeniu krwawych bojów z moim LCD z pomocą forumowiczów udało mi się go zmusić do prawidłowej pracy.

    Teraz męczę się z 1-Wire, a dokładnie czujnikiem temperatury DS18S20. :/

    Mianowicie problem jest taki, że nie mam zgłoszenia o jego obecności. Czujnik jest podłączony do portu PD3.

    Code:

    typedef struct _bit_struct
    {
     unsigned char bit0: 1;
     unsigned char bit1: 1;
     unsigned char bit2: 1;
     unsigned char bit3: 1;
     unsigned char bit4: 1;
     unsigned char bit5: 1;
     unsigned char bit6: 1;
     unsigned char bit7: 1;
    }bit_field;

    #define GIVE_BIT(adr) (*((volatile bit_field*) (adr)))
    #define _PORTD 0x32
    #define _DDRD 0x31
    #define _PIND 0x30
    #define pastylka_in GIVE_BIT(_PIND).bit3
    #define pastylka_out GIVE_BIT(_DDRD).bit3

    #define stan_0 1   //definicja stanu niskiego na linii1-wire
                       //"1" oznacza przełączenie portu w tryb wyjściowy
                       //port jest wcześniej wysterowany w stan niski
    #define stan_1 0   //definicja stanu wysokiego na linii1-wire
                       //"0" oznacza przełączenie portu w tryb wejściowy
                       //stan wysoki jest wymuszany przez zewnętrzny
                       //rezystor podciągający


    I kiedy próbuję nawiązać łączność nie chce zgłosić mi się pastylka. :/

    Code:

    unsigned char i,zp;
    DDRD = 0;           //PORTD - we
    PORTD = 0;          //bez podciągania
    (...) //Tutaj inicjalizacja LCD
    zp=0;
    pastylka_out=stan_0;   //sekwencja inicjująca pastylkę
    wait(5);            //impuls inicjujący "0" ok. 480us
    pastylka_out=stan_1;   //zwolnij linię
    wait_1w(128);       //po odczekaniu ok. 65us czekaj na impuls obecności
    if(pastylka_in==0)
     {
       write_text("zgloszenie");
       zp++;                //zapamiętaj fakt wykrycia impulsu obecności pastylki
      }
    else
     {
       write_text("nic :(");
     }



    Procek to ATMEGA16 z kwarcem 8 MHz.

    Mam już napisaną całą obsługę 1-Wire tyle, że to było pod AT2313 też z kwarcem 8 MHz i czujnik także był podpięty pod PD3. Nie wiem co jest grane, że nie chce działać. Może błąd na płytce? :/
  • Tektronix
  • Poziom 17  
    Na płytce na dole to gniazda na kable. Po kolei podłączam tam:

    - Masa,
    - 5V,
    - VCC czujnika,
    - GND czujnika,
    - linie danych czujnika.
  • Tektronix
  • Pomocny post
    Poziom 39  
    Pytanie standardowe - fusebity poustawiałeś :?:

    Piotrek
  • Poziom 17  
    vedy1 napisał:
    A jesteś pewien że tak podłączyłeś tego DS??


    Jestem pewien. Środkowy przewód idzie do PD3, a dwa pozostałe do MASY i zasilania. Są na pewno dobrze podłączone bo jeśli zamienię VCC z GND pochodzi do zwarcia przez diodę zabezpieczającą w czujniku.

    Dodano po 24 [minuty]:

    zumek napisał:
    Pytanie standardowe - fusebity poustawiałeś :?:

    Piotrek


    Hmmm... :) A co to są fusebity? :)

    Przepraszam za naiwne pytanie, ale w zasadzie popiero zaczynam zabawę nie tylko z uProcesorami, ale także na poważnie z całą elektroniką, więc doświadczenia mam jeszcze bardzo mało. To w zasadzie mój pierwszy własny układ z uprocesorem.

    Wcześniej robiłem obsługę 1-Wire na zestawie ZL1AVR z procesorem AT90S2313 i tam nic takiego jak fusebity nie ustawiałem, ale z 1-Wire oj dużo dużo się namęczyłem. Dziwię się, że nie chce mi to chodzić. Czujnik jest podpięty nawet pod ten sam port co na ZL1AVR.
  • Poziom 17  
    zumek napisał:
    Pytanie standardowe - fusebity poustawiałeś :?:

    Piotrek


    Byłem dzisiaj na uczelni i usiadłem do oscyloskopu. Przy okazji podpytałem się jednego wykładowcy o te fusebity. ;-) Rzeczywiście wychodzi na to, że nie były one ustawione odpowiednio i procek pracuje ze swoim wewnętrznym generatorem. Dlatego przy próbie nawiązania komunikacji z czujnikiem impuls podciągający do masy trwał 3,8ms zamiast 480 us, czyli aż 8 razy za długo (ten procek ma podpięty kwarc 8 MHz i program nastawiony na niego). Stąd te całe problemy z 1-Wire. Tak nawiasem mówiąc mam też podobny problem z I2C.

    Czy możecie mi podpowiedzieć, czy takie ustawienie jest dobre do wyłączenia wewnętrznego oscylatora i przy okazji do niezablokowania sobie procesora? ;-) Czy musze oznaczyć coś jeszcze?

    I kolejne pytanie. Mój wykładowca wspomniał, że ustawienie jakiegoś fusebitu powoduje nieprawidłową pracę jakiś linii portu C. Dla mnie jest to ważne dlatego, że na PC0 i PC1 działa mój zegar PCF. Czy musze jeszcze coś dodatkowo ustawiać?
  • Poziom 32  
    Tak może być. A co do blokowania portu C to jest odpowiedzialny ptaszek na JTAGEN
  • Poziom 17  
    Jeszcze jedno pytanko. Po odczytaniu konfiguracji fusebitów wygląda to w następujący sposób, jak na poniższym printscreenie. Jeśli więc chce pracować z oscylatorem zewnętrznym i mieć odblokowany PORTC to mam postawić ptaszka tylko w ramce CKOPT?

    Czy wtedy procek będzie pracować z pełną szybkością zależną od użytego kwarcu, bo widzę, że są ustawione bity CKSEL?
  • Pomocny post
    Poziom 32  
    Ganz napisał:
    Jeśli więc chce pracować z oscylatorem zewnętrznym i mieć odblokowany PORTC to mam postawić ptaszka tylko w ramce CKOPT?

    Czy wtedy procesor będzie pracować z pełną szybkością zależną od użytego kwarcu, bo widzę, że są ustawione bity CKSEL?
    Chyba nie czytasz poprzednich postów.
    Usuń ptaszka z JATGEN to ci da pełny dostęp do portu C
    Wszystkie CKSEL bez ptaszka to ustawia generator na zewnętrzny kwarc.
    A CKOPT tylko zwiększa poziom sygnału zegarowego co dla kwarców do 8MHz nie ma znaczenia.
  • Poziom 17  
    GienekS napisał:

    Chyba nie czytasz poprzednich postów.
    Usuń ptaszka z JATGEN to ci da pełny dostęp do portu C
    Wszystkie CKSEL bez ptaszka to ustawia generator na zewnętrzny kwarc.
    A CKOPT tylko zwiększa poziom sygnału zegarowego co dla kwarców do 8MHz nie ma znaczenia.


    Czytałem, ale wolałem się spytać dla pewności, żeby potem nie było problemów np. z zablokowanym prockiem.

    Rzeczywiście winnymi całego zamieszania okazały się źle ustawione fusebity. DS18S20 działa bez problemu. Teraz przyszedł czas na I2C. Znowu jakieś problemy z komunikacją. :) Szykuje się kolejna batalia. Echh jutro idę na oscyloskop usiąść. Chyba mi się PCF uszkodził.