|
|
  |
Как бы выкрутится из такого поожения? |
|
|
|
Jun 12 2007, 19:59
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Pyku_He_oTTyda @ Jun 12 2007, 21:30)  Постораюсь ясно изложить мысль: МК (мега8) занимается управлением камерой по LANCпротоколу (тот же самый UART со стороны камеры, но с открытым коллектором ), со стороны МК отслеживаем старт-биты и подаем команды притягиванием линии к земле. Передается фреймами по 8 байт, во время передачи команды (одно и то же повторяем несколько фреймов - может затянутся на насколько секунд) нельзя пропускать фреймы. То есть МК занят, на остальную работу остается порядка 9милисек (промежуток между фреймами) Все бы ничего, но параллельно надо принимать другую команду, длительностью порядка 44 милис. Есть идея по фронту внешней команды запускать capture timer на время 45 мс и после оценивать состояние регистра ICR. Покритикуйте идею. Это напоминает обычный программный УАРТ, и действительно, легко реализуется по прерыванию по стартовому биту. Далее запускается таймер на длительность бита с поправками на длительность прерывания и поехали. Вопрос в параметрах - какова длительность бита, и какой допустимый джиттер. Реализовать абсолютно фоновый УАРТ на двух прерываниях получается достаточно просто.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 13 2007, 06:21
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Pyku_He_oTTyda @ Jun 13 2007, 06:38)  то есть вы предлагаете вплотную занятся приемом "длинной "команды как основной, а УАРТ обрабатывать в фоновом режиме по прерываниям? Длительность длинная - 104мкс (9600). Я ничего не предлагаю, так как не знаю в точности распределения ресурсов. Мои подходы в программировании таковы, что в основном цикле контроллер должен крутиться без напряга по времени, а вся основная поддержка интерфейсов реализуется в фоне по прерываниям. Я всего лишь утверждаю, что на микроконтроллере АВР вполне реализуем вариант двух программных УАРТов, работающих в фоновом режиме со скоростью 9600. Во всяком случае, один на 19200 получился просто, джиттер меньше 5 процентов, экстраполируя на два УАРТа 9600, я предполагаю вполне хорошие результаты. Кстати, а что, только прием команд? Тогда задача еще проще - в прерываниях не нужно анализировать режим порта. Да, еще по поводу использования логики захвата. Действительно, можно упростить фоновый алгоритм - писать в буфер содержимое таймера, когда входной сигнал поменял полярность, а потом анализировать. Я так делал для приема посылок по радио, очень прозрачно и удобно.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 13 2007, 12:21
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Pyku_He_oTTyda @ Jun 13 2007, 15:09)  В первом посте неправильно выразился, "другая команда" это не УАРТ, там свой протокол. Минимальная длительность импульса 1мс, максимальная - 6мс. Вот на 44мили и набегает. Ну неважно, обработка вряд ли принципиально отличается от программного УАРТа - поймать первый фронт (по прерыванию от порта) а потом с привязкой по времени (прерывания от таймера) считывать состояние входа (или менять при передаче). Я программными УАРТами измерял ресурсы. Как попугаями - удава 1ms - это вагон времени. У меня фоновое прерывание таймера, в котором клавиатура и прочие сервисы, работает с периодом 1 мс.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jun 16 2007, 08:08
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Pyku_He_oTTyda @ Jun 16 2007, 09:36)  После посылки байта остается спать 250мкс (LANC такой). Так говорилось же уже сварганить передачу LANC на двух прерываниях. По спаду старт-бита - прерывание запуска процесса, лучше всего - ICP. В этом прерывании инициализируем передачу команды в камеру (счётчик бит, ...) и делаем OCR1A = ICR1 + длина_полутора_бит; /* таймер 1 бежит свободно */ В прерывании по OCR1A выталкиваем бит и делаем для следующего прерывания OCR1A += длина_бита; Итого процессор будет свободен кучу времени, иногда (не чаще раза на бит) совсем ненадолго отвлекаясь на LANC. Период бита 104мкс @ 9600, при 8 мегагерцах такта это больше 800 тактов, прерывание OCR1A уложится в несколько десятков, более 90% времени процессор гуляет.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|