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

 
 
 
Reply to this topicStart new topic
> Как заставить работатьUSART на Tiny2313?, искажает принимаемые и передаваемые данные
amdei
сообщение Sep 20 2009, 00:37
Сообщение #1


Участник
*

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



Tiny2313 на 12 МГц.
Пытаюсь заставить принимать данные от внешнего устройства.

Принимает она совсем не то что передается. sad.gif
Инициализация и прочие параметры - как во множестве примеров в интернете.
BAUD расчитан по формуле на 118 странице мануала - 77.
Делитель частоты на 8 убран.
В Протеусе всё работает как часы.

Шью в железку - принимает и передает мусор (повторяющийся).

Tiny менял на другой такой-же экземпляр. Кварц менял. С фьюзами игрался. Даташит читал. BAUD менял туда-сюда. Не работает.

Написал прграммулину, что записывает принимаемые данные в EEPROM - мусор.
Написал прграммулину, выдающую фиксированную строку на терминал - мусор!
В Протеусе всё работает как часы.

Скажите, в каком месте мне стоит руки поправить?
Какая информация поможет локализовать проблему?
Go to the top of the page
 
+Quote Post
vovanse
сообщение Sep 20 2009, 01:05
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 14-02-06
Из: Кемерово
Пользователь №: 14 293



Покажите программу.
Go to the top of the page
 
+Quote Post
amdei
сообщение Sep 20 2009, 08:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Sep 20 2009, 09:06
Сообщение #4





Guests






Цитата
Покажите программу...

... и схему устройства.

amdei! На этом форуме, UART - "дежурная тема". smile.gif
Поищите в разделе для начинающих. Там множество примеров, как отыскать причину неправильной работы.
Но сначала, Вам нужно убедиться, что схема подключения правильная.
Go to the top of the page
 
+Quote Post
GDI
сообщение Sep 20 2009, 10:03
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Раз что-то передается, значит схема, скорее всего, правильная. А неправильный прием случается из-за неправильной установки скорости передачи-приема, а возможно, и других параметров, стоп-битов, четности и т.п. Вообще 12МГц это нетипичный кварц для работы с УАРТом, хотя, все зависит еще и от той скорости которую нужно получить, а автор об этом ничего не сказал.

T-"'___}{ywusqomqigeca_][YWUSQOMK_№е_> - 40 символов
1234567890ABCDEFGHIGKLMNOPQRSTUVWXYZ!@# - 39 символов, если я , конечно, не обсчитался. Это должно наводить на мысли.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Sep 20 2009, 10:16
Сообщение #6





Guests






Цитата
Раз что-то передается, значит схема, скорее всего, правильная.

К сожалению, еще ничего не значит. Примеры - там же...
Go to the top of the page
 
+Quote Post
vvs157
сообщение Sep 20 2009, 12:08
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(amdei @ Sep 20 2009, 04:37) *
Написал прграммулину, выдающую фиксированную строку на терминал - мусор!
Пустите в цикле предачу 0х55 и посмотрите осциллографом что там на выходе
Go to the top of the page
 
+Quote Post
amdei
сообщение Sep 21 2009, 01:23
Сообщение #8


Участник
*

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



ООО!!! Свершилось!

2@Ark: спасибо за отсылку к схеме!
2vvs157: Ну да... "Сами мы не местные...", осцилографов у нас не водиться...

Вобшем дело было в тупняке: MAX232 таки нужна.
Возникает вопрос: неужто я настолько туп что этого не знал? К сожалению это не так.
Сбило меня с понталыку то, что устройство (LV-MaxSonar-EZ1), будучи подключенное к COM-порту напрямую прекрасно работет. Без сбоев. Несмотря на то что на выходе там TTL-уровни в чистом виде.
А если его эхом подключить через Tiny, то первую полусотню символов на выход выдаются правильно, а потом - мусор.
Поэтому я полез в программу и кристалы, а не в конверсию TTL в RS232....

Вот жеж блин!
Go to the top of the page
 
+Quote Post
amdei
сообщение Sep 21 2009, 02:24
Сообщение #9


Участник
*

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



Цитата(amdei @ Sep 21 2009, 05:23) *
Вот жеж блин!


Черт!
Вот везде написано, что мол не получиться у вас втыкать USART в COM-порт напрямую, так чтобы всё работало без преобразователя уровней.
Но вот почему- или мелким шривтом на полях, либо вообще никак.

А дело-то все в том, что логический ноль в RS-232 - это ПОЛОЖИТЕЛЬНОЕ напряжение. 1111493779.gif
А в TTL - ноль это ноль.
Соответственно, даже если COM-порт на компьютере воспринимает не +/- 12V, а 0/+5 - ему все равно инвертор нужен.
Отсюда вывод: если на устройстве написано, что оно выдает данные в формате RS-232, но напряжение TTL-ное (как на моем сонаре) - это значит что напрямую воткнуть его в Tiny не выйдет....
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Sep 21 2009, 05:33
Сообщение #10





Guests






Цитата
Сбило меня с понталыку то, что устройство (LV-MaxSonar-EZ1), будучи подключенное к COM-порту напрямую прекрасно работет. Без сбоев. Несмотря на то что на выходе там TTL-уровни в чистом виде.

Цитата
Вот везде написано, что мол не получиться у вас втыкать USART в COM-порт напрямую, так чтобы всё работало без преобразователя уровней.

Работать с COM-портом без преобразователя можно. Но через встроенный UART - не получится. В этом случае используется программный UART, где можно использовать уже инвертированые сигналы.
http://electronix.ru/forum/index.php?s=&am...st&p=411456
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 09:23
Рейтинг@Mail.ru


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