Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

IAR C:

Отправлено Леонид Иванович 19 апреля 2007 г. 12:24
В ответ на: Поделитесь кто может сишным примером работы с DS18S20, плз. отправлено Lexandro 19 апреля 2007 г. 11:35


//-------------------------- Старт термометра: -------------------------------

void Th_Start(void)
{
TReset(); //импульс сброса
if(Th_Present)
{
TByte(0xCC); //skip ROM
TByte(0x44); //convert T
}
else
{
Th_Ready = 0; //термометр отсутствует
}
}

//------------------------- Чтение термометра: -------------------------------

void Th_Read(void)
{
static char Th_Crc; //контрольная сумма термометра
if(Th_Present)
{
TReset(); //импульс сброса
if(Th_Present)
{
TByte(0xCC); //skip ROM
TByte(0xBE); //read scratchpad
Th_Crc = 0; //инициализация CRC
for(char i = 0; i < 9; i++)
{
char b = TByte(0xFF); //чтение данных
Th_Crc8(b, &Th_Crc); //обновление CRC
Th_Data[i] = b; //сохранение данных
}
}
}
Th_Ready = Th_Present && !Th_Crc; //готовность данных
}

//--------------------- Генерация импульса сброса: ---------------------------

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

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

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; //OWP <- 0
Delay_us(2); //delay 2 uS
if(b) Port_OWP_Z; //bit = 1, OWP <- 1
Delay_us(13); //delay 13 uS
bool owp = Port_OWP; //чтение порта
Delay_us(45); //delay 45 uS
Port_OWP_Z; //OWP <- 1
__restore_interrupt(si); //восстанавление прерываний
Delay_us(2); //delay 2 uS
return(owp);
}

//--------------------- Вычисление контрольной суммы: ------------------------

void Th_Crc8(char b, char *crc)
{
for(char i = 0; i < 8; b = b >> 1, i++)
if((b ^ *crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;
else *crc = (*crc >> 1) & ~0x80;
}

//----------------------------------------------------------------------------



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 654:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru