uint8_t days(uint8_t m)
{
if(m == 2) return 29; // по хорошему, надо еще год на високосный проверять, но это выходит за рамки кода выше
if(m & 0x08) ++m;
return 30 + (m & 1);
}
результат тот же, максимум за то же время, что с таблицей, но ещё байтов на 4-6 короче в коде.
Кстати, с таблицей как раз фантазии не надо
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
... здорово, но не для уровня тех, кто больше задает вопросов, чем отвечает - чем проще и понятней - тем лучше ИМХО (... ну а если еще и код короче, то вообще "подарок").
uint8_t days(uint8_t m)
{
if(m == 2) return 29; // по хорошему, надо еще год на високосный проверять, но это выходит за рамки кода выше
if(m & 0x08) ++m; // ... если месяц >= 8, то в четном - 31 день
return 30 + (m & 1); // .. для остальных (месяц < 8) наоборот - в нечетном 31 день
}
да не стоит задачи сделать супер код, и напичкать побольше всего ненужного, типа будильников и тп. Основная задача - часы с календарём, резервным питаем, термометром, пультом ду. Для начала сойдёт))
Счас осталось завести кнопку на прерывание, приделать толковый rc5
Всё, закончил термометр, разобрался наконец то с формированием строки
***
temp=ds18b20_temperature(0); //читаем температуру
//температура
lcd_gotoxy(11,1);
if (temp<0)
{
sprintf(lcd_buffer,"\xfa%03i\xdf",temp,temp%03);
}
else
{
sprintf(lcd_buffer,"\xfa+%02i\xdf",temp,temp%02);
}
lcd_puts(lcd_buffer); //выводим масив на LCD
***
---
avreal
вычисление високосного года в часах реализовано, календарь уже месяца 3 без сбоя работает\\\
Спасибо за пример, если будет нехватка места под rc5, буду тогда оптимизировать код, а пока занято 45% (если не ошибаюсь).
Последний раз редактировалось levaclaus Вт мар 01, 2011 22:20:33, всего редактировалось 2 раза.
levaclaus писал(а):О, да, кстати, в переменной temp при отрицательной температуре высит чисо с "-", этот минус портит всю малину при формировании строки - получается гадко и не красиво. Как бы от него избавится?
...лучше в памяти полностью сформировать строку для вывода и только потом вызвать lcd_putsf - при таком способе моргать экран точно не будет да и "манипуляции" в RAM выполнять проще.
ChipKiller писал(а):Без коренной переделки попробуйте следующее - настройте на 9-ти битное преобразование (по умолчанию оно 12-ти битное), при этом время преобразования уменьшится в 8 раз.
нашёл в тырнете такую строку
ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high, unsigned char resolution)
последний бит если 0 активизирует 9битное преобразование.
А что следует записать в первые 3 пункта?
ds18b20_init(?,?,?,0)
--
upd
приходит в голову сл бред
первое - это переменная, куда будет приходеть данные, типа temp
второе - минимальная отображаемая температура
третье - максимальная отображаемая температура
ds18b20_init(temp,20,70,0)
, так?
-----------
Последний раз редактировалось levaclaus Вт мар 08, 2011 21:38:35, всего редактировалось 1 раз.
а не пробовали хелп к своему CVAVR читать?
параметры этой функции:
1 - адрес датчика
2, 3 - минимальный и максимальный "порог термостата" - см. даташит об этом режиме
4 - разрешающая способность измерения
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Коллеги, я тут долго думал, как бы мне сделать выполнение юнит-тестов для кода под AVR. То, что придумал, пока не очень нравится.
Итак, постановка задачи.
1. Есть библиотека (чисто заголовочная шаблонная библиотека для C++, хотя тут это даже не очень важно), которая в идеале должна быть полностью покрыта тестами.
2. Часть тестов работает на этапе компиляции, и с этими тестами нет проблем, когда оно не компилируется, видно, где. Но некоторые тесты представляют собой вычисление булевского выражения во время выполнения, и тест не должен проходить, если это выражение даёт false.
3. Количество тестов -- порядка нескольких сотен, то есть писать для каждого теста что-то нетривиальное неохота, нужен макрос вида ASSERT(expression).
4. Тесты должны запускаться в двух вариантах: в железе под JTAG-отладкой и в эмуляторе.
5. В любом случае должно быть можно понять, на каком тесте выполнение спотыкается.
Пока я сделал это довольно уродливо: проверка результата теста -- макрос, который превращается в бесконечный цикл, если тест не прошёл. main () вызывает функции тестирования, а затем завершается бесконечным циклом. Делаю останов в отладчике и вижу, зациклился ли я в бесконечном цикле в конце main (), или в бесконечном цикле внутри тестов. Работает, но как-то это уродливо. Тем не менее, за вечер ничего лучше для embedded-приложения я не придумал: все юзабельные решения требуют какой-то обвязки (LCD или что-то ещё, то есть специализированной тестовой железки, что как-то слишком).
Ни у кого нет более интересных идей?
UPD1: есть идея тесты запускать вообще не на целевой платформе, а под x86 (или x86_64), подменив все нужные средства типа регистров или периферии фальшивыми объектами. Тогда можно печатать в cout/cerr. Но всё-таки это не совсем те тесты, работа на одной платформе не гарантирует работы на другой.
UPD2: подумав, пришёл к выводу, что бесконечный цикл при ошибке не так уж и плох, надо только привесить к двум ногам зелёный и красный светодиоды, зелёный зажигать при успешном прохождении всех тестов, а красный -- при зависании из-за ошибки. Такую чудо-схему с двумя диодами можно гонять даже в VMLAB, да и в железе такое сделать тоже не слишком напряжёт пользователей библиотеки.
if (temp<0)
{
sprintf(lcd_buffer,"\xfa%03i\xdf",temp,temp%03);
}
else
{
sprintf(lcd_buffer,"\xfa+%02i\xdf",temp,temp%02);
}
В строке формата указан вывод одной переменной, а в списке переменных их две. Куда и в каком формате выводится вторая переменная?
Почему в одном случае модуль 2, а во втором модуль 3? Для получения одного десятичного знака нужен модуль 10.
Где на дисплее десятичная точка?
Я с вашим ЗГ не знаком, почему и спрашиваю, что за символ \xFA в начале строки?
Почему в одном случае модуль 2, а во втором модуль 3? Для получения одного десятичного знака нужен модуль 10.
Где на дисплее десятичная точка?
1 - мне не нужна десятичная точка, вот её и нет, Мне и десятичный знаки ненужны. Термометр всёравно не показывает десятичные данные. Вот и убрал. У меня крайне мало места на экране, приходится экономить на каждом ненужном символе, чтобы вывести нужный
2 - модуль 02 для положительной температуры, модуль 03 для отрицательной, т.к. в temp хранится или 2 знака отрицательной температуры с - (того три знака), или 2 знака положительной без знака + (два знака). Если поставить модуль 2 там и там - то при отрицательной температуре разобъётся строка и будет виден перед минусом +положительной температуры.
Повторюсь, мне не нужен десятичный знак, мне нужно было сформировать постоянную по количеству символов строку (чтоб её не разрывало при переходе на 1 знак), т.к. я не могу использовать очистку дисплея. Поэтому мне нужен вывод числа с указанным количеством ведущих знаков.
вывод символа из кодовой таблицы матрицы. FA - код символа, максимально похожего на термометр. Многие пишут T=, но это нейкая фигня, знак термометра актуальнее Также как и \xdf - вывод символа, похожего на градус
Похоже, ВЫ не до конца разобрались с форматами fprintf/sprintf.
ну теперь то вы разобрались да?
Последний раз редактировалось levaclaus Вс апр 10, 2011 09:30:48, всего редактировалось 1 раз.
Уважаемые коты, может есть у кого облегченный аналог стандартной функции sprintf для AVR? мне нужно выводить максимум double на экран и пару-тройку своих кодов из знакогенератора. Думал написать свое, да и написал уже пару функций, но в каждом конкретном случае приходится постоянно подпиливать их. Может уже кто нибудь модуль написал с правильным .header`ом со всеми #ifdef #ifndef.... чтобы тупо хеадер поправить и все ок? спрашиваю чисто из интереса) подпиливание не напрягает, да и хочется посмотреть на чужой код, чтобы поправить свой, подчерпнуть идей, так сказать))))
Доброго времени суток! Недавно приступил к освоению коннтроллеров,написал вот такой код для ATmega16. Подскажите как можно проще опрашивать много портов и сравнивать значения с другими портами,просьба сильно не пинать- это мой первый код!
исходник:
SSERG писал(а):Доброго времени суток! Недавно приступил к освоению коннтроллеров,написал вот такой код для ATmega16. Подскажите как можно проще опрашивать много портов и сравнивать значения с другими портами,просьба сильно не пинать- это мой первый код!
Простыни кода не надо вставлять в текст сообщения. И комментов мало.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]