|
|
  |
ATTiny2313 - проблема с UART, На одной и тойже плате, UART AT90S2313 работает нормально, а вот с ATT |
|
|
|
Aug 2 2007, 15:41
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230

|
Доброго времени суток! У меня возникла проблема с UART. Не то что бы он не работал вообще, он работает, но в младших битах переданной/принятой информации хаотически выставляются единички.
Обмен информацией с ПК осуществляется по средствам USB, и я поначалу подумал, что что-то в преобразователе интерфейса (FT232BM) - замкнул RxD и TxD, все предаётся без потерь и ошибок.
Подумал, что могут быть проблемы по питанию и возможно нехватает "подтяжки", предпринял меры: 1. Добавил дроссель по питанию и еще конденсаторов; 2. Добавил в схему подтягивающие резисторы; 3. Добавил стабилизатор напряжения 3,3В; 4. Отключил переферию.... Ничего не помогло...
Потом подумал, что возможно причина в кварце, переключил на внутренний. Тот же эффект!
Затем для чистоты эксперимента поставил AT90S2313, всё заработало с первого раза.
Вот сижу и ломаю голову, что может быть не так?
P.S.: У меня две тини, из одной и той же партии, работают одинаково плохо. Так же, пробовал правильно ли работает приемник UART, та же проблема!
|
|
|
|
Guest_=AVR=_*
|
Aug 2 2007, 18:30
|
Guests

|
Возможно, фузы не переключены на кварц, и МК работает от неточного внутреннего RC-генератора
|
|
|
|
|
Aug 3 2007, 14:57
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230

|
2 defunct: С МАХ232 не пробывал, просто у меня нет СОМ порта на ноутбуке.
2 =AVR=: С фьюзами всё супер.
|
|
|
|
|
Aug 3 2007, 15:08
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(SS85 @ Aug 3 2007, 18:57)  2 defunct: С МАХ232 не пробывал, просто у меня нет СОМ порта на ноутбуке.
2 =AVR=: С фьюзами всё супер. Тогда - настройки UART в студию ! Мысль о несогласовании частот (BTW, а на какой скорости работаешь и какая тактовая ?) мы отвергнем как несвоевременную  Поскольку "бьются" младшие биты, которые как раз передаются первыми. Вообще какие-то чудеса, такого просто не может быть. Тем более что эффект наблюдается и при приеме, и при передаче. Раз есть при передаче - встаем скопом на TxD и внимательно смотрим, а что же у нас там такое ? Вообще-то у 90s2313 и tiny2313 есть существенные различия, но в данном случае я даже не представляю, как можно сделать ТАКОЕ... Я бы начал именно с передачи, зациклив чередование передачи какого-нибудь легко читаемого паттерна (5A, A5, 55, AA), разглядывая скопом и протоколируя на терминалке. И попробовав на разных скоростях.
Сообщение отредактировал rx3apf - Aug 3 2007, 15:09
|
|
|
|
|
Aug 3 2007, 15:59
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230

|
Цитата встаем скопом на TxD и внимательно смотрим, а что же у нас там такое ? Проблема в том, что скопа у меня нет  . Цитата Вообще-то у 90s2313 и tiny2313 есть существенные различия, но в данном случае я даже не представляю, как можно сделать ТАКОЕ... Насчет разницы МК я знаю и о том что настраиваются по разному тоже. Инициализация УАРТа: Код #define RxBuffLength 20 // Length of RX buffer #define BR 115200 // Baudrate #define BAUD F_CPU/(16 * (BR + 1)) // MCU BAUD … void DeviceInit(void) { … //*** USART #ifdef __IO2313_H UCR = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); UBRR = (unsigned char)BAUD; #else UBRRH = (unsigned char)(BAUD>>8); UBRRL = (unsigned char)BAUD; //Rx - en, Tx - en, RxI - en UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //8n1 UCSRC = 3<<UCSZ0; #endif … } Цитата Я бы начал именно с передачи, зациклив чередование передачи какого-нибудь легко читаемого паттерна (5A, A5, 55, AA), разглядывая скопом и протоколируя на терминалке. И попробовав на разных скоростях. Я подобным занимался, с единственным отличием, вначале делал эхо, т.е. просто терминалкой передавал символы и смотрел что мне приходит, затем сделал чуть иначе запустил таймер, и по прерыванию передавал байты от 0 до 255 в цикле. Приемник проверял таким образом: брал символы из эксперимента 1 (я имею ввиду те которые были возвращены искаженными) и по очереди подставлял в условие: Код #ifdef __IO2313_H #pragma vector=UART_RX_vect #else #pragma vector=USART0_RX_vect #endif __interrupt void usart0_rx_isr(void) { … if (UDR == ‘<очередной байт>’) LedON(); else LedOFF(); … } Я так понимаю, остается добавить в схему МАХ232 и проверить еще с ней. Цитата(GDI @ Aug 3 2007, 18:28)  Что я там могу для себя подчеркнуть? Это же описангие перехода от AT90S1200 к ATTiny2313.
|
|
|
|
|
Aug 3 2007, 16:23
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Похоже у вас неверно вычисляется BAUD. У вас используется фомула для получения частоты из значения UBRR-регисра F_CPU/(16 * (BR + 1)) , а нужно по обратной: #define BAUD (F_CPU/16/BR - 1)
|
|
|
|
|
Aug 3 2007, 17:33
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230

|
ahulap, спасибо за то что обратили внимание на формулу, исправил, но такая ошибка не сильно повлияет, но на всякий случа попробывал. Результат не изменился.
|
|
|
|
|
Aug 3 2007, 18:17
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(SS85 @ Aug 3 2007, 21:33)  ahulap, спасибо за то что обратили внимание на формулу, исправил, но такая ошибка не сильно повлияет, но на всякий случа попробывал. Результат не изменился. Вообще хорошо бы попробовать явно указать значения делителей (или хоть посмотреть, что именно записывается, и для какой тактовой частоты), хотя мерцание именно младшего бита (при условии, что остальные проходят корректно) наводит на мысль, что скорости тут совсем не при чем (но и разумного объяснения таким чудесам тоже на ум не приходит). Все ж надо скопом смотреть, в конце концов, сходив туда, где он есть. Чудес (по крайней мере таких) - не бывает...
|
|
|
|
|
Aug 3 2007, 22:26
|

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

|
Цитата(SS85 @ Aug 3 2007, 20:33)  но такая ошибка не сильно повлияет, но на всякий случа попробывал. Результат не изменился. Неправду говорите, молодой человек ;> Fosc = 11.0592? сравним 11059200 / 16 / 115201 = 6 и 11059200 / 16 / 115200 - 1 = 5 115200 * 5/6 = 96000baud Ошибка эта очень сильно повлияет. Ведь разница частот получается ~20%! Это значит гарантированно каждый кадр будет битым, т.к. ошибка на кадр составит 20%*10бит = 200%
|
|
|
|
|
Aug 4 2007, 10:24
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 14-03-06
Пользователь №: 15 230

|
Цитата(defunct @ Aug 4 2007, 01:26)  Неправду говорите, молодой человек ;> ... ошибка на кадр составит 20%*10бит = 200% Я всё проверил после того как исправил ошибку.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|