ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
17 июля
225418 Топик полностью
Лeoнид Ивaнoвич (05.12.2010 01:56, просмотров: 127) ответил mazur на Примеры на асме?
Вот на Си (статьи обновлять не имею возможности, там на asm): //---------------------------------------------------------------------------- //Модуль обслуживания термометра DS18B20 //---------------------------------------------------------------------------- #include <Main.h> #include <DS18B20.h> //----------------- Используемые модулем аппаратные ресурсы: ----------------- //1-проводной интерфейс использует порт OWP. //Порт должен быть настроен на ввод, //внутренний подтягивающий резистор должен быть отключен, //используется внешний подтягивающий резистор 4.7 кОм. //Должны быть определены следующие макросы: //#define OWP (1 << Pxn) //#define Port_OWP_OUT (DDRx |= OWP) //#define Port_OWP_IN (DDRx &= ~OWP) //#define Pin_OWP (PINx & OWP) //Термометр должен быть запрограммирован в 12-разрядный режим //(биты R0, R1 в регистре конфигурации равны единице). //Считываются только 2 байта темпертуры без проверки CRC. //----------------------------- Константы: ----------------------------------- #define TCONV 1000 //время преобразования температуры, мс //---------------------------- Переменные: ----------------------------------- bool Presence; //флаг присутствия термометра int Temperature; //текущая температура int TTimer; //таймер термометра //----------------------------- Функции: ------------------------------------- bool TReset(void); //формирование импульса сброса char TByte(char dat); //запись/чтение байта bool TBit(bool b); //запись/чтение бита bool Start(void); //запуск преобразования int Read_T(void); //чтение температуры //--------------------- Генерация импульса сброса: --------------------------- 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); } //----------------------- Запуск преобразования: ----------------------------- bool Start(void) { if(TReset()) { TByte(0xCC); //skip ROM TByte(0x44); //start conversion return(1); } return(0); } //-------------------------- Чтение термометра: ------------------------------ int Read_T(void) { if(TReset()) { TByte(0xCC); //skip ROM TByte(0xBE); //read scratchpad char l = TByte(0xFF); //чтение младшего байта char h = TByte(0xFF); //чтение старшего байта return(WORD(h, l)); } return(0); //ошибка } //--------------------- Инициализация термометра: ---------------------------- void DS18B20_Init(void) { Presence = Start(); TTimer = ms2sys(TCONV); } //----------------------- Измерение температуры: ----------------------------- void DS18B20_Exe(bool t) { if(t) { if(TTimer) TTimer--; if(!TTimer) { if(Presence) Temperature = Read_T(); Presence = Start(); TTimer = ms2sys(TCONV); } } } //------------------------- Чтение температуры: ------------------------------ int DS18B20_GetT(void) { return(Temperature); } //----------------------------------------------------------------------------