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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сб сен 29, 2018 20:16:10

BOB51 писал(а):Достаточно добавить внутри открытого прерывания команду разрешения
Как я писал чуть выше, чуть более правильно будет объявить прерывание с соответствующим флагом, например ISR (PCINT2_vect, ISR_NOBLOCK). При этом компилятор сам постарается разрешить (прочие) прерывания при входе в обработчик как можно раньше. По крайней мере, по сравнению с обычным неблокирующим объявлением типа ISR (PCINT2_vect) + разрешением внутри него.

Для очень редких прерываний (таких как ежесекундное от RTC) такой подход (вложенность прерываний даже на AVR) вполне имеет право на жизнь.

Естественно, я говорю про стандартную связку gcc + avr-libc, а не про прочие маргинальные компиляторы (вещи в себе). Хотя, может и там где-то предусмотрено что-то подобное. Никогда особо не интересовался.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сб сен 29, 2018 21:03:11

WiseLord писал(а):Низкоприоритетному прерыванию (секунды) можно включить флаг ISR_NOBLOCK
С каких пор AVR аппаратно поддерживают вложенные прерывания? Эта возможность появилась в более новых МК например с ядром ARM. :) У многих из них есть встроенный RTC и внешний не нужен. :)
очень уместное упоминание в теме про ассемблер AVR. Кстати, в "новых" ваших ARMах вложенные прерывания с приоритетами появились примерно спустя 25 лет после того, как они были реализованы в i8051

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 06:22:23

...

Естественно, я говорю про стандартную связку gcc + avr-libc, а не про прочие маргинальные компиляторы (вещи в себе). Хотя, может и там где-то предусмотрено что-то подобное. Никогда особо не интересовался.


Речь идет о "чистом ассемблере" (avrasm2), а не о том варианте, что в Си применяется.
Ибо Сишный - то дело темное и требующее настроек компилятора в придачу. Кои весьма муторны для начального освоения.
В ассемблере в чистом виде все распределение ресурсов и работа с разрешением/запретом прерываний (в том числе и их объявление - прописывание самих подпрограммок с указанием в нужных местах ПЗУ соответствущих векторов перехода) делает автор программы САМОСТОЯТЕЛЬНО.
Автору же и решать можно чего вложить или нет - никаких ограничений /контроля про времени исполнения/наложению программ при их исполнении в готовом устройстве компилятор не выполняет. Проверяется только корректность мнемоник команд, директив и границы размещения кода/данных.
В том есть и свои плюсы и свои минусы.
:beer:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 09:38:23

Да, Вы, наверное, правы. Я как-то сразу не обратил внимания на то, что тема-то про ассесблер. Хотя, всё равно имею мнение, что лучше привязаться к gcc, как чему-то относительно стандартному. Хотя это скорее полезно для возможности делать смешанный программы - что-то требовательное к ресурсам делать на ассемблере, а основную логику программы - на том же C.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 10:23:22

WiseLord писал(а):что-то требовательное к ресурсам делать на ассемблере
С учетом того что по цене AVR можно купить более производительные микроконтроллеры (32-ух битные и с большей тактовой частотой) логично их использовать для задач требовательных к ресурсам и писать на ЯВУ без асм вставок. :) Но если просто хочется поиграться, то никто же не запрещает это делать пытаясь оптимизировать программу и неделями, а то и месяцами думая как ускорить выполнение на несколько тактов. :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 11:27:02

по цене AVR можно купить более производительные микроконтроллеры (32-ух битные и с большей тактовой частотой)

Назовите хотя бы один 32-х битный МК по цене ATTiny13A и тоже в SOP-8, так как габариты имеют значение.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 12:00:40

ATTiny13A для очень простых задач. Размеры флеша и ОЗУ (всего 64 байта) и возможности периферии, а также число выводов не позволяют что-то нормальное сделать. Посмотрим на это с другой стороны. Допустим есть STM32F030F4P6. Его характеристики.
Если кратко, стоимость в Китае около 0.5$. Корпус TSSOP20 (20 выводов), 32-ух битное ядро ARM, тактовая частота 48 МГц, 32 КБ флеша, 4 КБ ОЗУ, 12-ти битный АЦП, 7 таймеров (ШИМ, захват, ШИМ захват, поддержка энкодера и датчика холла, события запуска АЦП, объединение таймеров в цепочки и многое другое), 5 из которых 16-ти битные, один 32-ух битный и еще один системный 24-ех битный, USART, I2C, SPI, RTC, CRC, DMA (по русски ПДП - прямой доступ к памяти) 2 сторожевых таймера и т. д. Поддержка отладки. Отладчик ST-Link в Китае стоит 100 рублей. МК поддерживает выполнение кода из ОЗУ, куда можно перенести так же таблицу векторов прерываний. А еще фьюзов нет. Все настраивается программно. :) Например можно во время работы переключится с внутреннего RC генератора на внешний кварц или наоборот. Можно программно разогнать МК. :) http://purebasic.mybb.ru/viewtopic.php?id=583
Назовите мне модель МК AVR обладающую подобными возможностями и стоящую не больше чем 0.5$?

Замечу это самая простая модель. У других возможностей еще больше.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 13:49:22

А потом "после очередной порции САНКЦИЯ" народ воет об импортозамещении и невозможности "спрыгнуть" с троянского коня/дармового сыра...
:)))
Кстати... МК не только для инета и вай-хай применяются.
Одно из самых частых применений даже названием целого семейства стало "Периферийные интерфейсные контроллеры" (проще PIC).
Только о таких вариантах применений чего-то "давно позабыли" - все стремится народ в единственный кристалл все задачи впихерить, а вот насчет распределенной многокристальной схемотехники уже даавненько подзабыли.
Как собственно и об "чистом ассемблере" - компиляторе, который именно под такие варианты максимально приспособлен.
8)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 14:38:44

Низкоприоритетному прерыванию (секунды) можно включить флаг ISR_NOBLOCK, тогда оно будет прерываться другими. Фактически, то же самое, что Вы сделали, но, что ли, чуть правильнее

А как это сделать?

Добавлено after 50 seconds:
И не надо вообще входить в прерывание по секунде, а просто опрашивать его в фоне, и вычитывать по I²C и сбрасывать запрос на прерывание.

Опрашивать прерывание в фоне - это как? Или Вы имеете ввиду, в фоне опрашивать RTC?

Добавлено after 6 minutes:
Замена данных в буфере отображения/вывода ВСЕГДА производится в конце текущей строки развертки при погашенной индикации (тогда и "дерготни" не будет)
А глазу наблюдателя смена показаний что на 0,016 секунды раньше, что на такое же время позже АБСОЛЮТНО БЕЗ РАЗНИЦЫ.
8)

Хорошая идея! Вот только как синхронизировать прерывания от таймера и внешние прерывания?

Насчет "глючения" в разные относительно длинные и неравномерные интервалы времени - это к гадалкам.
Обычно нормально написанная программа таких дефектов не имеет.

Да уж, это точно) Решительно не могу понять, как процессор перепрыгивает в самое начало программы. которое вообще не должно повторяться. Там помимо начальной инициализации портов и периферии на индикаторы выводится 1234, затем rjmp PC и дальше работа на прерываниях. Но каким-то образом раз в несколько часов на индикаторах снова появляется 1234 и время перестаёт считываться из RTC.


Кстати... обычно чтение ВСЕХ данных из RTC делается или однократно при запуске устройства по подаче питания или только по "жизненной необходимости" (включая коррекцию данных").
В остальное время работает модуль "внутренних часов" в самом МК с приращением от ежесекундного прерывания от RTC.
Остальные программы подбираются с учетом секундного интервала - должны или вписыватся в него или "дробиться" на участки менее 1 секунды.
:wink:

Если подсчётом времени занимается RTC, то зачем программно считать время? ИМХО, проще с некоторым интервалом читать время из RTC.

Добавлено after 2 minutes 59 seconds:
А 500 герц считаю слишком много, для динамики имхо, хватило б и 100. Тогда и не надо будет разрешать прерывания в прерывании.

500 Гц - это потому что 5 индикаторов (часы, минуты и посередине разделительный символ мигает раз в секунду). Т.е. цикл повторения индикации как раз 100 Гц.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 15:12:24

Поднимать частоту выше 62 Гц смысла особого нету, ибо все-таки нужен компромисс между минимальной скоростью развертки и спецификой восприятия глаза.
Синхронизация процессов собственно динамической развертки и внешних выполняется посредством флагов пользователя и буфера отображения в конце обработки текущей строки.
Опрашиваем флаги и, при необходимости, меняем содержимое буфера отображения содержимым из буфера предподготовки данных.
В принципе.. у АВРок на основе таймера Т1 и его прерываний можно превосходный контроллер динамической развертки организовать. При том, что он будет функционировать параллельно основному процессу.
Касательно RTC и "внутреннего счета времени" - при нежелании особо закапываться в организацию внутренней "сетки синхронизации" удобно использовать только начальную загрузку данных в часы, а приращение и обработку данных вести по прерываниям. Затраты времени на обмен в таком случае исключаются, что облегчает функционирование остальных, критичных ко времени участков программы.
Насчет "перепрыгов"...
В МК существует аппаратный модуль, который в момент возникновения разрешенного прерывания соответствующего приоритета автоматически загружает в стек адрес возврата и выполняет команду LCALL на адрес вектора данного прерывания.
А вот "спасение" в стеке SREG и прочего критичного содержимого регистрового файла - это уже забота автора программы (как и корректный возврат из прерывания).
:beer:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 15:46:18

ATTiny13A AVR?

Да, AVR. Загляните в даташит. "High Performance, Low Power AVR® 8-Bit Microcontroller"
ПростоНуб писал(а):Назовите хотя бы один 32-х битный МК по цене ATTiny13A и тоже в SOP-8, так как габариты имеют значение.

Сначала давайте закончим с Вашим утверждением. А потому уже, если я захочу, сменим тему.

Добавлено after 6 minutes 5 seconds:
Назовите мне модель МК AVR обладающую подобными возможностями и стоящую не больше чем 0.5$?

А почему я должен на этот вопрос отвечать? Я разве где-то утверждал обратное?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 16:18:19

буфера отображения в конце обработки текущей строки. :beer:
Сейчас сделал так: запретил внешние прерывания до тех пор, пока счётчик циклов индикации не дойдёт до 5 и запретил вложенные прерывания (убрал SEI в прерывании от RTC). Т.е. теперь внешнее прерывание возникает только в конце цикла индикации. Всё равно индикация дёргается :( В общем, обработчик внешнего прерывания должен выполняться гораздо быстрее. Не буду опрашивать RTC каждую секунду и, наверное, подниму тактовую частоту (щас у меня по дефолту 1 МГц от встроенного RC)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 17:00:34

Гефестион,
"500 Гц - это потому что 5 индикаторов (часы, минуты и посередине разделительный символ мигает раз в секунду). Т.е. цикл повторения индикации как раз 100 Гц."
Разделительный символ это часом, не Н сегмент единиц часов?
Считаю, что достаточно для 4х знакового индикатора обновлять инфу каждые 10 мс. В прерывании гасим индикатор полностью, выбираем следуещее знакоместо и инфу, которая должна быть на него выведена. А теперь включаем индикацию и сваливаем из прерывания. У Вас мк перегружается, как я понял, так есть регистр кажется MCUCSR, не помню, но там есть инфа, от чего пошли на ресет.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 17:07:22

А вот врать не нужно! Вы процитировали свои слова под моим ником.

Я не врал, а подумал, что Вы это утверждение поставили под сомнение, раз его отквотили. Если это не так - тем лучше.

Я писал о другом

Именно! Вы писали:
по цене AVR можно купить более производительные микроконтроллеры (32-ух битные и с большей тактовой частотой)

Вот и докажите свое утверждение.
Назовите хотя бы один 32-х битный МК по цене ATTiny13A и тоже в SOP-8, так как габариты имеют значение.

И только после этого сменим тему и будем обсуждать, какой из STM32 потребляет в режиме ожидания прерывания 150 наноампер, как ATTiny13 :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 17:19:32

По вашему AVR это только ATTiny13A и все? Других вы не знаете? Я много раз писал
Речь о том что при одной той же цене, у МК других производителей гораздо больше начинки. :)
Вы же прицепились к самому примитивному МК после ATtiny10.
Какие самые популярные и часто используемые МК AVR среди любителей? ATTiny13A или что-то типа ATmega8 или ATmega328?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 17:24:44

Гефестион,
"500 Гц - это потому что 5 индикаторов (часы, минуты и посередине разделительный символ мигает раз в секунду). Т.е. цикл повторения индикации как раз 100 Гц."
Разделительный символ это часом, не Н сегмент единиц часов?
Не, у меня там лампа, которая поочерёдно показывает символы > < :)
My nixie clock.jpg
(149.44 KiB) Скачиваний: 232

Да, неравенство неверное получилось :)))

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 18:42:43

62Гц это плохо, даже на такой частоте ЗАМЕТНО мерцание, я бы вообще делал 200Гц. После 200Гц все остальные часы кажутся дико мерцающими.
Я вот одного не могу понять, зачем в такой простой задаче вложенные прерывания? Неужели, I2C часы не могут дать сигнал на прерывание в начале каждой секунды? Тогда значение времени в часах в ближайшее время точно будет стабильным - дождаться начала развёртки, считать данные разложить их в буффер вывода и поехали дальше... до следующей секунды.
Я на тиньке делал прерывания с частотой 48кГц(@4.8Мгц такт), и ещё 50% времени оставалось на основной код. Так что 500Гц прерывания это мелочи, можно и больше. Советую в качестве пробы, поднять частоту обновления экрана до 200Гц и сравнить с 60-тью. Не просто смотреть на часы в упор, а периферийным зрением.

STM32F030F4P6 стоит примерно в два раз дороже чем ATTiny13A, но при этом в нем в 32 раза больше флеша, в 64 раз больше ОЗУ. Тактовая частота в 3 раза выше. Ядро 32-ух битное, а не 8-ми битное.

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 19:05:08

про частоту - поддерживаю
в машину делал >600гц регенерации (8МГц/8/256/6знаков), светит практически ровно и не отвлекает.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 20:13:15

Alexeyslav писал(а):Зачем это всё?
Сейчас обсуждаем динамическую индикацию. А знаете ли вы что ее можно сделать полностью аппаратной (без прерываний)?
Если интересно как, смотрите. http://www.cyberforum.ru/blogs/204791/blog5170.html
http://www.cyberforum.ru/blogs/204791/blog5169.html
Если кратко, таймер по переполнению запускает DMA (по русски ПДП - прямой доступ к памяти), который копирует в кольцевом режиме данные из памяти и порт ввода/вывода.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс сен 30, 2018 20:21:04

DMA

Прочитайте название темы! При чем тут DMA?
Вам бы сильно понравилось, если бы на вопрос, как проехать куда-то, Вам бы посоветовали припарковать свой автомобиль и вызвать такси? Ведь удобней ехать пассажиром, чем самому крутить баранку ;)
Ответить