roboforum.ru

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

Нужна помощь. в UART приходят одни нули

Нужна помощь. в UART приходят одни нули

yozik0ff » 26 июл 2012, 13:12

Начинаю делать новый проект,
робот на базе компонентов от pololu.
Точнее на avr atmega328p.
Прикрутил два сдвиговых регистра, которые управляют матрицей светодиодной. Заработало.
Далее мне нужно реализовать usart.
Написал программу. Пока еще в робота не залил.
Но решил протестировать прошивку в proteusе.
Сделал схему.
Запустил, матрица типа заработала (вру светодиоды неправельно горят, ну и ладно, главное они светятся).
А вот по терминалу, какаято херь идет. Одни нули.
Сдается мне, я неправельно сконфигурировал проект симуляции?
Или неправельно инцеализировал USART.
Может у когонибудь есть время поковырять мой код?

Весь проект прикрепил к посту.
Там есть файлы и папки:
/Симуляция/1.dsn - проект протеуса
/TrackPixel/TrackPixel.atsln - проект на atmel studio 6
/TrackPixel/Debug/TrackPixel.hex - прошивка



В краце опишу как инициализирую usart
где F_CPU = 20000000
Код: Выделить всёРазвернуть
   /* настройка скорости
   */
   int baud = 9600;
   unsigned int baud_ubrr = (F_CPU - 8 * baud) / (16 * baud);
   UBRR0 = baud_ubrr;
   
   /* разрешаем прерывания при риеме и передачи данных
   */
   UCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);
   UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); //размер слова 8 разрядов
   
   
   
   UCSR0A = (1<<RXC0)|(1<<UDRE0);
   
   // Enable interrupts in general.
   sei();


Добавлено спустя 2 часа 26 минут 51 секунду:
Запустил на эмуляторе, что идет в комплекте со студией. Там прекрасно обрабатывается вызываются прерывания на то что данные доставлены.
Интересно, в протеусе можно поднять листинг программы? там брекпоинты хочется поставить итд.
Вложения
TrackPixel.rar
(245.35 КиБ) Скачиваний: 0

Re: Нужна помощь. в UART приходят одни нули

yozik0ff » 30 июл 2012, 13:42

УРА нашел проблему.
Все дело в этой строчке

int baud = 9600;
unsigned int baud_ubrr = (F_CPU - 8 * baud) / (16 * baud);
UBRR0 = baud_ubrr;

переменную baud нужно объявить не как int а как unsigned long.
И тогда все встанет на свои места.
Почему так происходит?
Компилиятор, он ведь оптемезирует код бездушно. Видит что указанно число как int и соответственно строит кусок кода для вычесления с учетом int. Но в процессе вычисления, реультат становится очень большим, и он невлеает в те переменные которые заготовил компилятор в прогамме.
выход - явно указать максимальный большой тип чисел.

Re: Нужна помощь. в UART приходят одни нули

dccharacter » 30 июл 2012, 14:50

а если не чудить, а
1) посчитать в калькуляторе
2) написать #define - компилятор развернет
3) переписать формулу как (F_CPU/baud - 1)/2

Re: Нужна помощь. в UART приходят одни нули

yozik0ff » 30 июл 2012, 15:07

У меня программно настраивается скорость уарта. Передается скорость передачи, и оно само настраивает порт.
--
теперь пишу оболочку для управлением системы через терминал. В протеусе все отлично работает. В железе еще не тестировал, ибо замучил досмерти свой контроллер.


Rambler\'s Top100 Mail.ru counter