AVR. Как проснутся по UART

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

AVR. Как проснутся по UART

Сообщение Волосатый »

Есть острая необходимость разбудить контроллер Atmega48 ( или 8 ) из режима power-off командой из UART. Знаю, что стандартными средствами это сделать невозможно.
Может каким-нибудь образом подключить вход данных на ножку INT0 к примеру, и просыпаться как с обычного внешнего прерывания, и сразу отключать сиё прерывание, а перед спячкой его снова взводить...
Вот только вопросец - а успеет ли это прерывание захватить скажем, команду 0xFF или 0xFFFF ?
Или может есть другой способ?
Опыт приходит сразу после того, как он был нужен...
Реклама
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Re: AVR. Как проснутся по UART

Сообщение asteroid7 »

Тупо запараллелить ноги RXD и INT0. INT настроить по низкому уровню.
"успеет ли это прерывание захватить" - зависит от CKSELx, SUTx и скорости UART. В ДШ есть таблицы времянок запуска генератора.
Реклама
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

Re: AVR. Как проснутся по UART

Сообщение Волосатый »

А время срабатывания INT по низкому уровню в режиме power-off такое же, как и в обычном рабочем, и равно ~50 нс ?
Опыт приходит сразу после того, как он был нужен...
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

Re: AVR. Как проснутся по UART

Сообщение Волосатый »

В продолжение темы "предчуствие граблей". Сами грабли...

В устройстве используется USART вместе с режимом сна ADC noise reduction. Проблема в том, что МК большую часть своего времени циклично оцифровывает сигнал и делает с ним что-то, выходя по прерыванию из сна ADC noise reduction. Во время этого "сна" к МК может придти байт по USART'у. МК просыпается, отключает ADC, и ждет пока завершится прием. Но. судя по всему из-за задержки на выведение из сна, происходит рассинхрон и МК получает мусор: в старшем разряде появляются 2-3 "левых" единицы (двоичное исчисление) и выходит байт как бы смещен вправо а пустота заполнена единицами.

Каким способом этого можно избежать?
Опыт приходит сразу после того, как он был нужен...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: AVR. Как проснутся по UART

Сообщение md5sum »

Судя по ДШ USART ждет стартового бита - ждет именно спада из 1 в 0, а не состояния 0 на линии.
Естественно этот спад пробуждает МК, но USART его не видит и принимает за старт первый нулевой бит.
Мне видится два варианта решения:
1. Если обмен ведется ограниченным набором кодов (ASCII например), то перед посылкой байта команды посылать символ пробуждения (преамбулу) с кодом отличным от набора.
2. Реализовать полностью программный прием байта - задача не сильно сложная, особенно если скорость обмена не шибко высокая. В этом случае, по "просыпанию" программа уже знает, что пришел START и просто получает биты в соответствии с алгоритмом. За основу можно взять и описанный в ДШ.

На скорости 9600, я не заморачивался многократными выборками, а просто раз в период считывал состояние линии. Правда в моем случае пакет передавался с контрольной суммой и в случае ее несовпадения программа безболезненно игнорировала пакет.
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

Re: AVR. Как проснутся по UART

Сообщение Волосатый »

Проанализировав еще раз отправленные в МК и принятые им байты я пришел к выводу, что вы правы. Чистый прием начинается со следующего бита после 1-0...
"Символ пробуждения" отправлять это впринципе можно накоддить, но терминалка в протеусе не позволяет отправлять два байта без паузы между ними.
И я так понял, что бы МК не запутался, нужно посылать конкретное числ 0111 1110. Первый ноль для пробуждения МК а последний ноль вместо "штатного" старт бита. Это число 0x7E.

Отсюда вопрос как в протеусе набрать число 0x7E :dont_know: или любое другое...
Опыт приходит сразу после того, как он был нужен...
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: AVR. Как проснутся по UART

Сообщение md5sum »

Волосатый писал(а):Первый ноль для пробуждения МК а последний ноль вместо "штатного" старт бита. Это число 0x7E.
С протеусом не заморачиваюсь...
Первый ноль не нужен - МК и так проснется от штатного старта. А вот если в качестве преамбулы передать 0xff, то МК проснется от штатного старта, далее USART "увидит" все единицы и будет ждать старт, который будет предворять второй байт (сгенерится аппаратно).
Т.о. задача сводится к проверке: если МК проснулся от прерывания int0 (или какой-там запараллелен на RX), то необходимо дождаться байта не уходя в сон.
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
Волосатый
Сверлит текстолит когтями
Сообщения: 1288
Зарегистрирован: Пн апр 14, 2008 12:54:35
Откуда: Город ГЕРОЙ Ленинград
Контактная информация:

Re: AVR. Как проснутся по UART

Сообщение Волосатый »

Вы однако правы, FF будет правильней. Разобрался с протеем как там числа слать - этот метод действительно работает :))
Спасибо :beer:
Опыт приходит сразу после того, как он был нужен...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»