Stas- 0 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба На AVR сделал программно-аппаратный interrupt-based UART (только прием). Он, что характерно, не глючит, принимает как надо. Я его включаю-выключаю как попало - то есть в произвольные, не синхронизированные с передатчиком моменты (тот пилит сплошной поток). Выключаю, чтобы не отвлекать контроллер от других дел, когда надо. Удивляет то, что он не глючит. Ведь если включить УАРТ посередине принимаемого байта, то он засемплирует начиная с первого отрицательного фронта, если текущий бит - ноль, какую-нибудь ерунду и дальше все пойдет не так. Все это относится, конечно, и к аппаратному UART'у. Я так думаю, ну везет пока-что. А что можно предпринять для самосинхронизации двух UART'ов? Или я чего-то не понимаю и такая ситуация не возможна? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 11 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба А что вы понимаете под самосинхронизацией? И вообще под синхронизацией в АСИНХРОННОМ приемопередатчике? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stas- 0 15 октября, 2012 Опубликовано 15 октября, 2012 (изменено) · Жалоба А что вы понимаете под самосинхронизацией? И вообще под синхронизацией в АСИНХРОННОМ приемопередатчике? Так о том и вопрос. То есть, это нормально, когда приемник врубается посередине байта? Что-то подсказывает мне, что такого не может быть :) Вот и решил узнать, как оно на самом деле. Или, другими словами: расслабляться при включении/отключении УАРТ нельзя? Изменено 15 октября, 2012 пользователем Stas- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба То есть, это нормально, когда приемник врубается посередине байта? Что-то подсказывает мне, что такого не может быть :) Вы что-то не то измеряете или не там смотрите. Чудес не бывает. Приемник должен просыпаться в начале старт-бита, а не когда придется ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stas- 0 15 октября, 2012 Опубликовано 15 октября, 2012 (изменено) · Жалоба Вы что-то не то измеряете или не там смотрите. Чудес не бывает. Приемник должен просыпаться в начале старт-бита, а не когда придется ... ОК. Наверное, так. Тогда вопрос: что делать, если приемник проснулся "не вовремя"? Сам спросил - сам ответил: пропускать биты по одному до тех пор, пока не появится идентификатор посылки из нескольких байтов. Вот и самосинхронизация :) Изменено 15 октября, 2012 пользователем Stas- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба ОК. Наверное, так. Тогда вопрос: что делать, если приемник проснулся "не вовремя"? Не допускать такой ситуации, поскольку сама эта ситуация ненормальна. Что мешает активировать приемник по прерыванию, вызванному старт-битом ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stas- 0 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба Не допускать такой ситуации, поскольку сама эта ситуация ненормальна. Что мешает активировать приемник по прерыванию, вызванному старт-битом ? Невозможность отличить старт-бит от "обычного" нулевого бита в посылке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба Выключаю, чтобы не отвлекать контроллер от других дел, когда надо. Что мешает активировать приемник по прерыванию, вызванному старт-битом ? +1 Что может отвлекать контроллер, если запуск софтового таймера осуществляется по прерыванию отрицательного фронта пина? Есть фронт, значит и надо ловить байт, потому как это старт-бит я вешал на INTx внешний и немного увеличил таймер, отвечающий за индикацию светодиодов, он же и биты ловил. На AT89C51. Работало на 9600 вполне стабильно Невозможность отличить старт-бит от "обычного" нулевого бита в посылке. нулевой бит!? с него же все и начинается! Есть фронт - отключаем прерывание по фронту, запускаем таймер и ловим остальные биты, потом опять включаем прерывание по пину Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба Вообще говоря ситуация когда UART включается "посреди" слова вполне нормальная, ведь никто не гарантирует, что в неком абстрактном устройстве приемник включится раньше передатчика и будет готов ловить первый фронт первого стартового бита. Такая ситуация разруливается несколькими средствами: во-первых в конце слова идет стоповый бит (единица), если его нет - это frame error, во-вторых в поток включаются idle слова - единица удерживается на линии в течении времени достаточного для приема целого слова (т.е. словив frame error на idle слове следующий стартовый бит будет гарантированно верным). Дополнительно поток можно разбивать на кадры, в начале кадра вставляется синхропосылка (одно или более предопределенных слов), а в конце кадра контрольная сумма. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stas- 0 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба +1 Что может отвлекать контроллер, если запуск софтового таймера осуществляется по прерыванию отрицательного фронта пина? Есть фронт, значит и надо ловить байт, потому как это старт-бит я вешал на INTx внешний и немного увеличил таймер, отвечающий за индикацию светодиодов, он же и биты ловил. На AT89C51. Работало на 9600 вполне стабильно нулевой бит!? с него же все и начинается! Есть фронт - отключаем прерывание по фронту, запускаем таймер и ловим остальные биты, потом опять включаем прерывание по пину Контроллер отвлекается на о инициализацию и запуск ПЛМ. Точность и детерминированность запуска должны быть обеспечены. Какой там еще одно прерывание? Да и вообще, в общем случае, все равно, на что он отвлекается. Когда включается, вот это: Есть фронт, значит и надо ловить байт, потому как это старт-бит не обязательно старт-бит. Ну сами прикиньте. Ведь и в середине посылки может быть ноль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба В передаче вставить передачу байта FF (проще) или паузу в один символ (труднее). ТОгда даже неправильно засинхронизировавшийся приёмник перескочит на правильный старт-бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба Вообще говоря ситуация когда UART включается "посреди" слова вполне нормальная, ведь никто не гарантирует, что в неком абстрактном устройстве приемник включится раньше передатчика и будет готов ловить первый фронт первого стартового бита. это понятно. Непонятно то, зачем его отключать вообще? ошибки фрейма да, поймаются в прерывании таймера при отсчете битов. а вообще это дело можно долго ловить, т.к. стартовый бит может идти на расстоянии одного бита от стопового, если я ничего не путаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stas- 0 15 октября, 2012 Опубликовано 15 октября, 2012 (изменено) · Жалоба Дополнительно поток можно разбивать на кадры, в начале кадра вставляется синхропосылка (одно или более предопределенных слов), а в конце кадра контрольная сумма. Годится только такой вариант. Пачка единиц не сильно снизит вероятность ошибки. Вместо контрольной суммы - многократная "долбежка", мы не гордые : Шутка, конечно, просто время прижало совсем. Потом надо сделать Хэмминга, и с пропуском битов... И повесить на эти 16м кабеля RS-485 :) Изменено 15 октября, 2012 пользователем Stas- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба Непонятно то, зачем его отключать вообще? Ну как же.. Партия сказала "Надо!", комсомол ответил "Есть!" :) Годится только такой вариант. Пачка единиц не сильно снизит вероятность ошибки. Вместо контрольной суммы - многократная "долбежка", мы не гордые :) Не пачка единиц, а "молчание" на линии - даст 100% гарантию синхронизации на следующем стартовом бите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 15 октября, 2012 Опубликовано 15 октября, 2012 · Жалоба Контроллер отвлекается на о инициализацию и запуск ПЛМ. Точность и детерминированность запуска должны быть обеспечены. ну так и не трогайте его в этот момент левыми посылками :) начал передатчик работать - значит можно и в приемник что-то слать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться