Страница 17 из 386

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 01, 2011 16:27:21
avreal
А вот так

Код: Выделить всё

uint8_t days(uint8_t m)
{
        if(m == 2) return 29; // по хорошему, надо еще год на високосный проверять, но это выходит за рамки кода выше
        if(m & 0x08) ++m;
        return 30 + (m & 1);
}
результат тот же, максимум за то же время, что с таблицей, но ещё байтов на 4-6 короче в коде.
Кстати, с таблицей как раз фантазии не надо :-)

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 01, 2011 17:18:01
ChipKiller
А вот так
... здорово, но не для уровня тех, кто больше задает вопросов, чем отвечает :)) - чем проще и понятней - тем лучше ИМХО (... ну а если еще и код короче, то вообще "подарок").

Код: Выделить всё

uint8_t days(uint8_t m)
{
        if(m == 2) return 29; // по хорошему, надо еще год на високосный проверять, но это выходит за рамки кода выше
        if(m & 0x08) ++m; // ... если месяц >= 8, то в четном - 31 день 
        return 30 + (m & 1); // .. для остальных (месяц < 8) наоборот - в нечетном 31 день
}
.. хороший пример :beer:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 01, 2011 21:19:50
levaclaus
да не стоит задачи сделать супер код, и напичкать побольше всего ненужного, типа будильников и тп. Основная задача - часы с календарём, резервным питаем, термометром, пультом ду. Для начала сойдёт))

Счас осталось завести кнопку на прерывание, приделать толковый 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% (если не ошибаюсь).

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 01, 2011 22:17:13
ChipKiller
levaclaus писал(а):О, да, кстати, в переменной temp при отрицательной температуре высит чисо с "-", этот минус портит всю малину при формировании строки - получается гадко и не красиво. Как бы от него избавится?
...лучше в памяти полностью сформировать строку для вывода и только потом вызвать lcd_putsf - при таком способе моргать экран точно не будет да и "манипуляции" в RAM выполнять проще.

Re: Вопросы по С/С++ (СИ)

Добавлено: Ср мар 02, 2011 22:12:45
T0lik
Если класс описан так

Код: Выделить всё

__flash class MyClass
{     
     public:
       int a, b, c;
};
То все экземпляры класса будут располагаться во flash или в ROM?

а также как правильно разместить указатель во flash на объект размещенный во flash

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 08, 2011 21:07:32
levaclaus
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)
, так?
-----------

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 08, 2011 21:23:57
ARV
а не пробовали хелп к своему CVAVR читать?
параметры этой функции:
1 - адрес датчика
2, 3 - минимальный и максимальный "порог термостата" - см. даташит об этом режиме
4 - разрешающая способность измерения

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 08, 2011 22:40:23
levaclaus
ARV
спасибо,
хто пытае, той не блукае ))
ds18b20_init(0,0,0,0);
заюзал так

помогло, часы перестали тупить и идти рывками. Кнопка настройки стала работать, только надо задержаеть её. Возможно это и к лучшему.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт мар 10, 2011 20:46:43
levaclaus
где можно почитать подробно про регистры, какие для чего служат и их разновидности для разных avr-ov, на русском?

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт мар 10, 2011 21:26:00
O-LED
у меня в подписи

Re: Вопросы по С/С++ (СИ)

Добавлено: Пт мар 11, 2011 22:59:57
levaclaus
на тиньку тоже надо

Re: Вопросы по С/С++ (СИ)

Добавлено: Сб мар 12, 2011 00:39:43
levaclaus

Юнит-тесты для кода под AVR

Добавлено: Пн мар 14, 2011 22:42:28
ellioh
Коллеги, я тут долго думал, как бы мне сделать выполнение юнит-тестов для кода под AVR. То, что придумал, пока не очень нравится.

Итак, постановка задачи.
1. Есть библиотека (чисто заголовочная шаблонная библиотека для C++, хотя тут это даже не очень важно), которая в идеале должна быть полностью покрыта тестами.
2. Часть тестов работает на этапе компиляции, и с этими тестами нет проблем, когда оно не компилируется, видно, где. Но некоторые тесты представляют собой вычисление булевского выражения во время выполнения, и тест не должен проходить, если это выражение даёт false.
3. Количество тестов -- порядка нескольких сотен, то есть писать для каждого теста что-то нетривиальное неохота, нужен макрос вида ASSERT(expression).
4. Тесты должны запускаться в двух вариантах: в железе под JTAG-отладкой и в эмуляторе.
5. В любом случае должно быть можно понять, на каком тесте выполнение спотыкается.

Пока я сделал это довольно уродливо: проверка результата теста -- макрос, который превращается в бесконечный цикл, если тест не прошёл. main () вызывает функции тестирования, а затем завершается бесконечным циклом. Делаю останов в отладчике и вижу, зациклился ли я в бесконечном цикле в конце main (), или в бесконечном цикле внутри тестов. Работает, но как-то это уродливо. Тем не менее, за вечер ничего лучше для embedded-приложения я не придумал: все юзабельные решения требуют какой-то обвязки (LCD или что-то ещё, то есть специализированной тестовой железки, что как-то слишком).

Ни у кого нет более интересных идей?

UPD1: есть идея тесты запускать вообще не на целевой платформе, а под x86 (или x86_64), подменив все нужные средства типа регистров или периферии фальшивыми объектами. Тогда можно печатать в cout/cerr. Но всё-таки это не совсем те тесты, работа на одной платформе не гарантирует работы на другой.

UPD2: подумав, пришёл к выводу, что бесконечный цикл при ошибке не так уж и плох, надо только привесить к двум ногам зелёный и красный светодиоды, зелёный зажигать при успешном прохождении всех тестов, а красный -- при зависании из-за ошибки. Такую чудо-схему с двумя диодами можно гонять даже в VMLAB, да и в железе такое сделать тоже не слишком напряжёт пользователей библиотеки.

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт мар 17, 2011 13:51:57
ut1wpr
levaclaus писал(а):Всё, закончил термометр, разобрался наконец то с формированием строки
Не похоже...

Код: Выделить всё

      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 в начале строки?

Похоже, вы не до конца разобрались с форматами fprintf/sprintf. Подчитайте, в дальнейшем пригодится.
http://ru.wikipedia.org/wiki/Printf

Re: Вопросы по С/С++ (СИ)

Добавлено: Чт мар 17, 2011 23:25:43
levaclaus
ut1wpr, зачем такие наезды? Сказали бы просто "объясни, я не понимаю".
В строке формата указан вывод одной переменной, а в списке переменных их две. Куда и в каком формате выводится вторая переменная?
непонял поясните вопрос

Код: Выделить всё

Почему в одном случае модуль 2, а во втором модуль 3? Для получения одного десятичного знака нужен модуль 10.
Где на дисплее десятичная точка?
1 - мне не нужна десятичная точка, вот её и нет, Мне и десятичный знаки ненужны. Термометр всёравно не показывает десятичные данные. Вот и убрал. У меня крайне мало места на экране, приходится экономить на каждом ненужном символе, чтобы вывести нужный
2 - модуль 02 для положительной температуры, модуль 03 для отрицательной, т.к. в temp хранится или 2 знака отрицательной температуры с - (того три знака), или 2 знака положительной без знака + (два знака). Если поставить модуль 2 там и там - то при отрицательной температуре разобъётся строка и будет виден перед минусом +положительной температуры.
Повторюсь, мне не нужен десятичный знак, мне нужно было сформировать постоянную по количеству символов строку (чтоб её не разрывало при переходе на 1 знак), т.к. я не могу использовать очистку дисплея. Поэтому мне нужен вывод числа с указанным количеством ведущих знаков.
ЗГ
что это значит? вывод символа из кодовой таблицы матрицы. FA - код символа, максимально похожего на термометр. Многие пишут T=, но это нейкая фигня, знак термометра актуальнее Также как и \xdf - вывод символа, похожего на градус
Похоже, ВЫ не до конца разобрались с форматами fprintf/sprintf.
ну теперь то вы разобрались да?

Re: Вопросы по С/С++ (СИ)

Добавлено: Сб мар 19, 2011 23:35:26
ibiza11
Уважаемые коты, может есть у кого облегченный аналог стандартной функции sprintf для AVR? мне нужно выводить максимум double на экран и пару-тройку своих кодов из знакогенератора. Думал написать свое, да и написал уже пару функций, но в каждом конкретном случае приходится постоянно подпиливать их. Может уже кто нибудь модуль написал с правильным .header`ом со всеми #ifdef #ifndef.... чтобы тупо хеадер поправить и все ок? спрашиваю чисто из интереса) подпиливание не напрягает, да и хочется посмотреть на чужой код, чтобы поправить свой, подчерпнуть идей, так сказать))))

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 22, 2011 22:18:11
SSERG
Доброго времени суток! Недавно приступил к освоению коннтроллеров,написал вот такой код для ATmega16. Подскажите как можно проще опрашивать много портов и сравнивать значения с другими портами,просьба сильно не пинать- это мой первый код! :oops:
исходник:

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 22, 2011 22:34:21
Gudd-Head
SSERG писал(а):Доброго времени суток! Недавно приступил к освоению коннтроллеров,написал вот такой код для ATmega16. Подскажите как можно проще опрашивать много портов и сравнивать значения с другими портами,просьба сильно не пинать- это мой первый код!
Простыни кода не надо вставлять в текст сообщения. И комментов мало.

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 22, 2011 22:53:05
SSERG
Извиняюсь исправил! :)

Re: Вопросы по С/С++ (СИ)

Добавлено: Вт мар 22, 2011 23:19:45
ChipKiller
SSERG писал(а):как можно проще опрашивать много портов и сравнивать значения с другими портами
... прочитать порт можно и проще, зачем так все усложнять?