Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Fibaro Fibaro
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DB18B20 brak komunikacji. Atmega 32. Zewnętrzny kwarc.

karolzimny 18 Lis 2010 18:51 1264 3
  • #1 18 Lis 2010 18:51
    karolzimny
    Poziom 2  

    Witam.Próbuje uruchomić ds18b20 na Atmega 32 zewnętrzny kwarc 16Mhz.zdaje sobie sprawe że temat był milion razy przerabiany na forum.Jednak może wgląd trzeciej osoby pozwoli dopatrzeć się jakiegoś niuansu.Po napisaniu procedury i wgraniu jej do procka na wyswietlaczu mam -0.07 .Po odczytaniu młodszej czesci wyniku mam 0xff w starszej to samo.Prosze o pomoc. z góry dziękuję.Oto mój kod

    #define pin_1wire 7
    #define port_1wire PIND
    #define out_1wire_low PORTD &= ~(1<< pin_1wire);
    #define out_1wire_high PORTD |= (1<< pin_1wire);
    #define one_wire_in DDRD &=~(1<<pin_1wire);
    #define one_wire_out DDRD |= (1<<pin_1wire);

    unsigned char one_wire_reset(void)
    {
    uint8_t reset_impulse=0;

    one_wire_out;

    //_delay_us(550);
    _delay_loop_2(2000);

    one_wire_in;
    // _delay_us(75);
    _delay_loop_2(300);

    if(bit_is_clear(port_1wire,pin_1wire))
    {
    reset_impulse=1;
    }
    else
    {
    reset_impulse=0;
    }
    //_delay_us(470);
    _delay_loop_2(1880);
    if (bit_is_set(port_1wire, pin_1wire))
    {
    reset_impulse=1;
    }
    else
    {
    reset_impulse=0;
    }

    return reset_impulse;
    }

    //////////////////////////////////
    //
    //funkcja czytająca bit z magistrali
    //
    /////////////////////////////////////

    uint8_t one_wire_read_bit(void)
    {
    uint8_t c_bit;

    one_wire_out;
    _delay_us(2);
    one_wire_in;
    _delay_us(15);


    if(bit_is_set(port_1wire,pin_1wire))
    c_bit=1;
    else
    c_bit=0;

    return c_bit;
    }
    //////////////////////////////////
    //
    //funkcja wysyłajaca bit na magistrale
    //
    /////////////////////////////////////

    void one_wire_write_bit(char bit)
    {
    one_wire_out;
    _delay_us(2);

    if(bit==1) //wyslanie 1
    one_wire_in;

    _delay_us(40); //wyslanie 0
    _delay_us(40);
    one_wire_in;

    }
    /////////////////////////////////////////
    //
    // funkcja wysyłająca bajt na magistrale
    //
    /////////////////////////////////////////

    void one_wire_write_byte(char val)
    {
    char licznik;
    char caly_bit; //wartosc do wysłania

    for(licznik=0;licznik<8;licznik++)
    {
    caly_bit= val>>licznik;
    caly_bit &= 0x01;
    one_wire_write_bit(caly_bit);
    }
    _delay_us(100);

    }


    //////////////////////////////////
    //
    //funkcja czytająca bajt z magistrali
    //
    /////////////////////////////////////

    uint8_t one_wire_read_byte(void)
    {
    char licznik;
    char bajt_zczytany=0; //wartosc odczytana

    for(licznik=0;licznik<8;licznik++)
    {
    if(one_wire_read_bit())
    bajt_zczytany |=(0x01<<licznik);
    _delay_us(30);
    _delay_us(15);
    }

    return bajt_zczytany;

    }



    unsigned char one_wire_pomiar( void)
    {
    char Temperatura_LSB=0, Temperatura_MSB=0;
    float Temperatura=0;
    uint8_t reset;
    char stringbuffer[8];
    char a[2];
    char b[2];


    reset= one_wire_reset();

    if(reset==1)
    {
    GLCD_TextGoTo(1,0);
    GLCD_WriteString("czujka jest" );
    //one_wire_write_byte(0x55); //wysłanie komendy room match
    //one_wire_write_addr(termometr); // ustawienie czujnika
    one_wire_write_byte(0xCC);
    one_wire_write_byte(0x44); //konwerscja temperatury
    _delay_ms(200);
    _delay_ms(200);
    _delay_ms(200);
    _delay_ms(200);
    _delay_ms(200);
    _delay_ms(200);

    reset= one_wire_reset();

    one_wire_write_byte(0xCC);
    one_wire_write_byte(0xBE); // odczyt scratchpada
    Temperatura_LSB =one_wire_read_byte(); //odczyt LSB
    Temperatura_MSB =one_wire_read_byte();//odczyt MSB
    Temperatura_MSB= (Temperatura_MSB & 0xFF);
    reset= one_wire_reset();

    dtostrf(Temperatura_MSB,1,2, a);
    GLCD_TextGoTo(3,5);
    GLCD_WriteString(a );

    dtostrf(Temperatura_LSB,1,2, b);
    GLCD_TextGoTo(3,6);
    GLCD_WriteString(b );
    Temperatura= (float)((Temperatura_LSB)+(Temperatura_MSB << 8))/16;
    dtostrf(Temperatura,1,2, stringbuffer);
    GLCD_TextGoTo(1,1);
    GLCD_WriteString(stringbuffer );
    GLCD_TextGoTo(7,1);
    GLCD_WriteString("stopni Celcjusza" );

    }

    else
    {
    GLCD_TextGoTo(5,0) ;
    GLCD_WriteString("brak czujki" );
    }

    return 0;
    }

    0 3
  • Fibaro
  • #2 18 Lis 2010 22:08
    Ture11
    Poziom 33  

    No a jak wygląda sprawa sprzętowo? Wszystko poprawnie podłączone? Opornik podciągający na wejściu sygnału z DS'a jest? (bo jak raz nie zamontowałem opornika to objawy całkiem podobne były...)

    Pozdrawiam.

    0
  • Fibaro
  • #3 18 Lis 2010 22:15
    hotdog
    Poziom 26  

    Skąd masz ten kod? Jest przetestowany? Czy masz poprawnie zdefiniowany kwarc?

    0
  • Fibaro
  • #4 18 Lis 2010 22:52
    karolzimny
    Poziom 2  

    kod pisałem juz jakis czas temu. i na symulacji działał.Teraz dopiero zakupiłem potrzebne elementy i zmontowałem w realu.Po długich próbach doszedłem do błędu-okazało się że przez przypadek włożyłem czujnik na odwrót.Już wszystko działa-odziwo czujnik nie został uszkodzony.Temat uważam za zamkniety.

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo