ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
189228 Топик полностью
Лeoнид Ивaнoвич (11.04.2010 20:24, просмотров: 129) ответил Скрипач на Протокол 1wire. Лучшая реализация?
А почему поллинг не подходит? Прерывания запрещать нужно очень кратковременно, менее 70 мкс. 
//--------------------- Генерация импульса сброса: ---------------------------

bool TReset(void)
{
  char si;
  Port_OWP_0;
  Port_OWP_OUT;                  //OWP <- 0
  Delay_us(500);               //delay 500 uS
  si = __save_interrupt();
  __disable_interrupt();       //запрещение прерываний
  Port_OWP_IN;                  //OWP <- 1
  Delay_us(14);                //delay 14 uS
  if(Pin_OWP)                  //если OWP = 0, то ошибка
  {
    Delay_us(52);              //delay 52 uS
    if(!Pin_OWP)               //если OWP = 1, то ошибка
    {
      __restore_interrupt(si); //восстанавление прерываний
      Delay_us(250);           //delay 250 uS
      if(Pin_OWP)              //если OWP = 0, то ошибка
      {
        return(1);             //если ошибок нет, термометр присутствует
      }
    }
  }
  __restore_interrupt(si);     //восстанавление прерываний в случае ошибки
  return(0);
}

//-------------- Запись/чтение байта по однопроводной шине: ------------------

char TByte(char dat)
{
  char res;
  for(char i = 0; i < 8; i++)
  {
    res = res >> 1;
    if(TBit(dat & 1)) res |= 0x80;
     else res &= ~0x80;
    dat = dat >> 1;
  }
  return(res);
}

//--------------- Запись/чтение бита по однопроводной шине: ------------------

bool TBit(bool b)
{
  char si;
  si = __save_interrupt();
  __disable_interrupt();       //запрещение прерываний
  Port_OWP_0;
  Port_OWP_OUT;                  //OWP <- 0
  Delay_us(2);                 //delay 2 uS
  if(b) Port_OWP_IN;            //bit = 1, OWP <- 1
  Delay_us(13);                //delay 13 uS
  bool owp = Pin_OWP;          //чтение порта
  Delay_us(45);                //delay 45 uS
  Port_OWP_1;                //force pullup
  Port_OWP_OUT;
  __restore_interrupt(si);     //восстанавление прерываний
  Delay_us(2);                 //delay 2 uS
  return(owp);
}