Всем привет! Господа, такой вопрос. Решил поработать с USARTом на ATMega8, код пишу на C++ в IARe 6.11. Сложность возникла в самом начале, в регистре управления UCSRC. Сложность в том, что этот регистр и регистр управления скоростью обмена UBRRH имеют один и тот же адрес. То, к какому из них обращается программа при записи данных определяет старший бит URSEL записываемого значения. Если он сброшен - данные записываются в UBRRH (например 0b01101101) и определяют скорость обмена, если установлен - данные пишутся в UCSRC (например 0b11101101) и конфигурируют другие параметры USART. Проблема в том, что я не могу изменить один регистр независимо от другого. По крайней мере так я вижу при симуляции в окошке регистров - изменение UBRRH ведёт к такому же изменению UCSRC и наоборот, независимо от бита URSEL. Вот кусочек кода:
#include <iom8.h> #include <intrinsics.h> #define ENABLE_BIT_DEFINITIONS
void main() { UCSRA |= (1<<1); //Удвоение скорости обмена UCSRB |= (1<<7)|(1<<4); //Разреш. приёма и прерываний от приёмника UBRRH = 0x12; //URSEL = 0, но UCSRC принимает тоже значение 0x02!!! UCSRC |= (1<<7)|(1<<5); //URSEL = 1, но UBRRH принимает тоже значение 0xA0!!!
Может, это глюк компилятора при симуляции? Подскажите, кто знает. Заранее благодарен!
|