Вот старые исходники
Функция передачи данных:
Код:
/*****************************************************************************
 * tm_send
 *
 * Отправка байта.
 */
static void tm_send( unsigned char byte )
{
    static unsigned char i,b;
    b=byte;
    for( i = 0; i < 8; i++ )
    {
        unsigned char pulldown_time, recovery_time;
        if( b & 1 )
        {
            /* write-one time slot */
            pulldown_time = 10;
            recovery_time = 80;
        }
        else
        {
            /* write-zero time slot */
            pulldown_time = 70;
            recovery_time = 20;
        }
        dint();
        TM_TX_PULLDOWN();
        tm_delay( pulldown_time );
        TM_TX_RELEASE();
        eint();
        tm_delay( recovery_time );
        b >>= 1;
    }
}
Функция приема данных:
Код:
/*****************************************************************************
 * tm_read
 *
 * Приём байта.
 */
static unsigned char tm_read()
{
    static unsigned char i, ret = 0;
    for( i = 0; i < 8; i++ )
    {
        unsigned char in;
        dint();
        TM_TX_PULLDOWN();
        tm_delay( 5 );
        TM_TX_RELEASE();
        tm_delay( 5 );
        in = TM_RX_IN;
        eint();
        ret >>= 1;
        if( in & TM_RX_PIN )
            ret |= BIT7;
        /* release & recovery */
        tm_delay( 200);
    }
    return ret;
}
Подсчёт crc:
Код:
/*****************************************************************************
 * new_crc8
 *
 * Вычисление нового значения CRC8.
 */
static unsigned char new_crc8( unsigned char crc8, unsigned char byte )
{
    unsigned char i;
    for( i = 0; i < 8; i++ )
    {
        if( (crc8 ^ byte) & 1 )
            crc8 = ((crc8 ^ 0x18) >> 1) | 0x80;
        else
            crc8 >>= 1;
        byte >>= 1;
    }
    return crc8;
}
Ну и функция чтения номера ключа:
Код:
/*****************************************************************************
 * read_serial_number
 *
 * Чтение кода ключа и запись события в очередь главной задачи.
 */
static void read_serial_number()
{        
    static unsigned char k;
    read_attempts = 240;
    tm_event=no_tm_event;
    k=0;
    while( read_attempts-- )
    {
    static unsigned char n, crc8;
        /* задержка через каждые 16 попыток */
        if( (read_attempts & 15) == 0 )
            {
             timer_3=0;
             while(timer_3 < 3);
            }
        tm_delay(512);
        /* reset */
        TM_TX_PULLDOWN();
        tm_delay( 480 );  /* tRSTL > 480us */
        /* завершаем импульс сброса, проверяем уровень, должен быть высокий */
        dint();
        TM_TX_RELEASE();
        tm_delay( 7 );   /* 15us minimum tPDH */
        if( (TM_RX_IN & TM_RX_PIN) == 0 )
        {
            /* вероятно, вход просто закорочен */
            eint();
            continue;
        }
        /* контролируем presence pulse */
        tm_delay(80);  /* 60us minimum tPDL */
        n = TM_RX_IN;
        eint();
        if( n & TM_RX_PIN )
            /* что-то не так, уровень должен оставаться низким */
            continue;
        /* ожидаем завершения presence pulse */
        tm_delay(240); /* tPDL */
        if( !(TM_RX_IN & TM_RX_PIN) )
            /* таймаут */
            continue;
        /* выдерживаем высокий уровень tRSTH */
        tm_delay( 480 );
        /* посылаем команду Read ROM */
        tm_send( 0x33 );
        /* читаем тип устройства */
        n = tm_read();
        if( 0 == n )
        /* тип устройства не может быть нулевым */
        continue;
       
        crc8 = new_crc8( 0, n );
        /* читаем код */
        for( n = 0; n < 6; n++ )
        {
            unsigned char code = tm_read();
            tm_code[ n ] = code;
            crc8 = new_crc8( crc8, code );
        }
        /* читаем crc8 и проверяем */
        if( tm_read() != crc8 )
           {
            tm_event=tm_crc_error;
            continue;
           }
        else { tm_event=tm_crc_ok;  return;}
           
    }
}
На msp430F149 все это отлично работает!
Вроде всё то же пытаюсь на Атмеге повторить - ни чего не выходит!  
   
 Читаются одни "1" - то есть все прочитанные байты = 255.  
 Чего надо?  
 Уже мозг кипит!  
 Уже на отдельной плате собрал и с транзистором для подтяжки -  не хочет работать.
Может и ошибка то где то на поверхности, но "не поглазам"!  
 Осциллограф мог бы прояснить ситуацию, уже нашел за 5 тысяч в "Радиолюбителе", но получку надо ждать.