|
|
  |
Как заставить работатьUSART на Tiny2313?, искажает принимаемые и передаваемые данные |
|
|
|
Sep 20 2009, 00:37
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-05-05
Пользователь №: 5 083

|
Tiny2313 на 12 МГц. Пытаюсь заставить принимать данные от внешнего устройства. Принимает она совсем не то что передается.  Инициализация и прочие параметры - как во множестве примеров в интернете. BAUD расчитан по формуле на 118 странице мануала - 77. Делитель частоты на 8 убран. В Протеусе всё работает как часы. Шью в железку - принимает и передает мусор (повторяющийся). Tiny менял на другой такой-же экземпляр. Кварц менял. С фьюзами игрался. Даташит читал. BAUD менял туда-сюда. Не работает. Написал прграммулину, что записывает принимаемые данные в EEPROM - мусор. Написал прграммулину, выдающую фиксированную строку на терминал - мусор! В Протеусе всё работает как часы. Скажите, в каком месте мне стоит руки поправить? Какая информация поможет локализовать проблему?
|
|
|
|
|
Sep 20 2009, 08:32
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-05-05
Пользователь №: 5 083

|
Вот: Код #include <avr/io.h> void USART_Init() { const unsigned int BAUD = 77; // Page 118 of Datasheet. /* Set baud rate */ UBRRH = (unsigned char)(BAUD>>8); UBRRL = (unsigned char)(BAUD & 0xFF); UCSRA &= ~(0 << U2X); // Single speed. /* Set frame format: 8data, No Parity, 1stop bit*/ // UCSRC = (0<<UMSEL)|(0<<USBS)|(0 << UPM1)|(0 <<UPM0)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0); UCSRC = (0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0); /* Enable receiver and transmitter */ UCSRB = (1 << RXEN) | (1 << TXEN); }
void main() { USART_Init();
unsigned char data; char buf[] = "1234567890ABCDEFGHIGKLMNOPQRSTUVWXYZ!@#"; int len = strlen(buf);
while(1) { for(int i = 0; i < len; ++i){ while (!(UCSRA & (1 << UDRE))); UDR = buf[i];
while( !(UCSRA & (1<<TXC)) ); // Wait for transmit ready. }
while (!(UCSRA & (1 << UDRE))); UDR = 0x0D;
while( !(UCSRA & (1<<TXC)) ); // Wait for transmit ready.
} // while(1) } На выход выдает что-то типа такого: Цитата >T-"'___}{ywusqomqigeca_][YWUSQOMK_№е_>T-"'___}{ywusqomqigeca_][YWUSQOMK_№е_>
Сообщение отредактировал amdei - Sep 20 2009, 08:34
|
|
|
|
Guest_@Ark_*
|
Sep 20 2009, 09:06
|
Guests

|
Цитата Покажите программу... ... и схему устройства. amdei! На этом форуме, UART - "дежурная тема".  Поищите в разделе для начинающих. Там множество примеров, как отыскать причину неправильной работы. Но сначала, Вам нужно убедиться, что схема подключения правильная.
|
|
|
|
|
Sep 20 2009, 10:03
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Раз что-то передается, значит схема, скорее всего, правильная. А неправильный прием случается из-за неправильной установки скорости передачи-приема, а возможно, и других параметров, стоп-битов, четности и т.п. Вообще 12МГц это нетипичный кварц для работы с УАРТом, хотя, все зависит еще и от той скорости которую нужно получить, а автор об этом ничего не сказал.
T-"'___}{ywusqomqigeca_][YWUSQOMK_№е_> - 40 символов 1234567890ABCDEFGHIGKLMNOPQRSTUVWXYZ!@# - 39 символов, если я , конечно, не обсчитался. Это должно наводить на мысли.
--------------------
|
|
|
|
Guest_@Ark_*
|
Sep 20 2009, 10:16
|
Guests

|
Цитата Раз что-то передается, значит схема, скорее всего, правильная. К сожалению, еще ничего не значит. Примеры - там же...
|
|
|
|
|
Sep 21 2009, 02:24
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 16-05-05
Пользователь №: 5 083

|
Цитата(amdei @ Sep 21 2009, 05:23)  Вот жеж блин! Черт! Вот везде написано, что мол не получиться у вас втыкать USART в COM-порт напрямую, так чтобы всё работало без преобразователя уровней. Но вот почему- или мелким шривтом на полях, либо вообще никак. А дело-то все в том, что логический ноль в RS-232 - это ПОЛОЖИТЕЛЬНОЕ напряжение. А в TTL - ноль это ноль. Соответственно, даже если COM-порт на компьютере воспринимает не +/- 12V, а 0/+5 - ему все равно инвертор нужен. Отсюда вывод: если на устройстве написано, что оно выдает данные в формате RS-232, но напряжение TTL-ное (как на моем сонаре) - это значит что напрямую воткнуть его в Tiny не выйдет....
|
|
|
|
Guest_@Ark_*
|
Sep 21 2009, 05:33
|
Guests

|
Цитата Сбило меня с понталыку то, что устройство (LV-MaxSonar-EZ1), будучи подключенное к COM-порту напрямую прекрасно работет. Без сбоев. Несмотря на то что на выходе там TTL-уровни в чистом виде. Цитата Вот везде написано, что мол не получиться у вас втыкать USART в COM-порт напрямую, так чтобы всё работало без преобразователя уровней. Работать с COM-портом без преобразователя можно. Но через встроенный UART - не получится. В этом случае используется программный UART, где можно использовать уже инвертированые сигналы. http://electronix.ru/forum/index.php?s=&am...st&p=411456
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|