реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> При включении питания отсылает по USART мусор...
MSprut
сообщение Aug 21 2007, 08:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



Имеется два устройства на мега32 и мега88, связанных по USART. Устройство на мега88 управляет общим питанием и имеет резервное питание от батареи для работы в спящем режиме. При влючении основного питания мега88 сразу передает 0х00 и этим вводит в ступор второе устройство. Никак не могу эту фигню убрать. Может кто сталкивался с таким?
Код
//mega88
void Init_USART(unsigned int baudrate)
{
    UBRR0H = (unsigned char) (baudrate >> 8);
    UBRR0L = (unsigned char) baudrate;
    UCSR0B = (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);
    RxTail = 0;
    RxHead = 0;
    TxTail = 0;
    TxHead = 0;
}

Код
//mega32
void init_USART(unsigned int baudrate)
{
    UBRRH = (unsigned char) (baudrate >> 8);
    UBRRL = (unsigned char) baudrate;
    UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    RxTail = 0;
    RxHead = 0;
    TxTail = 0;
    TxHead = 0;
}

Так все работает хорошо и устойчиво, но вот эта бага всю малину мне х...т
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 21 2007, 09:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Ниже по тексту я просто высказываю свою догадку исходя из собственного опыта. То есть не претендую на истину.

Скорее всего ничего плохого по включению питания не происходит. И ни какой 0 не передаётся. Причина в разном времени сброса на этих однокристалках. То есть одна принимающая (слэйв) не завершила ещё инициализацию, а передающая (мастер) уже завершила и передаёт вполне осмысленную информацию. Ну а как результат - 0.

Если моя догадка верна, то необходимо сделать начальную процедуру синхронизации. Я это везде делаю где применяется несколько однокристаллок. В самом примитивном случае необходимо чтобы мастер заканчивал инициализацию последним.
Go to the top of the page
 
+Quote Post
MSprut
сообщение Aug 21 2007, 09:10
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



Цитата(SasaVitebsk @ Aug 21 2007, 12:03) *
Ниже по тексту я просто высказываю свою догадку исходя из собственного опыта. То есть не претендую на истину.

Скорее всего ничего плохого по включению питания не происходит. И ни какой 0 не передаётся. Причина в разном времени сброса на этих однокристалках. То есть одна принимающая (слэйв) не завершила ещё инициализацию, а передающая (мастер) уже завершила и передаёт вполне осмысленную информацию. Ну а как результат - 0.

Если моя догадка верна, то необходимо сделать начальную процедуру синхронизации. Я это везде делаю где применяется несколько однокристаллок. В самом примитивном случае необходимо чтобы мастер заканчивал инициализацию последним.

Дело в том что отслеживаю я при помощи третьего устройства, которое тупо передает инфу из лини ТХ мега88 на терминал. Инициализация USARTов действительно отличается по времени, но как это красиво разрулить пока идеи нет. У Мега88 питание никогда не выключается, а просто меняются источники, но она периодически входит в режим Power-down, при этом я выключаю все что можно, а потом когда проц просыпается инициализирую все заново, а второе устройство стартует на холодную...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 21 2007, 09:12
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



А почему у слэйвов нет какойнить простяцкой защиты от неправильных данных? хедер какой-ни-какой...


--------------------
Go to the top of the page
 
+Quote Post
MSprut
сообщение Aug 21 2007, 09:20
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



Цитата(prottoss @ Aug 21 2007, 12:12) *
А почему у слэйвов нет какойнить простяцкой защиты от неправильных данных? хедер какой-ни-какой...

Собственно устройства общаются между собой посредством коротких текстовых команд, типа мнемоники asm, только чуть длиннее, чтобы можно понять было что за команда и несуществующие команды отсеиваются, но вот этот 0х00 почему-то вводит второе устройство в ступор. Механизм пока мне не понятен.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 21 2007, 09:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Ну вот. Теперь понятно.

В общем то я поддержу prottoss.

1) Надо обрабатывать ошибки.
2) Либо надо ввести процедуру синхронизации, при которой слэйв дожидается какой-нибудь последовательности принятой без ошибок.

Знаешь как модем работает? Он принимает всё, но анализировать команду начинает начиная с "at". То есть команда
hgklk;lk;lkl;khjati3

будет отработана как ati3
Go to the top of the page
 
+Quote Post
MSprut
сообщение Aug 21 2007, 09:25
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



Цитата(SasaVitebsk @ Aug 21 2007, 12:21) *
Ну вот. Теперь понятно.

В общем то я поддержу prottoss.

1) Надо обрабатывать ошибки.
2) Либо надо ввести процедуру синхронизации, при которой слэйв дожидается какой-нибудь последовательности принятой без ошибок.

Знаешь как модем работает? Он принимает всё, но анализировать команду начинает начиная с "at". То есть команда
hgklk;lk;lkl;khjati3

будет отработана как ati3

Хорошо, спасибо. Буду пробовать.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 21 2007, 09:45
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Так все, более менее путние системы работают smile.gif
Вначале ИД пакета, контрольная сумма (опционально), данные


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 21 2007, 12:52
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(MSprut @ Aug 21 2007, 12:10) *
Дело в том что отслеживаю я при помощи третьего устройства, которое тупо передает инфу из лини ТХ мега88 на терминал.
1)После сброса порты находятся в третьем состоянии. Если нет подтяжки на линии Tx, то вполне возможно что этот уровень воспринимается как ноль (стартовый бит).
2) В каком порядке происходит инициализация? Если сначала порты, а потом USART, то какой уровень пишется в PD1? Если ноль - то он будет восприниматься принимающей стороной как стартовый бит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 21 2007, 15:59
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Сергей Борщ @ Aug 21 2007, 15:52) *
...

Так-то оно все так.
Но здесь не тот случай когда надо подтяжки добавлять или порядок инициализации менять.

Принял ненужную лапшу - проигнорируй ее да и все.
А то кто-то - кого-то в ступор в водит. Смех и грех.

Проблема принимающей стороны, раз ее ноликом можно "убить".
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 21 2007, 21:02
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(defunct @ Aug 21 2007, 18:59) *
Проблема принимающей стороны, раз ее ноликом можно "убить".
С этим абсолютно согласен. Все когда-то начинали, все думали, что помехи бывают только в радиосвязи, что медь дорожек на платах - сверхпроводник и не имеет ни сопротивления, ни индуктивности smile.gif
Однако кроме следствия ("убивания") неплохо бы побороть и причину - если когда-нибудь придется делать текстовый протокол, там такие лишние символы будут совсем не кстати.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MSprut
сообщение Aug 22 2007, 07:39
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



Цитата(Сергей Борщ @ Aug 22 2007, 00:02) *
С этим абсолютно согласен. Все когда-то начинали, все думали, что помехи бывают только в радиосвязи, что медь дорожек на платах - сверхпроводник и не имеет ни сопротивления, ни индуктивности smile.gif
Однако кроме следствия ("убивания") неплохо бы побороть и причину - если когда-нибудь придется делать текстовый протокол, там такие лишние символы будут совсем не кстати.

Да уже поборол... Там просто приемная сторона не успевала обрабатывать все что ей приезжало. У меня USART с FIFO и буфер оказался маловат, потому что пока он ошибку отработал, а буфер уже забили, поэтому все остальное было тоже ошибкой. Чуток увеличил буфер и убрал на приемной стороне лишних несколько телодвижений и все вроде наладилось.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Aug 22 2007, 19:01
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



У меня была ситуация что uart повисал когда происходила запись регистра скорости передачи в тот момент когда шли данные. Толком не выяснил причину- поставил подпорку - лечилось выключением и включением uarta.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01625 секунд с 7
ELECTRONIX ©2004-2016