сколько задач одновременно может решать АТМЕГА УНО
- Войдите на сайт для отправки комментариев
У Атмега 328 Уно есть три таймера. два -8 битных и один 16 битный. В установки первого таймера лучше не вмешиваться, он связан с тактами процессора. Установки (второго) 16 битного можно менять для оптимизации ШИМ. Я на нем собрал ШИМ генератор "Fast PWM mode14" Третий таймер, как говорится, к вашим услугам...
Вышесказанное мною - это мое мнение..и оно под сомнением.
Хочу узнать мнение Гуру ---я прав или заблуждаюсь?
Почему у меня возник сей вопрос? Если я на 16 битном таймере сделал ШИМ-генератор, я им доволен,....и не хочу, чтоб какие-то "прерывания" в другом процессе испортили красоту его работы, могу ли я на оставшемся таймере собрать устройство которое будет с помощью шагового двигателя двигать задвижку воздуховода в зависимости от температуры?
Наверное... в общем, вопрос такой: позволят ли АТМЕГА УНО собрать: независимый Генератор ШИМ, и производить управление шаговым двигателем по показаниям аналоговых датчиков?
После запуска таймера на генерацию он становится полностью автономен и программа никак ему мешать не будет. Если не полезет в его регистры конечно.
Одновременно MK ATMega328 умеет выполнять ОДНУ задачу, если речь идет об обслуживании вычислительных процессов пользователя. Но он так же умеет красиво лежать на столе, что можно считать поставленной перед ним задачей. В таком случае одновременно выполняется две задачи.
Ответ на вопрос: МК не препятствует созданию вышеозначенной задачи, успех которой в большей мере зависит от перифирии и талантов создателя прошивки.
Наверное... в общем, вопрос такой: позволят ли АТМЕГА УНО собрать: независимый Генератор ШИМ, и производить управление шаговым двигателем по показаниям аналоговых датчиков?
Каждый таймер генерит свое прерывание. Два прерывания не могут выполнятся одновременно. Так что когда в какой-то момент прерывания от обоих таймеров совпадут - одно из них будет выполненно с задержкой. При правильном программировании можно свести эту задержку к минимуму (микросекунды или даже наносекунды). Но полностью независимыми они быть не могут.
А уж насколько критичны такие взаимные влияния в конкретном алгоритме - решать только вам.
Для работы ШИМ прерывания не нужны.
Для работы ШИМ прерывания не нужны.
ДА? - честно, не знал....
Ну, это, кстати, ещё вопрос - как этот ШИМ реализован ТС. Может он на ISR таймеру подвесился и за ноги дёргает врукопашную.
Ну, это, кстати, ещё вопрос - как этот ШИМ реализован ТС. Может он на ISR таймеру подвесился и за ноги дёргает врукопашную.
если честно, я считал что и встроенный PWM работает через прерывание по совпадению или переполнению, только ноги вручную дергать не нужно. И чтобы ШИм работал - прерывания должны быть разрешены.
Буду признателен, если кто-нибудь меня поправит.
если честно, я считал что и встроенный PWM работает через прерывание по совпадению или переполнению, только ноги вручную дергать не нужно. И чтобы ШИм работал - прерывания должны быть разрешены.
Буду признателен, если кто-нибудь меня поправит.
Код не мой и на просто С, но по нему хорошо видно, что для работы шим прерывания не нужны. В цикле меняют скважиность, если она постоянная, то основной цикл можно сделать пустым.
По этому коду никак не видно отсутствие прерываний. Тут используется регистр сравнения - как же он сравнивается со счетчиком без прерывания, кто это делает?
- если что, я не наезжаю, просто спрашиваю.
Это лучше димакс расскажет. Я помню, что вроде есть режим таймера, при котором МК сам ноги включает/выключает на переполнениях.
http://arduino.ru/forum/programmirovanie/pereklyuchenie-bitnosti-pwmshim...
Это лучше димакс расскажет. Я помню, что вроде есть режим таймера, при котором МК сам ноги включает/выключает на переполнениях.
тут все упирается в вопрос - нужны для этого режима прерывания или нет.
Прерывание, полагаю, генерится всегда - иначе это было странно с точки зрения архитектуры. Но пользовательский обработчик к нему не цепляется, поэтому оно должно отрабатываться быстрее.
Прерывание, полагаю, генерится всегда - иначе это было странно с точки зрения архитектуры. Но пользовательский обработчик к нему не цепляется, поэтому оно должно отрабатываться быстрее.
и тут мы возвращаемся к заглавному вопросу ветки. Если прерывания генерятся всегда - вызывает ли это задержки при совпадении по времени прерываний двух соседних таймеров? по мне так очевидно да, т.к. контроллер у нас один и он не может одновременно выполнить переключение двух независимых каналов. Или может?
По-моему единственный независимый механизм в 328-м камне - это WTD, остальное всё так же выполняется на основном ядре. Так что хоть на такт, но стоит ожидать задержки. Другое дело, что для шаговика это вообще не будет заметно.
Я помню, что вроде есть режим таймера, при котором МК сам ноги включает/выключает на переполнениях.
тут все упирается в вопрос - нужны для этого режима прерывания или нет.
http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-bl...
Залейте этот скетч и посмотрите осциллографом меандр на 9 ноге контроллера. И сразу будет ясно нужны прерывания или нет))
Уже опередили с ответом)))
По этому коду никак не видно отсутствие прерываний. Тут используется регистр сравнения - как же он сравнивается со счетчиком без прерывания, кто это делает?
Таймер устройство самодостаточное, ему не нужны прерывания что-бы что-то сравнить или поднять/опустить ногу. Эдакий контроллер в контроллере. Собссно и прерывать МК в полном смысле слова он не может, просто поднимает бит в регистре TIFR при совпадении счётчиков и в конце счёта, причём поднимает вне зависимости нужно нам это было или не нужно, т.е. теребит этот регистр всегда. А прерывание МК произведёт только если такой-же бит поднят в регистре TIMSK. Словно МК производит логическую операцию "AND" между этими двумя регистрами. TIFR&TIMSK = Если в результате "1" -то МК прыгает в нужный адрес.
Вы мух от котлет отделяйте. Надо разделять выставление прерывания и генерация. При разрешённом прерывании будет генериться и вызываться. Даже если нет пользовательского. В этом случае просто будет срабатывать заглушка и время на прерывание будет тратиться по полной. Если прерывание запрещено будет выставлятся флаг в регистрах таймера и его даже можно прочитать и сбросить но прерывания не будет.
Таймер устройство самодостаточное, ему не нужны прерывания что-бы что-то сравнить или поднять/опустить ногу. Эдакий контроллер в контроллере....
dimax
Спасибо огромное.
nik182 - и Вам тоже
расечатать?
1
void
setup
() {
2
pinMode(9,OUTPUT);
3
TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<WGM11);
4
TCCR1B=(1<<WGM13)|(1<<WGM12)|(1<<CS10);
//mode14 FastPwm
5
ICR1=65535;
6
OCR1A=32767;
7
}
8
9
void
loop
() {}
Регистром ICR задаёте до скольки считать(частота), регистром OCR1A задаёте на каком такте задирать лапу (скважность). Значения в скетче -частота 244 Герц, разрядность ШИМ 16 бит, дьюти 50%.
Здесь ведь нет прерываний?
Это же аппаратная генераця ШИМ? Здесь ведь частота и скважнсть задаются апаратно - с помощью настроек регистров на определенные действия?
Подтвердите мои предположения я и буду самым счастливым человком!
Ибо (я так думаю!) я смогу на остальных ресурсах МК програмно замутить АЦП для управления шаговым двигателем . Т.е у меня будет 1-процесс: генерация ШИМ на "регистрах", и второй - программа управления шаговым двигателем от АЦП. И они будут независимые. И если в программе управления шаговым двигателем посрдством АЦП будут прерывания - они не будут влиять на мой "регистровый" генератор ШИМ.
С уважением!
Ну, это, кстати, ещё вопрос - как этот ШИМ реализован ТС. Может он на ISR таймеру подвесился и за ноги дёргает врукопашную.
Да - да!
Наверное... в общем, вопрос такой: позволят ли АТМЕГА УНО собрать: независимый Генератор ШИМ, и производить управление шаговым двигателем по показаниям аналоговых датчиков?
Каждый таймер генерит свое прерывание. Два прерывания не могут выполнятся одновременно. Так что когда в какой-то момент прерывания от обоих таймеров совпадут - одно из них будет выполненно с задержкой. При правильном программировании можно свести эту задержку к минимуму (микросекунды или даже наносекунды). Но полностью независимыми они быть не могут.
А уж насколько критичны такие взаимные влияния в конкретном алгоритме - решать только вам.
(Горбачев-Ельцину): Борис. ты не прав! Коммунисты думают не так!
С уважением!
(Ельцын - Горбачеву): Панимаешь ли Alexsandr .. тут такое дело .. в общем, смотря что панимать пад задачей: Если это работа железяки (периферии) микроконтроллера, то в общем-та, оно могет работать вполне автономно, в частности таймеры. Задал режим в регистрах, он его и шпарит. В общем-та и Т0, с его millis() никуда не вперся. Его точно также можно пользовать, только "время" учитывать придется самостоятельно, опять же, ежели оно надо. Остальная часть периферии .. тоже способна работать в полуавтономном режиме по прерываниям: интерфейсы I2C, UART, SPI .. все это можно юзать в режиме "послал и забыл". Да даже и АЦП можна!
Тут ключевой вопрос: что считать "задачей". Можно даже на базе watchdog сваять вытесняющую многозадачность и имитировать "потоки" больших машин со всеми ихними симафорами, мутиксами и т.д. Главное чтобы .. не не памяти .. тяму хватало! 16Mips это практически IBM PC AT без сопроцессора.
Успехов. :)
А что такое вообще одновременность? При расстоянии между ножками микропроцесоора 1мм это где-то 3.3*10**-12 секунды, но учитывая длину проводников можно принять 10**-11 секунды. Это, наверное, максимальная одновременность этого мира. А Вам какая нужна?
Ему нужна другая. Более одновременная, чем 10вминус11-й
Ему нужна другая. Более одновременная, чем 10вминус11-й
Я стормозил где-то на порядок - в вакууме скорость света взял. 10 в минус 10
Можно, канеш, и мьютексы с семафорами замутить, да стек ахудеет.
Можно, канеш, и мьютексы с семафорами замутить, да стек ахудеет.
Не, ему нада оптический процессор замутить на брульянтах
Вопщем, задачи должны переключаться быстрее, чем эликтрон с s орбиты на p перескакивает.
Нада кварец пабольше.
Нада кварец пабольше.
Не - а , мы электрон на протон заменим и опаньки - все получится! Токма кварц от электронов защитить нада...
И, кстати:
- "Виртуальность этого мира не вызывает сомнения, поскольку есть люди (типа ТС), которые задаются вопросом одновременности процессов" - самоцитата.
Не - а , мы электрон на протон заменим и опаньки - все получится!
Не получится, протоны нынче в дефиците. Все свободные на адронный коллайдер забрали, разгоняют их там... Напишите им письмо, может и отсыпят немного протонов.
Не - а , мы электрон на протон заменим и опаньки - все получится!
Не получится, протоны нынче в дефиците. Все свободные на адронный коллайдер забрали, разгоняют их там... Напишите им письмо, может и отсыпят немного протонов.
Констатирую, с улыбкой от уха до уха: с всязи с отсутствием в продаже сободных протонов и нейтрино -ТЕМА ЗАКРЫТА.
Всем большой спасибо и легкого кода! С уважением!
Вы мух от котлет отделяйте. Надо разделять выставление прерывания и генерация. При разрешённом прерывании будет генериться и вызываться. Даже если нет пользовательского. В этом случае просто будет срабатывать заглушка и время на прерывание будет тратиться по полной. Если прерывание запрещено будет выставлятся флаг в регистрах таймера и его даже можно прочитать и сбросить но прерывания не будет.
Какого пользовательского, какая заглушка, какой по полной? Бредите или пятница?
Может быть iret что сидит по адресам 0х0014-0х001А для первого таймера?
Разрешил прерывание, а обработчик написать забы(и)л.
Так называемый "BADISR_vect", который, если его не использовать (то есть не написать обработчик), будет перекидывать на нулевой адрес FLASH, т.е. на вектор RESET.
Хрен там, будет переинициализация контроллера.
Считаю, что закрывать не стоит. Вопрос продолжил существовать вне зависимости от интереса топикстартера.
По неиспользованным векторам GCC ставит bad_interrupt (jmp 0), со всеми вытекающими.
Вот и включайте прерывания "по полной программе."
А если так:General options->System->Initialize unused interrupts vectors with RETI= TRUE ?
Как настроим так и поедем. Но в изначальном случае вы правы.
Я всегда предполагал, что вектор прерывания направлен в мою душу. А тут я получил энтому полное подтверждение...
А если так:General options->System->Initialize unused interrupts vectors with RETI= TRUE ?
Как настроим так и поедем. Но в изначальном случае вы правы.
Это в IAR? Но он то здесь каким боком?
Я начинал програмировать avr когда ардуины ещё не было. А iar был. Знания работы железа с тех пор. Всегда функция reti была включена чтобы не сбрасываться при отладке. Новые времена - новые нравы.
Даже если вы умудритесь поставить заглушку в векторе (с GCC это не просто), все равно время исполнения будет совсем не по полной - вызов и сразу же возврат. Если же оформите даже пустой обработчик, тогда уже будет минимальный пролог/эпилог. А по полной будет когда в обработчик вставите функцию - получите приличную портянку кода.
А кто мешает так:
Никто. Вот это и есть пустой обработчик. Там даже reti не нужен. Читайте то что процитировали. Но вы уже фишки GCC начали использовать.
Читаю:
Для этого и есть параметр ISR_NAKED
А вот фиг там, нужен. Цытата из справочника AVR-libc:
ISR is created with no prologue or epilogue code. The user code is responsible for preservation of the machine state including the SREG register, as well as placing a reti() at the end of the interrupt routine.
К тому же не поленился дизассемблировать код с RETI(); и без. Если самому не написать RETI(); то после обработчика программа пойдет по следующему адресу за обработчиком.
Так они же входят в стандартный комплект ArduinoIDE.
П.С. Вопрос стоял в том что же делать с "нежданчиком" (незапланированным прерыванием), чтобы не сбрасывался контроллер. Выше приведенное решение самое простое для arduinoIDE.
П.П.С. Забыл я чето, про еще более простое решение, всего одна строчка:
Не, не, не. Я спорить с вами не буду. Потому что вы свегда правы. Кто захочет, тот почитает историю из за чего спор. И сделает выводы. Удачи!