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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

А вот так

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

uint8_t days(uint8_t m)
{
        if(m == 2) return 29; // по хорошему, надо еще год на високосный проверять, но это выходит за рамки кода выше
        if(m & 0x08) ++m;
        return 30 + (m & 1);
}
результат тот же, максимум за то же время, что с таблицей, но ещё байтов на 4-6 короче в коде.
Кстати, с таблицей как раз фантазии не надо :-)
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение 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:
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение 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% (если не ошибаюсь).
Последний раз редактировалось levaclaus Вт мар 01, 2011 22:20:33, всего редактировалось 2 раза.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

levaclaus писал(а):О, да, кстати, в переменной temp при отрицательной температуре высит чисо с "-", этот минус портит всю малину при формировании строки - получается гадко и не красиво. Как бы от него избавится?
...лучше в памяти полностью сформировать строку для вывода и только потом вызвать lcd_putsf - при таком способе моргать экран точно не будет да и "манипуляции" в RAM выполнять проще.
T0lik
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб авг 07, 2010 18:38:37
Откуда: Таганрог
Контактная информация:

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

Сообщение T0lik »

Если класс описан так

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

__flash class MyClass
{     
     public:
       int a, b, c;
};

То все экземпляры класса будут располагаться во flash или в ROM?

а также как правильно разместить указатель во flash на объект размещенный во flash
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение 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)
, так?
----------
Последний раз редактировалось levaclaus Вт мар 08, 2011 21:38:35, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

ARV
спасибо,
хто пытае, той не блукае ))
ds18b20_init(0,0,0,0);
заюзал так

помогло, часы перестали тупить и идти рывками. Кнопка настройки стала работать, только надо задержаеть её. Возможно это и к лучшему.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

где можно почитать подробно про регистры, какие для чего служат и их разновидности для разных avr-ov, на русском?
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

у меня в подписи
KIT
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

на тиньку тоже надо
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

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

Сообщение ellioh »

Коллеги, я тут долго думал, как бы мне сделать выполнение юнит-тестов для кода под AVR. То, что придумал, пока не очень нравится.

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

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

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

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

UPD2: подумав, пришёл к выводу, что бесконечный цикл при ошибке не так уж и плох, надо только привесить к двум ногам зелёный и красный светодиоды, зелёный зажигать при успешном прохождении всех тестов, а красный -- при зависании из-за ошибки. Такую чудо-схему с двумя диодами можно гонять даже в VMLAB, да и в железе такое сделать тоже не слишком напряжёт пользователей библиотеки.
Клоподавер упрыгхт
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение 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
С уважением,
Виктор.
Аватара пользователя
levaclaus
Потрогал лапой паяльник
Сообщения: 302
Зарегистрирован: Пн янв 07, 2008 16:56:28
Откуда: Минск

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

Сообщение levaclaus »

ut1wpr, зачем такие наезды? Сказали бы просто "объясни, я не понимаю".

В строке формата указан вывод одной переменной, а в списке переменных их две. Куда и в каком формате выводится вторая переменная?

непонял поясните вопрос

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

Почему в одном случае модуль 2, а во втором модуль 3? Для получения одного десятичного знака нужен модуль 10.
Где на дисплее десятичная точка?

1 - мне не нужна десятичная точка, вот её и нет, Мне и десятичный знаки ненужны. Термометр всёравно не показывает десятичные данные. Вот и убрал. У меня крайне мало места на экране, приходится экономить на каждом ненужном символе, чтобы вывести нужный
2 - модуль 02 для положительной температуры, модуль 03 для отрицательной, т.к. в temp хранится или 2 знака отрицательной температуры с - (того три знака), или 2 знака положительной без знака + (два знака). Если поставить модуль 2 там и там - то при отрицательной температуре разобъётся строка и будет виден перед минусом +положительной температуры.
Повторюсь, мне не нужен десятичный знак, мне нужно было сформировать постоянную по количеству символов строку (чтоб её не разрывало при переходе на 1 знак), т.к. я не могу использовать очистку дисплея. Поэтому мне нужен вывод числа с указанным количеством ведущих знаков.
ЗГ

что это значит?

вывод символа из кодовой таблицы матрицы. FA - код символа, максимально похожего на термометр. Многие пишут T=, но это нейкая фигня, знак термометра актуальнее Также как и \xdf - вывод символа, похожего на градус

Похоже, ВЫ не до конца разобрались с форматами fprintf/sprintf.

ну теперь то вы разобрались да?
Последний раз редактировалось levaclaus Вс апр 10, 2011 09:30:48, всего редактировалось 1 раз.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Уважаемые коты, может есть у кого облегченный аналог стандартной функции sprintf для AVR? мне нужно выводить максимум double на экран и пару-тройку своих кодов из знакогенератора. Думал написать свое, да и написал уже пару функций, но в каждом конкретном случае приходится постоянно подпиливать их. Может уже кто нибудь модуль написал с правильным .header`ом со всеми #ifdef #ifndef.... чтобы тупо хеадер поправить и все ок? спрашиваю чисто из интереса) подпиливание не напрягает, да и хочется посмотреть на чужой код, чтобы поправить свой, подчерпнуть идей, так сказать))))
Ставим плюсы: )
SSERG
Родился
Сообщения: 4
Зарегистрирован: Пн мар 21, 2011 22:31:30

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

Сообщение SSERG »

Доброго времени суток! Недавно приступил к освоению коннтроллеров,написал вот такой код для ATmega16. Подскажите как можно проще опрашивать много портов и сравнивать значения с другими портами,просьба сильно не пинать- это мой первый код! :oops:
исходник:
Вложения
pr1.c
(3.61 КБ) 314 скачиваний
Последний раз редактировалось SSERG Вт мар 22, 2011 22:52:15, всего редактировалось 3 раза.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

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

Простыни кода не надо вставлять в текст сообщения. И комментов мало.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
SSERG
Родился
Сообщения: 4
Зарегистрирован: Пн мар 21, 2011 22:31:30

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

Сообщение SSERG »

Извиняюсь исправил! :)
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

SSERG писал(а):как можно проще опрашивать много портов и сравнивать значения с другими портами
... прочитать порт можно и проще, зачем так все усложнять?
Ответить

Вернуться в «Разные вопросы по МК»