Перейти к содержанию
    

На AVR сделал программно-аппаратный interrupt-based UART (только прием). Он, что характерно, не глючит, принимает как надо. Я его включаю-выключаю как попало - то есть в произвольные, не синхронизированные с передатчиком моменты (тот пилит сплошной поток). Выключаю, чтобы не отвлекать контроллер от других дел, когда надо.

 

Удивляет то, что он не глючит. Ведь если включить УАРТ посередине принимаемого байта, то он засемплирует начиная с первого отрицательного фронта, если текущий бит - ноль, какую-нибудь ерунду и дальше все пойдет не так.

 

Все это относится, конечно, и к аппаратному UART'у.

 

Я так думаю, ну везет пока-что. А что можно предпринять для самосинхронизации двух UART'ов? Или я чего-то не понимаю и такая ситуация не возможна?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что вы понимаете под самосинхронизацией?

И вообще под синхронизацией в АСИНХРОННОМ приемопередатчике?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что вы понимаете под самосинхронизацией?

И вообще под синхронизацией в АСИНХРОННОМ приемопередатчике?

Так о том и вопрос.

То есть, это нормально, когда приемник врубается посередине байта? Что-то подсказывает мне, что такого не может быть :) Вот и решил узнать, как оно на самом деле.

 

Или, другими словами: расслабляться при включении/отключении УАРТ нельзя?

Изменено пользователем Stas-

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То есть, это нормально, когда приемник врубается посередине байта? Что-то подсказывает мне, что такого не может быть :)

Вы что-то не то измеряете или не там смотрите. Чудес не бывает. Приемник должен просыпаться в начале старт-бита, а не когда придется ...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы что-то не то измеряете или не там смотрите. Чудес не бывает. Приемник должен просыпаться в начале старт-бита, а не когда придется ...

ОК. Наверное, так. Тогда вопрос: что делать, если приемник проснулся "не вовремя"?

 

Сам спросил - сам ответил: пропускать биты по одному до тех пор, пока не появится идентификатор посылки из нескольких байтов. Вот и самосинхронизация :)

Изменено пользователем Stas-

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ОК. Наверное, так. Тогда вопрос: что делать, если приемник проснулся "не вовремя"?

Не допускать такой ситуации, поскольку сама эта ситуация ненормальна. Что мешает активировать приемник по прерыванию, вызванному старт-битом ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не допускать такой ситуации, поскольку сама эта ситуация ненормальна. Что мешает активировать приемник по прерыванию, вызванному старт-битом ?

Невозможность отличить старт-бит от "обычного" нулевого бита в посылке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выключаю, чтобы не отвлекать контроллер от других дел, когда надо.

 

Что мешает активировать приемник по прерыванию, вызванному старт-битом ?

 

+1

 

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

я вешал на INTx внешний и немного увеличил таймер, отвечающий за индикацию светодиодов, он же и биты ловил. На AT89C51. Работало на 9600 вполне стабильно

 

Невозможность отличить старт-бит от "обычного" нулевого бита в посылке.

нулевой бит!? с него же все и начинается!

Есть фронт - отключаем прерывание по фронту, запускаем таймер и ловим остальные биты, потом опять включаем прерывание по пину

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще говоря ситуация когда UART включается "посреди" слова вполне нормальная, ведь никто не гарантирует, что в неком абстрактном устройстве приемник включится раньше передатчика и будет готов ловить первый фронт первого стартового бита.

Такая ситуация разруливается несколькими средствами: во-первых в конце слова идет стоповый бит (единица), если его нет - это frame error, во-вторых в поток включаются idle слова - единица удерживается на линии в течении времени достаточного для приема целого слова (т.е. словив frame error на idle слове следующий стартовый бит будет гарантированно верным).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

+1

 

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

я вешал на INTx внешний и немного увеличил таймер, отвечающий за индикацию светодиодов, он же и биты ловил. На AT89C51. Работало на 9600 вполне стабильно

 

 

нулевой бит!? с него же все и начинается!

Есть фронт - отключаем прерывание по фронту, запускаем таймер и ловим остальные биты, потом опять включаем прерывание по пину

Контроллер отвлекается на о инициализацию и запуск ПЛМ. Точность и детерминированность запуска должны быть обеспечены. Какой там еще одно прерывание? Да и вообще, в общем случае, все равно, на что он отвлекается.

 

Когда включается, вот это:

 

Есть фронт, значит и надо ловить байт, потому как это старт-бит

не обязательно старт-бит. Ну сами прикиньте. Ведь и в середине посылки может быть ноль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В передаче вставить передачу байта FF (проще) или паузу в один символ (труднее). ТОгда даже неправильно засинхронизировавшийся приёмник перескочит на правильный старт-бит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще говоря ситуация когда UART включается "посреди" слова вполне нормальная, ведь никто не гарантирует, что в неком абстрактном устройстве приемник включится раньше передатчика и будет готов ловить первый фронт первого стартового бита.

это понятно. Непонятно то, зачем его отключать вообще? ошибки фрейма да, поймаются в прерывании таймера при отсчете битов.

а вообще это дело можно долго ловить, т.к. стартовый бит может идти на расстоянии одного бита от стопового, если я ничего не путаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Годится только такой вариант. Пачка единиц не сильно снизит вероятность ошибки. Вместо контрольной суммы - многократная "долбежка", мы не гордые :

 

Шутка, конечно, просто время прижало совсем.

 

Потом надо сделать Хэмминга, и с пропуском битов...

 

И повесить на эти 16м кабеля RS-485 :)

Изменено пользователем Stas-

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно то, зачем его отключать вообще?

Ну как же.. Партия сказала "Надо!", комсомол ответил "Есть!" :)

 

Годится только такой вариант. Пачка единиц не сильно снизит вероятность ошибки. Вместо контрольной суммы - многократная "долбежка", мы не гордые :)

Не пачка единиц, а "молчание" на линии - даст 100% гарантию синхронизации на следующем стартовом бите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллер отвлекается на о инициализацию и запуск ПЛМ. Точность и детерминированность запуска должны быть обеспечены.

ну так и не трогайте его в этот момент левыми посылками :)

начал передатчик работать - значит можно и в приемник что-то слать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...