|
|
  |
При включении питания отсылает по USART мусор... |
|
|
|
Aug 21 2007, 08:49
|
Местный
  
Группа: Свой
Сообщений: 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; } Так все работает хорошо и устойчиво, но вот эта бага всю малину мне х...т
|
|
|
|
|
Aug 21 2007, 09:10
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Цитата(SasaVitebsk @ Aug 21 2007, 12:03)  Ниже по тексту я просто высказываю свою догадку исходя из собственного опыта. То есть не претендую на истину.
Скорее всего ничего плохого по включению питания не происходит. И ни какой 0 не передаётся. Причина в разном времени сброса на этих однокристалках. То есть одна принимающая (слэйв) не завершила ещё инициализацию, а передающая (мастер) уже завершила и передаёт вполне осмысленную информацию. Ну а как результат - 0.
Если моя догадка верна, то необходимо сделать начальную процедуру синхронизации. Я это везде делаю где применяется несколько однокристаллок. В самом примитивном случае необходимо чтобы мастер заканчивал инициализацию последним. Дело в том что отслеживаю я при помощи третьего устройства, которое тупо передает инфу из лини ТХ мега88 на терминал. Инициализация USARTов действительно отличается по времени, но как это красиво разрулить пока идеи нет. У Мега88 питание никогда не выключается, а просто меняются источники, но она периодически входит в режим Power-down, при этом я выключаю все что можно, а потом когда проц просыпается инициализирую все заново, а второе устройство стартует на холодную...
|
|
|
|
|
Aug 21 2007, 09:20
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Цитата(prottoss @ Aug 21 2007, 12:12)  А почему у слэйвов нет какойнить простяцкой защиты от неправильных данных? хедер какой-ни-какой... Собственно устройства общаются между собой посредством коротких текстовых команд, типа мнемоники asm, только чуть длиннее, чтобы можно понять было что за команда и несуществующие команды отсеиваются, но вот этот 0х00 почему-то вводит второе устройство в ступор. Механизм пока мне не понятен.
|
|
|
|
|
Aug 21 2007, 09:25
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Цитата(SasaVitebsk @ Aug 21 2007, 12:21)  Ну вот. Теперь понятно.
В общем то я поддержу prottoss.
1) Надо обрабатывать ошибки. 2) Либо надо ввести процедуру синхронизации, при которой слэйв дожидается какой-нибудь последовательности принятой без ошибок.
Знаешь как модем работает? Он принимает всё, но анализировать команду начинает начиная с "at". То есть команда hgklk;lk;lkl;khjati3
будет отработана как ati3 Хорошо, спасибо. Буду пробовать.
|
|
|
|
|
Aug 21 2007, 12:52
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Aug 21 2007, 15:59
|

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

|
Цитата(Сергей Борщ @ Aug 21 2007, 15:52)  ... Так-то оно все так. Но здесь не тот случай когда надо подтяжки добавлять или порядок инициализации менять. Принял ненужную лапшу - проигнорируй ее да и все. А то кто-то - кого-то в ступор в водит. Смех и грех. Проблема принимающей стороны, раз ее ноликом можно "убить".
|
|
|
|
|
Aug 21 2007, 21:02
|

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

|
Цитата(defunct @ Aug 21 2007, 18:59)  Проблема принимающей стороны, раз ее ноликом можно "убить". С этим абсолютно согласен. Все когда-то начинали, все думали, что помехи бывают только в радиосвязи, что медь дорожек на платах - сверхпроводник и не имеет ни сопротивления, ни индуктивности  Однако кроме следствия ("убивания") неплохо бы побороть и причину - если когда-нибудь придется делать текстовый протокол, там такие лишние символы будут совсем не кстати.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 22 2007, 07:39
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Цитата(Сергей Борщ @ Aug 22 2007, 00:02)  С этим абсолютно согласен. Все когда-то начинали, все думали, что помехи бывают только в радиосвязи, что медь дорожек на платах - сверхпроводник и не имеет ни сопротивления, ни индуктивности  Однако кроме следствия ("убивания") неплохо бы побороть и причину - если когда-нибудь придется делать текстовый протокол, там такие лишние символы будут совсем не кстати. Да уже поборол... Там просто приемная сторона не успевала обрабатывать все что ей приезжало. У меня USART с FIFO и буфер оказался маловат, потому что пока он ошибку отработал, а буфер уже забили, поэтому все остальное было тоже ошибкой. Чуток увеличил буфер и убрал на приемной стороне лишних несколько телодвижений и все вроде наладилось.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|