Обсуждаем контроллеры компании Atmel.
Ответить

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 11:41:22

COKPOWEHEU писал(а):не знаю чем вам так не нравятся прерывания и буферы
да почему не нравятся? каждому овощу своё время! нужно - я и буферы делаю, и автоматы и все прочее. только чаще всего это не нужно. мне не нужно. и я подозреваю, многим другим тоже.

любая непоследовательная обработка сложна в понимании. может ли кто снаскоку понять, как работает чужой автомат конечных состояний? не может. иной раз и после долгих размышлений не получается. а при моём подходе программа получается - читай идентификаторы, и инструкция не нужна. все последовательно, все просто, наглядно. откуда что берется - видно и без размышлений.
ну и к чему тогда так стремиться к этому автомату, тем более что никаких ценных преимуществ в большинстве случаев он не даёт?!

Добавлено after 8 minutes 39 seconds:
я вот вспоминаю один недоделанный мной проект... с GSM-модемом. поначалу я тоже озаботился кольцевыми буферами для обмена с ним... но потом внезапно (!) выяснилось, что модем этот имеет обыкновение отвечать на запросы спустя какое угодно время - может через 1 миллисекунду, а может и три секунды подождать перед ответом. и обмен с ним получается не очень-то логичным: нельзя в буфер выбрасывать следующую команду, не получив отчет о исполнении предыдущей. и сразу все кольца аннигилируются, т.е. все преимущества типа отправил и делай следующее превратились в тыкву. зато читать из кольцевого буфера тот еще геморрой: из линейного можно сразу обрабатывать при помощи всяких strcpy и тому подобных atoi, а с буфером будь добр сначала вычитать в отдельный буфер принятую строку... мало того, что СМС может прийти хрен знает какой длины и кольцевой буфер переполниться может, так еще и не прочитать никак быстро и удобно!

и как-то само собой получилось то, что я и говорил ранее: прием от GSM-модема по прерываниям (в линейный буфер!) с установкой флага принятых данных, а отправка в модем - при помощи блокирующего printf. и оно отлично работает! размер СМСки, правда, все равно острый нож, но остальное - спокойно и без напрягов.

Добавлено after 10 minutes 38 seconds:
из "многозадачной" темы лучшая моя находка - это массивы функций без явного описания массивов :) я писал как-то об этом - при помощи скрипта линкера появляется возможность в любом месте программы описать функцию/структуру, и она попадет в определенный массив, где может быть обработана среди прочих единожды написанным кодом. вот это мне реально помогает, упрощая программирование в разы! на этом же принципе и программные таймеры делаю.
удобство чисто в написании кода - но для меня оно важнее, чем "истинная" параллельность и высвобождение ресурсов МК

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 18:41:00

массив функций это же просто массив указателей
и одна и та же функция может иметь переменное число аргументов
так же? а то я уже подзабыл

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 19:49:18

slav0n, ответ на твой вопрос написан здесь, читай страницу полностью, он подробно разжевал.

COKPOWEHEU, на счет кольцевых буферов, а где у него начало и где конец, как определять?
Допустим такие модули, как GPS NEO-Mx имеют только идентификатор начала сообщения, конца не имеют.
Не все МК имеют прерывание по определенному символу.
Хотелось бы увидеть реализацию на кольцевых буферах командной оболочки? Не просто a b c, а к примеру, asd fgh, да еще и с передаваемым параметром.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 20:20:30

COKPOWEHEU, на счет кольцевых буферов, а где у него начало и где конец, как определять?
Так ведь кольцевые буферы на то и кольцевые чтобы не иметь фиксированного начала. С одной стороны добавляем, с другой вынимаем.
Допустим такие модули, как GPS NEO-Mx имеют только идентификатор начала сообщения, конца не имеют.
Точно? Разве не по концу строки сообщения разделяются?
Не все МК имеют прерывание по определенному символу.
Из тех, с которыми я работал - ни один. Но, кстати, на AVR добавление флага обнаружения символа не сильно замедлит - все равно там каждый байт вручную считывать приходится.
Хотелось бы увидеть реализацию на кольцевых буферах командной оболочки? Не просто a b c, а к примеру, asd fgh, да еще и с передаваемым параметром.
Да, мне тоже. Есть у меня в планах реализовать кое-что именно с подобным функционалом, но пока других предварительных задач хватает.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 20:44:16

COKPOWEHEU писал(а):Точно? Разве не по концу строки сообщения разделяются?
Возможно, не помню, надо смотреть, я парсер делал по началу сообщения, а там специальный символ шел.
COKPOWEHEU писал(а):Но, кстати, на AVR добавление флага обнаружения символа не сильно замедлит - все равно там каждый байт вручную считывать приходится.
Если рассматривать в моем примере:asd fgh, то мы можем только конец строки определить.
Примитивное редактирование строки.
+ куча лишних переменных на начало строки, на длину строки, на конец строки.
Больше возни, чем пользы. Как говорится, а лишь бы было.
COKPOWEHEU писал(а):Да, мне тоже.
Значит пока ни кому не удалось это реализовать.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 22:41:59

Значит пока ни кому не удалось это реализовать.
Не знаю, специально я не искал.

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 23:08:05

уважаемые знатоки, помогите пожалуйста решить задачку, поскольку запутался я в разного рода кодировках и до конца не осознаю истину.
я патаюсь вывести на терминал через юарт спецсимволы, в данном случае знак градуса
как это сделать просто ?
вот мой код
Код:
   sprintf(buf, "\x80 \r\n ");
   uart_send_string(buf);

заранее благодарю !

Re: Нескольно простых вопросов о программировании AVR на Си.

Ср дек 01, 2021 23:33:24

Уверен, что этот терминал спецсимволы в принципе умеет показывать?

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт дек 02, 2021 00:32:42

А почему вы тогда выводите 0x80? Гугл говорит, что знак градуса 0x00B0, и код printf("\u00B0 \r\n "); выводит его правильно.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 05, 2022 11:49:59

Столкнулся со странной ситуацией. Контроллер ATMega8. Тактование внутреннее. Всё собрано на макетке. На пинах вывода светодиоды через токоограничивающие резисторы, на пинах ввода кнопки с подтяжкой к минусу через резисторы 10 ком. В главном цикле вращалась функция моргания светодиодика и всё было нормально. Все работало сообразно ожиданиям. Но тут я удалил из главного цикла функцию моргания светодиодика и начались чудеса.
Кнопки перестали опрашиваться. Точнее я не знаю что именно перестало работать. Судя по светодиодику на PC5 прерывание по таймеру отрабатывает. Но на нажатие кнопок схема не реагирует. После возврата функции моргания светодиода реакция на кнопки восстановилась. Далее путем некоторого количества экспериментов выяснил что в главном цикле кроме if нужна еще хоть какая-то команда чтобы кнопки реагировали. Хватает даже _delay_ms(0); Просто лишней ";" мало. На ";" реакции нет. В общем вот код программы. Работоспособные участки, на функциональность которых ситуация не влияет я повырезал.



Если в главном цикле закомментировать строку с _delay_ms(0); реакция на кнопки пропадает. Объяснить такое поведения у меня не получилось. Стало просто интересно в чем причина такого поведения контроллера.

На всякий случай, пишу в МК через USBAsp вот команды компиляции и записи:
avr-gcc -mmcu=atmega8 -Os Example.c -o Example.o (в каталоге: /home/user/Projects/Example)
avr-objcopy -j .text -j .data -O ihex Example.o Example.hex (в каталоге: /home/user/Projects/Example)
avrdude -c usbasp -p m8 -P usb -U flash:w:Example.hex

Вывод avrdude:



Upd.

При попытке добавить вместо _delay_ms(0); пустой функции или просто i++; или asm("nop"); к адекватному поведению МК не возвращает. :shock:
Последний раз редактировалось Retrograd Пт авг 05, 2022 12:12:09, всего редактировалось 1 раз.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 05, 2022 12:02:01

Я бы сделал "New_key_status" volatile. Да и вообще, всегда всё что пишется/читается и в прерывании, и в основном цикле, должно быть volatile. Без этого, скорее всего, компилятор просто выбрасывает всю начинку основного цикла, т.к. проверка (if) всегда с его точки зрения даёт нулевой результат.

Наоборот, интересно, почему код работает при включении задержки. Должен, по идее, точно так же не работать.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 05, 2022 12:14:50

Я бы сделал "New_key_status" volatile. Да и вообще, всегда всё что пишется/читается и в прерывании, и в основном цикле, должно быть volatile. Без этого, скорее всего, компилятор просто выбрасывает всю начинку основного цикла, т.к. проверка (if) всегда с его точки зрения даёт нулевой результат.

Наоборот, интересно, почему код работает при включении задержки. Должен, по идее, точно так же не работать.

Спасибо. Думаю что я понял в чем дело.

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 05, 2022 15:34:58

Кто знает точность внутренней опоры attiny24, в зависимости от температуры ?

Re: Нескольно простых вопросов о программировании AVR на Си.

Сб авг 06, 2022 10:43:57

кроме даташита - никто.

Re: Нескольно простых вопросов о программировании AVR на Си.

Сб авг 06, 2022 12:05:00

Atmel-7701_Automotive-Microcontrollers-ATtiny24-44, стр. 159
Absolute accuracy (Including INL, DNL, quantization error, gain and offset error),
Single-ended conversion VREF = 4V, VCC = 4V, ADC clock = 200kHz -> 2..4 LSB bits (–40°C to +125°C)

Re: Нескольно простых вопросов о программировании AVR на Си.

Вс авг 07, 2022 00:42:21

Atmel-7701_Automotive-Microcontrollers-ATtiny24-44, стр. 159


Спасибо, я там ещё график нашёл неподалёку

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 12, 2022 00:57:28

Товарищи коты, а подскажите, пожалуйста!
Я особо не заморачивалась форматным выводом данных на дисплейчики посредством МК. В основном, хватало целое вывести в несколько знакомест с лидирующим пробелом или без оного.
А есть ли что то, позволяющее сформировать строку в буфере из целых и вещественных переменных, с комбинированием с символами по заданному формату, как это делает printf ?

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 12, 2022 07:16:33

есть такое, sprintf называется

Re: Нескольно простых вопросов о программировании AVR на Си.

Пт авг 12, 2022 09:46:09

ARV, спасиба.

Re: Нескольно простых вопросов о программировании AVR на Си.

Чт сен 29, 2022 21:18:19

А кто подскажет, в голом Си (на МК) реально отловить деление на ноль, не проверяя делитель перед делением?
try... catch вроде ж только для плюсов....

Добавлено after 37 minutes 19 seconds:
ну и другие ошибки, типа корня из отрицательного числа...
Ответить