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

 
 
> Только начинаю
anaconda
сообщение Jan 18 2010, 20:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 18-11-07
Пользователь №: 32 418



Добрый вечер!
Только начинаю пользоваться IAR v5.30 для AVR. Сделал простенькую программку для вывода байта в USART0(контроллер Atmega162). Проверяю в Proteus и вижу, что в USART выводится не то, что должно. Частота кварца 7,372800 MHz baud rate=9600, 8data,1stop,no parity. В чем может быть ошибка?
Прикрепленные файлы
Прикрепленный файл  Test.rar ( 10.49 килобайт ) Кол-во скачиваний: 24
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jan 18 2010, 22:20
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(anaconda @ Jan 18 2010, 22:13) *
В чем может быть ошибка?
1)Озаглавливайте тему осмысленно. Темы с неинформативными названиями в большинстве случаев попросту игнорируются многими участниками ("идут в сад сразу").
2) переменные, которые изменяются в прерываниях и используются в программе обязательно должны объявляться с квалификатором volatile. Поищите по форуму - это наиболее часто встречаемая ошибка начинающих не обошла и вас.
3) Не используйте "магические числа" в инициализации периферии. То, что у вас рядом написан комментарий не исключает ошибки в процессе перевода битов в число, т.е. комментарий может элементарно не соответствовать коду. У вас в руках мощный инструмент препроцессора и компилятора, используйте его:
Код
#define F_OSC  7372800UL
#define  RS485_BAUDRATE   115200

    UBRR0H = ((unsigned)(F_CPU/(8.0 * RS485_BAUDRATE)-0.5)>>8)&0x0F;
    UBRR0L = ((unsigned)(F_CPU/(8.0 * RS485_BAUDRATE)-0.5))&0xFF;
    UCSR0A = (1<<U2X0);
    UCSR0B = (0<<RXCIE0)|(0<<TXCIE0)|(0<<UDRIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);
    UCSR0C = (1<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
Такой код элементарно читается даже без комментариев. Ну в крайнем случае заглянуть в даташит на предмет "что же означает эта комбинация битов UCSZ", но не тратить время на перевод обратно из 16-ричного числа в комбинацию битов. По этой причине не проверял правильность ваших магических чисел.
4) ваш код будет работать неэффективно - между байтами будет пауза. Используйте прерывание UDR. Вот совсем свежая дискуссия на тему прерываний UDR и TXC.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 17:57
Рейтинг@Mail.ru


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