Работа ATMega8 с UART

Обсуждаем контроллеры компании Atmel.
Ответить
afynfpbz
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт сен 21, 2012 22:58:16

Работа ATMega8 с UART

Сообщение afynfpbz »

Пожалуйста, подскажите, что не так:

Код: Выделить всё

#define F_CPU 8000000UL 
#include <avr/io.h>
#include <util/delay.h>

void lUartInit (void)
{
   PORTD |= 0x03;
   DDRD &= ~0x01;
   DDRD |= 0x02;
   
   UCSRB = 0x00;
   
   UBRRH = 0x00; // UBRR = (Fck/(16*BAUD)) – 1 ;
   UBRRL = 0x03; // Для 8Мгц и 115200; UBRR = 8000000/(16*115200) – 1 = 3,34...
   
   UCSRA = 0;
   UCSRB =
      (1<<RXEN)  | // разрешает работу приёмника
      (1<<TXEN)  ; // разрешает работу передатчика
   UCSRC =
      (1<<URSEL) | // если установлен в 1 запись производится к UCSRC (иначе в UBRRH)
      (1<<USBS)  | // кол-во стоп битов 0-1; 1-2
      (1<<UCSZ1) |
      (1<<UCSZ0) ;
}

void lUartSend ( uint8_t data )
{
   while ( !(UCSRA & (1 << UDRE)) );
   UDR = data;
}

void delay_ms(unsigned int ms)
{
   while(ms){
      _delay_ms(0.96);
      ms--;
   }
}

int main(void)
{
   lUartInit();
   uint8_t j = 0;
    while(1)
    {
      _delay_ms(1000);
      j++;
      lUartSend(j);
    }
}


И вот что имею в выводе:
86 87 88 89 8A 8B 8C 8D 8E * 8F 80 * 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E * 8F 90 * 91

Т.е. иногда бит переносится правильно, иногда нет.
Проблема не только при переходе с 8F:

CB CC CD CE CF *ок!* D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF *fail!* D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF *уже ок!* E0 E1

Я не вижу очевидной ошибки?

Смена uint8_t j = 0; на int j; эффекта не дает.

p.s. При этом тот же контроллер, если перепрошить, с ENC28J60 работает нормально, включая розетки по сети. И счетчик web-команд там работает корректно, специально дописал. Купил UART, думал отлаживать попроще будет.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Работа ATMega8 с UART

Сообщение zero648 »

В даташите на мегу посмотри про UART, там есть таблица по кварцам и бодам и подбирай чтобы 0% ошибок было
afynfpbz
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт сен 21, 2012 22:58:16

Re: Работа ATMega8 с UART

Сообщение afynfpbz »

Но здесь не проблема синхронизации, иначе бы выпадала "пара битов" и счет шел бы потом ровно. Здесь проблема после байта nF , либо будет (n+1)0 как надо, либо вдруг снова считает с n0 еще раз. Эхо через прерывание работает без ошибок.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Работа ATMega8 с UART

Сообщение ILYAUL »

zero648 писал(а):В даташите на мегу посмотри про UART, там есть таблица по кварцам и бодам и подбирай чтобы 0% ошибок было
Аватара пользователя
DruidCat
Встал на лапы
Сообщения: 116
Зарегистрирован: Чт май 03, 2012 06:27:23
Откуда: Челябинск

Re: Работа ATMega8 с UART

Сообщение DruidCat »

Посмотри вот тут
viewtopic.php?f=20&t=6909&start=1200
В внизу страницы последняя версия кода. Проверяли на симуляторе и железе. Все работает. Сравни исходные коды. Там я тоже для мега8 писал.
Кот должен прожить жизнь без сожаления.
afynfpbz
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт сен 21, 2012 22:58:16

Re: Работа ATMega8 с UART

Сообщение afynfpbz »

Спасибо, вопрос снят, т.к. найдены решения:
1) связь на 9600 , как в указанном примере, (не хорошо, конечно, но т.к. UART мне только для отладки пойдет, а то подключал сеть, а она примерно 3,5Кб из 8 отъедает; и байт 170 оперативки на буфер)
UBRRL = 0x33; // Для 8Мгц и 9600; UBRR = 8000000/(16*115200) – 1 = 51,08
2) ATMega16 не глючит (на железе) на том же коде при 115200. Из этого следует предположение, что у меня аппаратная проблема с ATMega8.

До сих пор не понимаю, вот же код:
while(1) { _delay_ms(1000); j++; lUartSend(j); }
а переменная j "прыгает", т.е. внешне выглядит, что ATMega не правильно выполняет j++; и UART ни при чем.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Работа ATMega8 с UART

Сообщение Kavka »

Ну, снова... :evil:
:)
При 8 битах без паритета погрешность скорости должна быть не более 1.5%. Рекомендуется в спецификации.
При кварце на 8МГц и скорости 115.2k отклонение скорости составит 8.5% !!!! Вот у вас и прут ошибки.
Можно попробовать включить U2X = 1, тогда отклонение будет -3.5%. Хотя и это может не помочь.
Курите даташит. Учите мат. часть. :)

Варианта два - менять кварц или снижать скорость.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

Вернуться в «AVR»