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

 
 
> Как заставить работать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
 
Start new topic
Ответов
amdei
сообщение Sep 20 2009, 08:32
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 20:05
Рейтинг@Mail.ru


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