А почему поллинг не подходит? Прерывания запрещать нужно очень кратковременно, менее 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); }
-
- Поллинг нужно увязывать нетолькособработчиками прерываний но и с другими задачами "в простом цикле". Можно, конечно, но неудобно. - Тоже Скрипач(11.04.2010 20:35, )