Свежие обсуждения
Микроконтроллеры

MSSP(IIC) и USART

1 4 13

Ого, сколько понаписали Горячие финские парни Gregory, Вы с AVR-овским ассемблером знакомы? Если да, на выходных могу исходники выложить.

 

Gregory: Давайте без оскорблений.

И в мыслях не было

Gregory: Если я не понимаю СИ, мне не зазорно сказать про это.

Я это уже понял, и принял как данность Потому и пытался объяснить словами..

Gregory: Никаких эхов. Что надо, то, и ловится, и передаётся.

Посмотрел ещё раз Вашу программу. Проникся

Понравилась компенсация времени реакции на прерывание. Сами придумали?

У Вас прерывание настроено случаться 3 раза за время бита. Не уверен, что этого достаточно для уверенного приёма. Могу привести пример, когда не сработает.

И ещё. В аттаче - Ваш код прерывания, я расставил в нём число МЦ вдоль одной из веток исполнения. У меня вышло 68 МЦ, при прерывании через 63 На фоне этого борьба с джиттером выглядит смешно

Gregory: Короче. Давайте исходник на АСМе (ну, или хотя бы хекс), будем смотреть.

Я уже лет десять не писал на асме Но я попробую!

 

Забыл аттач приаттачить.

117599.asm

 

AHTOXA:
Сами придумали?
Пришлось. Как-то никто про это даже не упоминает никогда.. Почему-то..
Кстати. У меня так и остался вопрос, почему разница в 2 МЦ? В 1 - понятно, а вот 2...

когда не сработает
Давайте, конечно. Может что и упустил.

У меня вышло 68 МЦ
Поподробнее, плиз. Вроде тысячу раз прогонял, всегда в 63 укладывался.

Атач гляну чуть попозже. Сейчас дюже некогда.

chav1961:
сколько понаписали
Ага! Кроме автора темы. "Жаль, что мы так и не услышали начальника транспортного цеха". Хотелось бы всё-таки узнать, что ему конкретно надо.

с AVR-овским ассемблером знакомы
Увы! Только в общих чертах. В смысле, знаю, что в нём более сотни команд.

 

AHTOXA:
Забыл аттач
Млин! Думал это - Ваш атач. А это, оказывается, мой, с проставленными шагами.
Итак.
Во-первых. Полный цикл, не 63, а 64 МЦ.
Во-вторых. Сразу же бросается в глаза ошибка в "Корректировке". Я же говорил, что некоторые нопы никогда не выполняются, а служат как-раз для исключения лишних команд коррекции. В данном случае, после пересылки содержимого TMR2 в аккумулятор, из него необходимо вычесть некоторую константу. Вместо этого добавлены "лишнии" нопы. Фактически выполняться будут только последние три (или даже два, это я уже корректировал потом, и не помню, какую версию в журнал отсылал, но укладывались в интервал обе версии). Так что это уже - минус 4 (или 5).
В-третьих. Не понял, что означает "+ 2 на вход...", в самом конце?
В-четвёртых. Я прогонял всё это, в различных вариантах, в МПЛАБе, наблюдая за показаниями TMR2.

не писал на асме
Дык, засуньте хекс в деассемблер. Останется только метки переименовать и коментарии вставить.

 

Gregory: Как-то никто про это даже не упоминает никогда.. Почему-то..

Да мелочи это, плюс-минус МЦ Но в любом случае, красиво.

Gregory: Итак.
Во-первых. Полный цикл, не 63, а 64 МЦ.

Принято

Gregory: Во-вторых. Сразу же бросается в глаза ошибка в "Корректировке"

Принято, -4 команды

Gregory: Не понял, что означает "+ 2 на вход..."

Дык, вход в прерывание - это GOTO, выполняется 2 МЦ, не?

Итого, 66+2-4 = 64 цикла Пусть я даже обсчитался ещё где-то (это я запросто), всё равно, это нагрузка запредельная, основному циклу программы просто некогда выполняться.

А работает Ваше устройство только благодаря тому, что приём/передача осуществляются не одновременно, а поочерёдно, то есть, полудуплексно Имхо, конечно.

 

Gregory: В-четвёртых. Я прогонял всё это, в различных вариантах, в МПЛАБе, наблюдая за показаниями TMR2. ;)

Выходит я хитрее MPLAB-а, нашёл самую длинную ветку выполнения

Gregory: Дык, засуньте хекс в деассемблер. Останется только метки переименовать и коментарии вставить. ;)

А хекс откуда взять?

Я уже почти написал на ассемблере (мрак)

 

AHTOXA:
я хитрее MPLAB-а
Отнюдь. Просто МПЛАБ не может обсчитался ещё где-то.

некогда выполняться
Однако выполняется. И полный дуплекс.
Просто, "полные нагрузки" не на каждый тик приходятся.
Да и программа-то не шибко умная. Просто гоняет данные из програмного в аппаратный UART, и в обратном направлении, через буфер.

А хекс откуда взять?
Дык, а СИ не компилится?

 

Gregory: Однако выполняется. И полный дуплекс.

А я вот почему-то уверен, что если подать непрервыные потоки на приём и на передачу одновременно, то загнётся

Gregory: Дык, а СИ не компилится?

Не, не компилится У меня нету си для пиков, (и MPLAB-а - тоже нет ) Я не работаю с пиками.

ЗЫ. Я написал вчера вечером программу на асме, но забыл её дома Вечерком выложу.

ЗЗЫ. Долго крутил в голове Вашу идею с тремя опросами на бит. Не смог найти веских возражений. Буду применять

 

AHTOXA:
то загнётся
Был бы МПЛАБ, то сами бы проверили, что не загнётся.
Точнее, при непрерывном потоке аппаратный приёмник - софтовый передатчик загнётся, но по причине большей скорости аппаратного UART, и, соответственно, переполнения буфера. А буфер довольно-таки здоровый. Позволяет принять около 900 байт (в статье цифирь более точная).