Микроконтроллеры | MSSP(IIC) и USART |
|
---|---|---|
Итак, публикую отрывки из первоначального варианта статьи: Программа работает следующим образом. .... ...... Блок приёма функционирует так. Наличие стартового бита проверяется каждое прерывание. Если бит обнаружен, то по второму прерыванию снова проверяется его наличие. В случае подтверждения, зажигается светодиод, и включается механизм приёма. Дальнейшее считывание информации также осуществляется по каждому второму прерыванию. Данные помещаются в специальный регистр. При приёме десятого бита, гасится светодиод, механизм приёма выключается, и проверяется соответствие значения принятого бита стоповому. В случае совпадения, данные из в/у регистра, переписываются в буфер передатчика аппаратного USART, для отправки в ком-порт. Таким образом, данные будут приняты только при наличии стопового бита (если быть точным, при значении десятого бита, равном единице). Третье прерывание последнего цикла в приёме данных не участвует, и, при его возникновении, происходит новая проверка наличия стартового бита. Этим достигается вышесказанная нестабильность, равная "-3,33%", так как, в противном случае, она была бы только "+3,33%". |
|
|
GM: Теперь обратимся к эпюре. |
|
|
Оффтоп. |
|
|
Gregory: Теперь поясните, откуда берутся эти цифры: ±((1/2)/3)/8.5=±0.0196 Когда писал цифры, думал, что у вас 3 выборки на бит. Если их расположить симметрично, то расстояние от крайней выборки до границы бита будет То/3/2. В случае разности частот приёма-передачи эти То/6 должны быть равномерно "размазаны" (разумное предположение, но не всегда оно выполняется) на временном отрезке 8,5*То, там где вы принимаете последний бит байта. Отсюда выходит, что допускается нестабильность РАЗНОСТИ частот приёма-передачи ±(1/6)/8.5=±0.0196. Формула справедлива для разности, т.е. когда например, частота передатчика абсолютно точная, а частота приёмника гуляет. Но поскольку частота передачи и частота приёма абсолютно независимы, то общий допуск на нестабильность надо уменьшить вдвое, т.е. не 2%, а 1%. Для одной выборки, которая в идеале должна быть в центре нестабильность равна ±(1/2)/8.5/2=±0.0294=±3% Всё меня ждут, убегаю домой. |
|
|
chav1961: P.S.: Тема вовсе не оффтоп, а прямо по теме топика (программная реализация UART). Пускай и на Атмелах. Мы же про теорию говорим (естественно, если имеется ввиду специализированный МК с восемью аппаратными UART'ами, то это - оффтоп ) |
|
|
GM: у вас 3 выборки на бит |
|
|
Много надо чего сказать, ну, по очереди. По скорости обработки. Один миди-бит длится 32 мкс, что для 20-мегагерцовой АВР составит 640 машинных циклов, ну о-очень большое время. Вот вам примерный кусок кода приёма байт по миди и передачи их по ком на авр. Работает по прерываниям int0 (прерывание по перепаду 1-0) и по прерываниям ovf0 (по переполнению таймера0). Первое прерывание инициирует второе и запрещает себя, второе срабатывает точно в середине всех битов, побитно принимает байт и передаёт его по последовательному порту. Как вы сами можете посчитать, максимальное время реакции составляет 19+8=27МЦ. Для двух каналов будет 54. А у нас их 640. tim1ovf: in temp,porta ;читаем миди-порт in save,sreg ;сохраним статус bst temp,mpin ;сохраним bld midi1,1 ;принятый ror midi1 ;бит во временном ror midi2 ;регистре brcc tim2 ;все биты? sts gimsk,mask1 ;разрешим int0 sts timsk,mask2 ;запретим ovf0 ror midi1 ;избавимся от ror midi2 ;старт-бита out udr,midi2 ;передадим байт tim2: out sreg,save ;восстановим статус reti ;сделано |
|
|
Gregory, если коротко, суть следующая: 1. Передачи и прием организованы в обработчике прерываний от одного таймера. 8 линий Tx - это один порт. 8 линий Rx - второй порт. И ввод и вывод выполняется непрерывно, даже когда ни передачи, ни приема не требуется. На передачу и на прием одного бита требуется 8 тиков таймера, как я когда-то и писал. Хотел выложить исходник, но, к сожалению, не могу найти. Насколько помню, в самые худшие моменты времени обработчик занимает около 60% процессорного времени, обычно оно намного меньше. Основная идея - групповая передача и групповой (по сути дела) прием, - думаю, понятны. |
|
|
Gregory: ...речь идёт именно об этом. Точнее говоря, именно о РАЗНОСТИ, поскольку, в реальных условиях, частота генератора "плавает" (если вообще "плавает") довольно медленно во времени, и, для приёма-передачи одного байта, её можно считать постоянной. Поэтому ничего делить на 2 не надо Всё не так. Действительно, кратковременную нестабильность генераторов можно не учитывать. Я и не учитывал. Речь идёт о другом, а именно о том, что во время обмена по последовательному каналу частоты генератора и приёмника не совпадают. Это неоспоримый факт. Теперь представьте себе, что у вас частота передатчика абсолютно точная, а частота приёмника отличается от него на некую величину. Давайте оценим допустимую величину рассогласования в данном случае. Для одной выборки на бит допустимое временное рассогласование ∆Т=±0,5То на интервале от начала старт-бита до момента считывания последнего 8-го бита байта, т.е. до середины последнего битового интервала. Интервал этот в среднем равен Тп=8,5То, а не 10То, как вы считаете, потому что после записи последнего бита вы получили всю полезную информацию, содержащуюся в байте, и никакое последующее временное рассогласование не может изменить её ни на йоту. Относительное рассогласование ∆Т/Тп=±0,5То/8,5То=±1/17=±0.0588 или ±5.9%. Теперь вспомните, что все рассуждения мы вели для абсолютно точной частоты передатчика и отличной от неё частоты приёмника. Крайние допустимые значения будут такие Fпрд=Fo, Fпрм=(Fo-6%) или Fпрд=Fo, Fпрм=(Fo+6%). Но реальная частота передатчика не идеальна, значит, возможны такие ситуации как Fпрд=(Fo-6%), Fпрм=(Fo+6%) или Fпрд=(Fo+6%), Fпрм=(Fo-6%). В обоих случаях рассогласование РАЗНОСТНОЙ частоты будет 12%, что неприемлемо. Если допустить, что вероятность распределения ошибок в установке частоты передатчика и приёмника одинакова, то нестабильность нужно уменьшить вдвое. Отсюда появляется двойка в знаменателе, и допустимое взаимное рассогласование двух частот равно ±3%. А вообще, по теории измерений, чтобы получить оценку общей ошибки необходимо складывать МОДУЛИ всех ошибок. |
|
|
Gregory: Кстати, идею по устранению задержки я тоже так и не понял. Ну давайте ещё раз вернёмся к тому примеру. Вам нужно принять байт по миди 31250 бод и передать его по ком 38400. Вы принимаете его целиком и только потом отправляете. Задержка равна времени передачи байта по ком - 26 мкс/бит*10биг=260 мкс. Теперь вы хотите уменьшить задержку, передавая побитно, как только бит для передачи готов. Когда начать передачу? Начать передачу нужно в такое время Тх, чтобы к середине ПРИЁМА последнего миди-бита закончить передачу предпоследнего ком-бита и начать передачу свежеполученного последнего миди-бита. Надеюсь, это ясно. Время середины последнего миди-бита Тмиди=8,5*32=272 мкс, время начала последнего ком-бита Тком=8*26=208 мкс, следовательно время начала передачи по ком Тх=Тмиди-Тком=64 мкс (в предыдущем посте я немного приврал). Отсюда можно вывести удобное практическое правило для вашего случая: принять два бита, старт и первый, и начать передачу по ком. От середины последнего бита передача миди закончится через 16+32=48 мкс, время передачи по ком закончится через 26+26=52, т.е. задержка в данном случае составит всего 4 мкс. Точно также нужно рассуждать при передаче в обратном направлении. Ну, это вам как домашнее задание(. Разумеется, необходим учёт рассогласования частот на приёмной стороне и на передающей. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |