Search ROM, Read ROM и DS18S20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
avv
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс мар 21, 2010 13:12:46

Search ROM, Read ROM и DS18S20

Сообщение avv »

Уважаемые коты!!!

Имеется следующее - датчик DS18S20 и tiny2313

Делаю поиск устройств на шине SearchROM, находится одно устройство
64 битная последовательность возвращается следующая:

Код: Выделить всё

10001101 00000000 00001000 00000001 11011101 00001101 10110100 00000000
В ней отсутствует family code датчика.

Делаю сброс, ReadROM и вуаля:

Код: Выделить всё

10001101 00000000 00001000 00000001 11011101 00001101 10110100 00010000
получаю заветную единицу family code в младшем байте.
В чём может быть дело?

куски кода:

Код: Выделить всё

unsigned int SearchSensors(void)
{
        uint8_t i;
        uint8_t id[OW_ROMCODE_SIZE];
        uint8_t diff, nSensors;

        ow_reset();
        nSensors = 0;

        diff = OW_SEARCH_FIRST;
        while ( diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ) {
                FindSensor( &diff, &id[0] );
                if( diff == OW_PRESENCE_ERR ) {
                        USARTWriteString_P( "not found" NEWLINE );
                        break;
                }
                if( diff == OW_DATA_ERR ) {
                        USARTWriteString_P( "bus error" NEWLINE );
                        break;
                }
                for ( i=0; i < OW_ROMCODE_SIZE; i++ )
                        sensors_romcode[nSensors][i] = id[i];

                nSensors++;
        }

        return nSensors;
}

Код: Выделить всё

unsigned int FindSensor( unsigned int *diff, unsigned int id[] )
{
        uint8_t go;
        uint8_t ret;

        ret = DS18X20_OK;
        go = 1;
        do {
                *diff = ow_rom_search( *diff, &id[0] );
                if ( *diff == OW_PRESENCE_ERR || *diff == OW_DATA_ERR ||
                     *diff == OW_LAST_DEVICE ) { 
                        go  = 0;
                        ret = DS18X20_ERROR;
                } else {
                        if ( id[0] == DS18B20_FAMILY_CODE || id[0] == DS18S20_FAMILY_CODE ||
                             id[0] == DS1822_FAMILY_CODE ) { 
                                go = 0;
                        }
                }
        } while (go);

        return ret;
}
обработка шины 1-wire всемирно известный код Peter Dannegger с исправлениями Martin Thomas

Код: Выделить всё

uint8_t ow_rom_search( uint8_t diff, uint8_t *id )
{
        uint8_t i, j, next_diff;
        uint8_t b;

        if( ow_reset() ) return OW_PRESENCE_ERR;        // error, no device found
        ow_byte_wr( OW_SEARCH_ROM );                    // ROM search command
        next_diff = OW_LAST_DEVICE;                     // unchanged on last device
        i = OW_ROMCODE_SIZE * 8;                                        // 8 bytes
        do {
                j = 8;                                  // 8 bits
                do {
                        b = ow_bit_io( 1 );                     // read bit
                        if( ow_bit_io( 1 ) ) {                  // read complement bit
                                if( b )                                 // 11
                                return OW_DATA_ERR;                     // data error
                        }
                        else {
                                if( !b ) {                              // 00 = 2 devices
                                        if( diff > i || ((*id & 1) && diff != i) ) {
                                        b = 1;                          // now 1
                                        next_diff = i;                  // next pass 0
                                        }
                                }
                        }
                        ow_bit_io( b );                         // write bit
                        *id >>= 1;
                        if( b ) *id |= 0x80;                    // store bit

                        i--;

                } while( --j );

                id++;                                   // next byte

        } while( i );

        return next_diff;                               // to continue search
}
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Search ROM, Read ROM и DS18S20

Сообщение Satyr »

avv писал(а):Уважаемые коты!!!

Имеется следующее - датчик DS18S20 и tiny2313

Делаю поиск устройств на шине SearchROM, находится одно устройство
64 битная последовательность возвращается следующая:

Код: Выделить всё

10001101 00000000 00001000 00000001 11011101 00001101 10110100 00000000
В ней отсутствует family code датчика.

Делаю сброс, ReadROM и вуаля:

Код: Выделить всё

10001101 00000000 00001000 00000001 11011101 00001101 10110100 00010000
получаю заветную единицу family code в младшем байте.
В чём может быть дело?
[/code]
А CheckPresence() перед FindRom() не забываешь сделать ? -)))
Реклама
avv
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Вс мар 21, 2010 13:12:46

Re: Search ROM, Read ROM и DS18S20

Сообщение avv »

Satyr писал(а): А CheckPresence() перед FindRom() не забываешь сделать ? -)))
Нет. Check Presence обрабатывается в функции ow_reset:

Код: Выделить всё

uint8_t ow_reset(void)
{
        uint8_t err;
        OW_OUT_LOW();
        OW_DIR_OUT();            // pull OW-Pin low for 480us
        _delay_us(480);

        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
                // set Pin as input - wait for clients to pull low
                OW_DIR_IN(); // input
#if OW_USE_INTERNAL_PULLUP
                OW_OUT_HIGH();
#endif
        
                _delay_us(64);       // was 66
                err = OW_GET_IN();   // no presence detect
                                     // if err!=0: nobody pulled to low, still high
        }
        
        // after a delay the clients should release the line
        // and input-pin gets back to high by pull-up-resistor
        _delay_us(480 - 64);       // was 480-66
        if( OW_GET_IN() == 0 ) {
                err = 1;             // short circuit, expected low but got high
        }

        return err;
}
которая соответственно дёргается из

Код: Выделить всё

uint8_t ow_rom_search( uint8_t diff, uint8_t *id )
{
        uint8_t i, j, next_diff;
        uint8_t b;

        if( ow_reset() ) {
                return OW_PRESENCE_ERR;         // error, no device found <--- early exit!
        }

        ow_byte_wr( OW_SEARCH_ROM );        // ROM search command
        next_diff = OW_LAST_DEVICE;         // unchanged on last device

        i = OW_ROMCODE_SIZE * 8;            // 8 bytes

        do {
                j = 8;                          // 8 bits
                do {
                        b = ow_bit_io( 1 );         // read bit
                        if( ow_bit_io( 1 ) ) {      // read complement bit
                                if( b ) {               // 0b11
                                        return OW_DATA_ERR; // data error <--- early exit!
                                }
                        }
                        else {
                                if( !b ) {              // 0b00 = 2 devices
                                        if( diff > i || ((*id & 1) && diff != i) ) {
                                                b = 1;          // now 1
                                                next_diff = i;  // next pass 0
                                        }
                                }
                        }
                        ow_bit_io( b );             // write bit
                        *id >>= 1;
                        if( b ) {
                                *id |= 0x80;            // store bit
                        }
                        i--;
                } while( --j );
                id++;                           // next byte
        } while( i );
        return next_diff;                   // to continue search
}
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»