Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как заставить работатьUSART на Tiny2313?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
amdei
Tiny2313 на 12 МГц.
Пытаюсь заставить принимать данные от внешнего устройства.

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

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

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

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

Скажите, в каком месте мне стоит руки поправить?
Какая информация поможет локализовать проблему?
vovanse
Покажите программу.
amdei
Вот:

Код
#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_№е_>
@Ark
Цитата
Покажите программу...

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

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

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

К сожалению, еще ничего не значит. Примеры - там же...
vvs157
Цитата(amdei @ Sep 20 2009, 04:37) *
Написал прграммулину, выдающую фиксированную строку на терминал - мусор!
Пустите в цикле предачу 0х55 и посмотрите осциллографом что там на выходе
amdei
ООО!!! Свершилось!

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

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

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


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

А дело-то все в том, что логический ноль в RS-232 - это ПОЛОЖИТЕЛЬНОЕ напряжение. 1111493779.gif
А в TTL - ноль это ноль.
Соответственно, даже если COM-порт на компьютере воспринимает не +/- 12V, а 0/+5 - ему все равно инвертор нужен.
Отсюда вывод: если на устройстве написано, что оно выдает данные в формате RS-232, но напряжение TTL-ное (как на моем сонаре) - это значит что напрямую воткнуть его в Tiny не выйдет....
@Ark
Цитата
Сбило меня с понталыку то, что устройство (LV-MaxSonar-EZ1), будучи подключенное к COM-порту напрямую прекрасно работет. Без сбоев. Несмотря на то что на выходе там TTL-уровни в чистом виде.

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

Работать с COM-портом без преобразователя можно. Но через встроенный UART - не получится. В этом случае используется программный UART, где можно использовать уже инвертированые сигналы.
http://electronix.ru/forum/index.php?s=&am...st&p=411456
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.