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

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

ловите, может поможет :

Отправлено ussrusa 19 декабря 2007 г. 02:00
В ответ на: ds18s20+atmega - есть у кого-нить исходники вменяемые? отправлено waszkiewicz 19 декабря 2007 г. 00:23

ul_c_ds1w.h :

<pre>
/** \addtogroup group_ds1w Dallas 1-wire (работа с шиной Dallas 1-wire)
\note Before use define functions or macros (перед включением модуля нужно определить следующие функции или макросы) :
<br /><i><b>u8 ds1w_dq_rd(void)</b></i> - read DQ level (to any bit of result)
<br /><i><b>void ds1w_dq_wr(u8 dq_level)</b></i> - write DQ level (from any bit of dq_level)
<br /><i><b>void ds1w_delay_bit_before(void)</b></i> - delay before bit read/write
<br /><i><b>void ds1w_delay_bit_start(void)</b></i> - delay before setting DQ level (<15usec)
<br /><i><b>void ds1w_delay_bit_rd(void)</b></i> - delay before bit level read (~40usec)
<br /><i><b>void ds1w_delay_bit_after(void)</b></i> - delay after bit read/write (>60usec)
<br /><i><b>void ds1w_delay_byte_before(void)</b></i> - delay before byte read/write
<br /><i><b>void ds1w_delay_byte_after(void)</b></i> - delay before byte read/write
<br /><i><b>void ds1w_delay_reset_before(void)</b></i> - delay before reset pulse
<br /><i><b>void ds1w_delay_reset(void)</b></i> - delay till reset pulse
<br /><i><b>void ds1w_delay_presence_before(void)</b></i> - delay after reset pulse before reading presence pulse (~80usec)
<br /><i><b>void ds1w_delay_presence_after(void)</b></i> - delay after reset pulse after reading presence pulse (~200usec)
*/

#if ((!defined(ul_c_ds1w_included)) || (defined __DOXYGEN__))

#define ul_c_ds1w_included 1 /**< \brief module inclusion flag<br />флаг включения модуля \ingroup group_ds1w */

#include "ul_c_misc.h" /*include misc definitions/functions types*/

#define ds1w_res_ok 0 /**< \brief 1-wire reset OK (ACK received)<br />сброс 1-wire шины прошел нормально (получен ACK) \ingroup group_ds1w */
#define ds1w_res_err_sh0 1 /**< \brief 1-wire shorted to GND<br />1-wire шина замкнута на землю \ingroup group_ds1w */
#define ds1w_res_err_sh1 2 /**< \brief 1-wire shorted to VCC<br />1-wire шина замкнута на питание \ingroup group_ds1w */
#define ds1w_res_err_nack 3 /**< \brief no ACK received<br />не получен ACK \ingroup group_ds1w */

extern u8 ds1w_res_status; /**< \brief previous Reset status<br />предыдущий результат сброса \ingroup group_ds1w */

/** \brief read bit to 7th bit of \b data_in<br />прочитать бит в 7й бит \b data_in \ingroup group_ds1w */
u8 ds1w_bit_rd(u8 data_in);

/** \brief write bit 0 of \b data_out<br />записать бит 0 из \b data_out \ingroup group_ds1w */
void ds1w_bit_wr(u8 data_out);

/** \brief read byte<br />прочитать байт \ingroup group_ds1w */
u8 ds1w_byte_rd(void);

/** \brief write byte<br />записать байт \ingroup group_ds1w */
void ds1w_byte_wr(u8 byte_in);

/** \brief reset 1-wire bus,return \b 0 if \b ACK received,\b 1 if \b DQ shorted to ground,\b 2 if \b DQ shorted to VCC,\b 3 if no \b ACK received or \b DQ floating
<br />сбросить шину,возвратить \b 0 если \b ACK принят, \b 1 если \b DQ замкнут на землю, \b 2 если \b DQ замкнут на питание, \b 3 если \b ACK не принят (или обрыв \b DQ) \ingroup group_ds1w
*/
u8 ds1w_res(void);

/** \brief convert 12-bit temperature data of ds18b20 to celsius signed fixed-point (with tenth)
<br />преобразовать 12-битное значение температуры в десятичное с фиксированной точкой (1 цифра после точки) \ingroup group_ds1w */
s16 ds1w_12bit2tenth(u16 value);

#endif
</pre>

ul_c_ds1w.c :

<pre>
#include "ul_c_ds1w.h"

#if (defined(ul_c_use_gccavr))
#include <avr/pgmspace.h> /*program memory usage for AVR-GCC*/
#endif

u8 ds1w_res_status;

u8 ds1w_bit_rd(u8 data_in)
{ds1w_delay_bit_before(); /*delay before starting pulse*/
cli(); /*disable interrupts*/
ds1w_dq_wr(0); /*set DQ to 0 (bit start pulse)*/
ds1w_delay_bit_start(); /*short delay after DQ level set*/
ds1w_dq_wr(1); /*release DQ*/
ds1w_delay_bit_rd(); /*delay before DQ level read*/
/*read DQ level to 7th bit of data_in*/
if (ds1w_dq_rd()) data_in |= 0x80; else data_in &= 0x7f;
ds1w_delay_bit_after(); /*delay to the rest of bit*/
sei(); /*enable interrupts*/
return(data_in); /*return result*/
}

void ds1w_bit_wr(u8 data_out)
{ds1w_delay_bit_before(); /*delay before starting pulse*/
cli(); /*disable interrupts*/
ds1w_dq_wr(0); /*set DQ to 0 (bit start pulse)*/
ds1w_delay_bit_start(); /*short delay after DQ level set*/
ds1w_dq_wr(data_out); /*set DQ level to bit 0 of abyte*/
ds1w_delay_bit_after(); /*delay to the rest of bit*/
ds1w_dq_wr(1); /*release DQ line*/
sei(); /*enable interrupts*/
}

u8 ds1w_byte_rd(void)
{u8 bits_cnt, byte_out;
ds1w_delay_byte_before(); /*delay before byte read*/
byte_out = 0; /*clear resulting byte*/
for (bits_cnt=8; bits_cnt; bits_cnt--) /*bits read loop*/
{byte_out >>= 1; /*shift result right*/
byte_out = ds1w_bit_rd(byte_out); /*read next bit*/
}
ds1w_delay_byte_after(); /*delay after byte read*/
return(byte_out); /*return result*/
}

void ds1w_byte_wr(u8 byte_in)
{u8 bits_cnt;
ds1w_delay_byte_before(); /*delay before byte write*/
for (bits_cnt=8; bits_cnt; bits_cnt--) /*bits write loop*/
{ds1w_bit_wr(byte_in & 1); /*write lowest bit*/
byte_in >>= 1; /*shift to next bit*/
}
ds1w_delay_byte_after(); /*delay after byte read*/
}

u8 ds1w_res(void)
{u8 result;
result = 0; /*result of operation*/
ds1w_delay_reset_before();
ds1w_dq_wr(1); /*release DQ*/
ds1w_delay_bit_start();
if (ds1w_dq_rd() == 0) result = 1; /*if DQ not released (shorted to GND), return result = 2*/
else /*else proceed with reset*/
{ds1w_dq_wr(0); /*clear DQ*/
ds1w_delay_bit_start();
if (ds1w_dq_rd() != 0)
{result = 2; /*if DQ not 0 (shorted to VCC), return result = 2*/
ds1w_dq_wr(1); /*release DQ*/
}else /*else proceed with reset*/
{ds1w_delay_reset(); /*delay till the rest of reset pulse*/
ds1w_dq_wr(1); /*release DQ*/
ds1w_delay_presence_before(); /*delay before reading the presense pulse*/
if (ds1w_dq_rd()) result = 3; /*if no presence pulse received, return result = 3*/
else ds1w_delay_presence_after(); /*delay after reading the presense pulse*/
}
}
ds1w_res_status = result; /*remember result of reset*/
return(result); /*return result of reset*/
}

/*convert 12-bit temperature data of ds18b20 to signed celsius fixed-point (with tenth)*/
s16 ds1w_12bit2tenth(u16 value)
{u8 value_sign;
value_sign = (value >> 8) & 0x80; /*remember sign of value*/
if (value_sign) value = 0 - value; /*convert to absolute value*/
value = (value >> 1) + (value >> 3);/*convert from 12-bit to fixed point*/
if (value_sign) value = 0 - value; /*restore sign of result*/
return(value);
}
</pre>


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

Ответы


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

Сообщение:

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

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

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

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