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

ATMEGA 16 i DS18s20, odpowiedź z czujnika?

29 Sty 2009 13:22 1178 6
  • Poziom 9  
    mam problem natury takiej że nie moge uzyskac odpowiedzi od czujnka ds18s20
    mam kod inicjalizujcy łaczenie w postani
    Code:
    uint8_t WireReset(void)
    
       //zwraca 1 gdy po wystawieniu resetu na magistrali 1-Wire slave (w tym
       //   przypadku termometr) zglosi swoja obecnosc; w przeciwnym razie zwraca 0
       //dziala poprawnie tylko w obecnosci 1 slave'a na magistrali!
    {


       uint8_t temp=0;
       (DDRC |= _BV(1));
       //(PORTC |=_BV(1));
       ustaw_bit_na_0;      //impuls inicjujący (ok. 480us)
       _delay_us(480);
       //_delay_us(480);
       ustaw_bit_na_1;      //zwolnienie linii
       _delay_us(65);      //po odczekaniu ok. 65us czekaj na impuls obecności
       if(czytaj_bit==0){
          temp++;         //zapamiętaj fakt wykrycia impulsu obecności
       ;
       }
       _delay_us(415);      //czekaj ok. 415us do zakończenia slotu inicjującego
       if(czytaj_bit==0){
          temp++;      //jeśli pozostaje w stanie niskim, to oznacza zwykłe zwarcie
       }
       if(temp==1){   //slave zglosil sie
       
          return 1;
       }
       else {         //slave nie zglosil sie
          (PORTC |=_BV(1));
          return 0;
       }

    }

    próbowałem juz przy róznych ustawieniach atmegi przy wewnętrznym osc 1, 2, 4 i zewnetrznbym 2 mhz - bez rezultatu - podejrzewam że to moze byc coś z zegarem mimo wszystko no le robie wsztsrko wg noty katalogowej atmegi wiec lipa


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • Poziom 30  
    To jeszcze pokaż, co się kryje pod "ustaw_bit_na_0;" i "ustaw_bit_na_1;"
  • Poziom 9  
    #define ustaw_bit_na_0 (DDRD |= _BV(DDD5))
    #define ustaw_bit_na_1 (DDRD &= ~_BV(DDD5))


    prosze bardzo
  • Poziom 16  
    Code:
    uint8_t WireReset(void) 
    
       //zwraca 1 gdy po wystawieniu resetu na magistrali 1-Wire slave (w tym
       //   przypadku termometr) zglosi swoja obecnosc; w przeciwnym razie zwraca 0
       //dziala poprawnie tylko w obecnosci 1 slave'a na magistrali!
    {


       uint8_t temp=0;
       (DDRC |= _BV(1));
       //(PORTC |=_BV(1));
       ustaw_bit_na_0;      //impuls inicjujący (ok. 480us)
       _delay_us(480);
       //_delay_us(480);
       ustaw_bit_na_1;      //zwolnienie linii
       _delay_us(65);      //po odczekaniu ok. 65us czekaj na impuls obecności

    spróbuj tutaj wpisac
       (DDRC |= _BV(0)); // nastawienie poru na odbiór


       if(czytaj_bit==0){
          temp++;         //zapamiętaj fakt wykrycia impulsu obecności
       ;
       }
       _delay_us(415);      //czekaj ok. 415us do zakończenia slotu inicjującego
       if(czytaj_bit==0){
          temp++;      //jeśli pozostaje w stanie niskim, to oznacza zwykłe zwarcie
       }
       if(temp==1){   //slave zglosil sie
       
          return 1;
       }
       else {         //slave nie zglosil sie
          (PORTC |=_BV(1));
          return 0;
       }

    }
  • Poziom 9  
    juz znalazłem rozwiązanie banalne ale cóż proste wtedy kiedy sie na niego wpadnie pozdrwiam
  • Poziom 2  
    to może podaj to rozwiązanie. Chętnie zobaczę. Mam ten sam problem . Pozdrawiam
  • Poziom 9  
    w zasadzie kod jest w porządku miałem niestety tego pecha że uszkodzoną ds 18s20 zamieniłem na następna uszkodzoną nowo kupioną ds-ke i sie głowiłem co jest nie tak tam gdzie nie trzeba.