roboforum.ru

Технический форум по робототехнике.

Скорость UART (Mega162)

Скорость UART (Mega162)

Strijar » 14 ноя 2007, 17:12

Может кто сталкивался - работает только до 38000бод. 9600, 19200 - замечательно. 57600 уже с ошибками, 115200 не один байт не попадает. Кварца нет, на внутреннем 8мгц. Не критично пока - просто не приятно ;)

Код: Выделить всёРазвернуть
#include <avr/interrupt.h>
#include <avr/io.h>

#define BAUD    9600

void UartSend(char *str) {
    char *data = str;

    while (*data) {
        while (! (UCSR0A & (1 << UDRE0)) ) {
            __asm__ __volatile__ ("nop");
        }
        UDR0 = *data;
        data++;
    }
}

void UartChar(char data) {
    while (! (UCSR0A & (1 << UDRE0)) ) {
        __asm__ __volatile__ ("nop");
    }
    UDR0 = data;
}

void UartInit() {
    unsigned int baud;

    baud = F_CPU/(16L*BAUD)-1;

    UBRR0H = (unsigned char)(baud >> 8);
    UBRR0L = (unsigned char)(baud);

    UCSR0B = (1 << RXEN0) | (1 << TXEN0);
    UCSR0C = (1 << URSEL0) | (1 << UCSZ01) | (1 << UCSZ00);
}

Re: Скорость UART (Mega162)

Vooon » 14 ноя 2007, 18:14

Strijar писал(а):Кварца нет, на внутреннем 8мгц.

без кварца у меня 38400 фигово шло.

Re: Скорость UART (Mega162)

Myp » 14 ноя 2007, 18:40

тык там вовсе и не 8 мГц а лишь примерно...
на внутреннем кварце уарт делать гиблое дело (собсно это гуру рассказали)

57600 уже с ошибками

так вы табличку ошибок посмотрите
там ужо 3.7% ошибок будет(это если с номаным кварцем точным)
а у вас исчо хуже

рекомендую купить кварц с дробным значением чтобы на всех частотах иметь ошибку 0.0%

Re: Скорость UART (Mega162)

Digit » 14 ноя 2007, 18:41

На внутреннем частота плавает (ее можно с помощью каких-то там регистров подправить, чтоб поточнее было, но на сильный эффект можно не рассчитывать). Внешний кварц хороший повесишь - все запашет как часы :)
хо, вот так мы хором =)

Re: Скорость UART (Mega162)

Strijar » 14 ноя 2007, 19:30

Ага, ясно, спасибо. Приготовлены кварцы на 16 и 20, но пока не хочу - питание 3,3в, опасаюсь, что не стабильно начнет работать.

Re: Скорость UART (Mega162)

Master » 14 ноя 2007, 22:32

Digit правильно говорит в ДШ есть таблица с процентами ошибок для разных частот и скоростей. А на внутреннем генераторе фигово делать он не точный.

Re: Скорость UART (Mega162)

Strijar » 15 ноя 2007, 10:06

ДШ читал, таблицу видел. Что мне до тех процентов? - я-ж не знаю сколько "норма" ;) В идеале поставить бы кварц на 18.434, но уже куплены на 16 и 20.. да и фиг с ним - пока не критично, мне для отладки и 9600 хватает ;)

Re: Скорость UART (Mega162)

avr123.nm.ru » 15 ноя 2007, 10:35

Strijar писал(а): я-ж не знаю сколько "норма" ;) ;)


Мастер CVAVR подскажет ! :D

Re: Скорость UART (Mega162)

rig » 15 ноя 2007, 11:22

вопрос как говорится в тему, если я поставлю два кварца одинаковых на двух мк и налажу обмен межу ними по UART ошибок по идее не должно быть , кто нибудь пробовал ?

Re: Скорость UART (Mega162)

Strijar » 15 ноя 2007, 11:25

Да. Не важна какая скорость - хоть 58001 бод ;) главное что-бы второй ту же использовал

Re: Скорость UART (Mega162)

SSG » 15 ноя 2007, 13:54

А в 162 разве UART, а не USART?
Можно мультипроцессорную конфигурацию забаловать.

Re: Скорость UART (Mega162)

Strijar » 16 ноя 2007, 00:27

SSG писал(а):А в 162 разве UART, а не USART?


Если чесно - не вижу разницы ;) А мультипроцессорную конфигурацию ИМХО проще делать на SPI

Re: Скорость UART (Mega162)

Digit » 16 ноя 2007, 01:02

Strijar писал(а):А мультипроцессорную конфигурацию ИМХО проще делать на SPI


Это почему еще? :) Это к каждому процику тянуть отдельный CS? ...проводов не напасешься! И портов! :) I2C рулит! :)

Re: Скорость UART (Mega162)

Strijar » 16 ноя 2007, 01:32

Digit писал(а):Это почему еще? :) Это к каждому процику тянуть отдельный CS? ...проводов не напасешься! И портов! :) I2C рулит! :)


Ну тогда уж RS-485! ;) Не везде есть I2C.. а ноги можно сэкономить с помощью дешифратора - на 4 ноги можно повесить 16 CS, на 5 ног уже - 32 ;) Творчески надо мыслить!

Re: Скорость UART (Mega162)

Digit » 16 ноя 2007, 01:40

Та ну брось! :) Практически во всех атмеловских чипах (что поновее) есть I2C (он же TWI). На худой конец, есть USI, который конфигурируется на работу в режиме TWI.
А дешифратор - это лишний корпус на плате...
Что же касается RS-485, так я бился - хотел сделать переходничок I2C на две витые пары (RS-485), но что-то не вышло и я забросил. Так бы было кашерно :D Нравится мне, что в I2C мультимастер поддерживается и есть арбитраж на шине. И не нравится, что к помехам не стойкая шина. А вот скрестить если с RS-485, то будет гуд - и помехоустойчиво, и реализация I2C на "железном" уровне, и расстояния передачи данных за счет RS-485 огромные... :crazy:


Rambler\'s Top100 Mail.ru counter