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

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

Ну, вот что близко лежало(+)

Отправлено Lameг 18 января 2007 г. 14:09
В ответ на: формирование бита паритета [>] отправлено megajohn 18 января 2007 г. 13:49

////////////////////////////////////////
// Бит четности байта генерируется на "С" так:
//x - unsigned char
#define mParityEven(x) { (x) ^= (x >> 4); \
(x) ^= (x >> 2); \
(x) ^= (x >> 1); \
}
// Бит четности будет младшим в байте.
////////////////////////////////////////
////////////////////////////////////////
// Округление до целого
float f;
int i;
i = (int)(f+((f>0.0)?(0.5):(-0.5)));
////////////////////////////////////////
////////////////////////////////////////
// Компактное (несмотря на ужасный вид) копирование
// бита i переменной aa
// в бит j переменной bb
char aa,bb,j,i; // пример
aa = 15;
bb = 0;
i = 2;
j = 5;
bb=(bb&(~(1 << j))) | ((1&(aa >> i)) << j);
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
// Преобразование даты в long-переменную,
// показывающую кол-во секунд от 197? года.
// и обратное преобразование.
// Назначение: Удобно хранить и инкрементировать (в прерывании по
// RTC) одну long-переменную секунд текущего времени вместо того,
// чтобы каждый раз прибавлять секунды, минуты, часы...
// А когда надо - преобразовывать обратно в дату и выводить.
struct type_time {
unsigned char tm_sec;
unsigned char tm_min;
unsigned char tm_hour;
unsigned char tm_day;
unsigned char tm_month;
unsigned int tm_year;
};
struct type_time today_tt;
/********************************************************/
/* Convert Date and Time to long seconds */
/********************************************************/
unsigned long DateTime_ToLong(struct type_time *ttime)
{
volatile unsigned char month;
volatile unsigned int year;
volatile unsigned long c, ya;
volatile unsigned long res;

month = ttime->tm_month;
year = ttime->tm_year;

if(month > 2)
{
month -= 3;
}/*if*/
else
{
month += 9;
year--;
}/*else*/

c = (year / 100L);
ya = (year - (100L * c));
res = (146097L * c)/4L + (1461L * ya) /
4L + (153L * month + 2L)/5L + ttime->tm_day;
return (res - 720000L) * 86400L +
(ttime->tm_hour * 60L + ttime->tm_min) * 60L +ttime->tm_sec;
}/*DateTime_ToLong*/
/*****************************************/
/*****************************************/
/* Convert long "j" seconds to Date and Time */
/*****************************************/
void LongTo_DateTime(unsigned long j, struct type_time *ttime)
{
volatile unsigned long d, m, y;
volatile unsigned long date, t;

date = (j / 86400L);
t = (j - (date * 86400L));
date += 720000L;
y = (4L * date - 1L) / 146097L;
d = (4L * date - 1L - 146097L * y) / 4L;
date = (4L * d + 3L) / 1461L;
d = (4L * d + 7L - 1461L * date) / 4L;
m = (5L * d - 3L) / 153L;
d = (5L * d + 2L - 153L * m) / 5L;
y = 100L * y + date;

if (m < 10L)
{
m += 3L;
}/*if*/
else
{
m -= 9L;
y++;
}/*else*/

ttime->tm_month = m;
ttime->tm_year = y;
ttime->tm_day = d;
ttime->tm_sec = (t % 60L);
t /= 60L;
ttime->tm_hour = (t / 60L);
ttime->tm_min = (t % 60L);
}/*LongTo_DateTime*/
/**************************************************/


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

Ответы


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

Сообщение:

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

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

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

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