Освоение Атмеги или кипит наш разум

sht0p0r
Pavel_E:

#asm(“sei”) //какой-то рудимент, оно тут нужно?

это асемблерная вставка в с достаточно sei();// разрешение прераваний
cli(); соответственно запрет
DDR регистр на выход
правильно поставить WGM
больше ничего ненадо.

Pavel_E

Всё, поставленные задачи выполнены и перевыполнены. Всем участникам спасибо за помощь в понимании этого безобразия! Особенно тов. Штопору - за деятельное участие и вне рамок данного форума.

Итак, МК умеет:

  • брать сигнал от приемника по двум каналам;
  • расшифровывать и переводить в значение длительности импульсов в мкс;
  • обрабатывать (в моем случае - нормировать в диапазон 1000…2000мкс);
  • усреднять значение по одному из каналов и выводить на четырехразрядный светодиодный цифровой индикатор;
  • генерировать сигнал на двух каналах.

Как обещано, выкладываю исходник на С для конструктивной критики.
Тов. MSV, будешь код контроля акков прикручивать?

servo_control.rar

msv

Что явно бросилось в глаза -

  • запрещать прерывания в конце обработчика нет необходимости.
  • индикацию лучше полностью перенести в фоновый цикл.
    Я немного другую задачу ставлю, для начала полноценный декодер.
    За паяльник пока не брался, а код в принципе на скору руку слепил, в VMLAM уже трудится. Программно нарощенным таймером0, замеряю импульсы PPM с отбраковкой явной фигни (шума). Усредняю и по готовности от приема корректного кадра или по тайм-ауту, генерю канальные импульсы с помощью TIM1 поочередно на 8 каналов. Но это так, баловство… Идеи, сколько интересного можно замутить, пока явно опережают исполнение… 😃 В перспективе это будет супер-декодер (конечно с fail-save, поисковая сирена, контроль акков, вывод дискретных сигналов в натуральном(дискретном) виде, вывод аналоговых каналов в виде ШИМ, возможность установки замедления по каналам, да там глядишь и хотя бы простенький логер итд итп). Все это конечно будет конфигурироваться с компа спец. софтом, ну для начала по RS232.
    Пока не слишком много времени заниматься этим проектом (а будет еще меньше 😦), но если сотворю- продам за бешенные бабки китайцам… 😃
Pavel_E
msv:

Что явно бросилось в глаза -

  • запрещать прерывания в конце обработчика нет необходимости.
  • индикацию лучше полностью перенести в фоновый цикл.

Мерси за коммент! Индикация недоработана сознательно - буду адаптировать под конкретные задачи, это так база. В пределе она должна уметь автоматом выводить числа со знаками и плавующей точкой, символы… Только не нужно пока, а вычислений добавляется.

А каков смысл переноса индикации в фоновый цикл? Т.е. в обработчик прерывания, да? Что так, что так будет ресурсы отжирать. Только в основном цикле программы это можно делать хоть раз в секунду, а таймер крутится сильно быстрее. Сейчас у меня по таймеру только переключение светящихся светодиодов. А вычисления какому диоду светиться делаются в программе. Если вычисления опоздали, ну и ладно, второй раз то же число отобразится, никто и не заметит.

msv

Да нет…, фоновый цикл это и есть основной цикл проги. Туда и пихаются все фоновые задачи (не критичные к времени реакции/исполнения). Дело в том, что даже разрешив прерывания в начале обработчика прерывания, несколько тактов (лень смотреть сколько) проц будет с запрещенными прерываниями. В принципе ничего страшного, но если можно это избежать, то лучше и не делать.

Pavel_E
msv:

В принципе ничего страшного, но если можно это избежать, то лучше и не делать.

Да, пожалуй. Каждый оборот основного цикла может переключать знакоместо. И таймер можно для других целей освободить. Хороший коммент.

Nick_Shl
msv:

разрешив прерывания в начале обработчика прерывания

А вот с этим надо быть очень аккуратным! Если прерывание не успеет обработаться до возникновения его самого, и условия не изменятся - пожираем стек и падаем…

msv

Да, еще… длинный код в обработчике можно выполнить примерно так:
PORTA=led_str[tim2cnt];
PORTB&=0xf0;
PORTB|=1<<tim2cnt;
if(++tim2cnt>=4) tim2cnt=0;
Ну это, так… косметика…

Pavel_E
Nick_Shl:

А вот с этим надо быть очень аккуратным! Если прерывание не успеет обработаться до возникновения его самого, и условия не изменятся - пожираем стек и падаем…

Провел эксперимент. Засунул в прерывание delay_ms(100) - т.е. задержку примерно на 40 циклов запуска этого прерывания. Все равно работает, зараза! Глотает другие прерывания, мерцает диодами, но машинками худо-бедно управляет. Как объяснить сей феномен?

msv:

Да, еще… длинный код в обработчике можно выполнить примерно так: PORTA=led_str[tim2cnt]; PORTB&=0xf0; PORTB|=1<=4) tim2cnt=0; Ну это, так… косметика…

Да, думал я это автоматизировать. Только все получались какие-то громоздкие и долгие конструкции. PORTB&=0xf0; в голову не приходило, мерси.