roboforum.ru

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

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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Нужна помощь. в 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
Аватара пользователя
yozik0ff
 
Сообщения: 440
Зарегистрирован: 28 авг 2005, 08:30
Откуда: деревня - Тюмения
прог. языки: с++

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. Но в процессе вычисления, реультат становится очень большим, и он невлеает в те переменные которые заготовил компилятор в прогамме.
выход - явно указать максимальный большой тип чисел.
Аватара пользователя
yozik0ff
 
Сообщения: 440
Зарегистрирован: 28 авг 2005, 08:30
Откуда: деревня - Тюмения
прог. языки: с++

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

Сообщение dccharacter » 30 июл 2012, 14:50

а если не чудить, а
1) посчитать в калькуляторе
2) написать #define - компилятор развернет
3) переписать формулу как (F_CPU/baud - 1)/2
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

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

Сообщение yozik0ff » 30 июл 2012, 15:07

У меня программно настраивается скорость уарта. Передается скорость передачи, и оно само настраивает порт.
--
теперь пишу оболочку для управлением системы через терминал. В протеусе все отлично работает. В железе еще не тестировал, ибо замучил досмерти свой контроллер.
Аватара пользователя
yozik0ff
 
Сообщения: 440
Зарегистрирован: 28 авг 2005, 08:30
Откуда: деревня - Тюмения
прог. языки: с++


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19