Страница 1 из 1
USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 11:46:27
Alkul
Приветствую всех.
Коллеги, зашел в тупик, может, кто-нибудь сталкивался с таким.
Имею контроллер ATmega168.
В проекте требуется организовать связь через USART. Раньше (на младших моделях типа ATmega16) делал это "сто раз", а на упомянутом контроллере - споткнулся.
Инициализирую так:
Код: Выделить всё
.cseg
.org 0x00
jmp RESET
...
далее вся таблица векторов прерываний
...
RESET: ldi R16, high(RAMEND) ;Инициализация стека
out SPH,R16 ;
ldi R16, low(RAMEND) ;
out SPL,R16 ;вершина стека - RAMEND
ldi R16,0x00 ;Скорость обмена
ldi R17,0x0A ;выбирается
sts UBRR0H,R16 ;равной 115200 б/с
sts UBRR0L,R17 ;для тактовой частоты 20МГц
ldi R16,0x06 ;Устанавливаю 8-ми битный
sts UCSR0C,R16 ;формат кадра
ldi R16,0xD8 ;Разрешаю приемник и передатчик
sts UCSR0B,R16 ;и прерывания по приему и передаче
sei ;Общее разрешение прерываний
TEST: nop
nop
jmp TEST
А теперь суть вопроса. Компилирую в среде AVR Studio 5, запускаю отладку. При установке вручную флага прерывания по передаче байта (TXC) отладчик по таблице векторов корректно переходит на соответствующий обработчик. А вот при установке флага прерывания по приему (RXC) нет никакой реакции - отладчик продолжает крутится внутри холостого цикла TEST.
Пробовал то же самое сделать в среде AVR Studio 4 - с тем же эффектом - обработчик прерывания по приему байта не вызывается.
Это глюк среды разработки, или же "я что-то упускаю"?
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 11:51:00
ploop
А не запутались ли вы в битах настройки? С такими записями легко.
Лучше перепишите код в таком стиле:
Код: Выделить всё
ldi R16,(1<<TXEN)|(1<<RXEN)|(1<<RXCIE)
out UCSRB,R16
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 11:56:12
Alkul
ploop писал(а):А не запутались ли вы в битах настройки? С такими записями легко.
Так я же в отладчике вижу, что все требуемые биты в регистрах установились правильно. Там все ОК.
ploop писал(а):Лучше перепишите код в таком стиле:
Код: Выделить всё
ldi R16,(1<<TXEN)|(1<<RXEN)|(1<<RXCIE)
out UCSRB,R16
Попробую, вот только нельзя сделать так, как Вы написали.
разве что вот так:
Код: Выделить всё
ldi R16,(1<<TXEN)|(1<<RXEN)|(1<<RXCIE)|(1<<TXCIE)
sts UCSRB,R16
ибо регистры в контроллере размещены в более старших адресах и команды IN, OUT (а также SBIC и SBIS) не могут обращаться к этим регистрам
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:05:32
ploop
Я в курсе, написал для примера, показать форматирование.
Не знаю, что может быть... RXCIE бит точно стоит?
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:10:15
BerZerK-ku
Настройки вроде бы верные.
Как вариант могут быть следующие причины:
1. При установке UCSR0C старший бит должен быть 1, иначе запись ведется в регистр UBRR0H. Хотя это может повлиять только на скорость.
2. Не тот адрес у вектора прерывания.
3. В студии просто не работает это прерывание, проверьте еще например в Proteus.
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:17:52
Alkul
ploop писал(а):Я в курсе, написал для примера, показать форматирование.
Не знаю, что может быть... RXCIE бит точно стоит?
Вот так выглядит окно в отладчике после выполнения инициализирующего кода

Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:26:38
Alkul
BerZerK-ku писал(а):Настройки вроде бы верные.
Как вариант могут быть следующие причины:
1. При установке UCSR0C старший бит должен быть 1, иначе запись ведется в регистр UBRR0H. Хотя это может повлиять только на скорость.
Это справедливо для контроллера ATmega16, у которого регистры UBRRH и UCSRC находятся по одному адресу (0x40).
У ATmega168 регистр UBRR0H находится по адресу 0xC5, а регистр UCSRC - по адресу 0xC2
BerZerK-ku писал(а):2. Не тот адрес у вектора прерывания.
Он даже не делает попытки "перескочить" хоть на какой-то адрес из таблицы векторов. При этом прерывание по передаче байта (флаг TXC0) имитируется прекрасно - устанавливаю флаг TXC0 и через таблицу векторов перехожу на соответствующий обработчик.
BerZerK-ku писал(а):3. В студии просто не работает это прерывание, проверьте еще например в Proteus.
Вот это я и хочу выяснить. Proteus'а у меня нет, никогда им не пользовался. Хорошо, попробую найти его и установить.
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:29:07
ploop
Я бы сразу в железке проверил
По поводу картинки:

Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:41:57
Alkul
ploop писал(а):Я бы сразу в железке проверил

Да нет пока железки
Еще плату не заказали, "комплектуху" не купили... Я хотел в отладчике по-быстрому отладиться и перейти к другому проекту, который "горит". За месяц, который потребуется для "тушения" горящего проекта, мне как раз изготовят "железку" для этого проекта.
Просто не люблю оставлять за спиной "не сдавшиеся крепости"
ploop писал(а):По поводу картинки:
Поправил, гляньте снова, пожалуйста.
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 12:50:55
Engineer_Keen
Не вижу никакой проблемы

Приведенный в первом сообщении код (добавил только строчку с .include для меги168), работает как в студии (4), так и в протеусе. При ручной установке RXC0 в студии программа перескакивает на 19-й вектор. То же самое и при вводе с терминала в протеусе.
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 13:06:32
BerZerK-ku
BerZerK-ku писал(а):1. При установке UCSR0C старший бит должен быть 1, иначе запись ведется в регистр UBRR0H.
Это я доверился товарищу А.В. Евстифееву, вношу очередное исправление на полях

Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 13:11:47
Alkul
Engineer_Keen писал(а):Не вижу никакой проблемы

Приведенный в первом сообщении код (добавил только строчку с .include для меги168), работает как в студии (4), так и в протеусе. При ручной установке RXC0 в студии программа перескакивает на 19-й вектор. То же самое и при вводе с терминала в протеусе.
Огромное Вам спасибо за помощь.
Буду разбираться со своими средами разработки.
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 13:12:50
Alkul
BerZerK-ku писал(а):Это я доверился товарищу А.В. Евстифееву, вношу очередное исправление на полях

-Век живи, век учись, сказал поручик Ржевский.

Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 14:29:24
Alkul
Коллеги, интересная вещь.
Переустановил AVR Studio 4.19, запускаю проект (в режиме AVR Simulator 2) - та же история, установка флага RXC0 не вызывает срабатывания прерывания.
Попробовал скомпилировать проект в режиме AVR Simulator - все заработало как надо, ставлю вручную флаг RXC0 - есть переход на обработчик!
Что-то мне совсем непонятно стало - в чем может быть причина? Кто копал глубже - в чем отличия режима AVR Simulator от режима AVR Simulator 2 ?
Я-то пользовался режимом AVR Simulator 2 как, якобы, более новым и прогрессивным... контроллер вроде тоже не совсем старый...
Может кто-то пояснить что-либо по этому поводу?
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 14:41:22
Engineer_Keen
Я вот всегда стараюсь именно первым симулятором пользоваться. Но и в нем изредка попадаются ошибки. Однажды точно также не срабатывало прерывание одного из таймеров (в какой-то меге, точно не помню), а в железе все прекрасно работало.
Re: USART контроллера ATmega186 - помогите разобраться
Добавлено: Пн янв 16, 2012 21:14:20
Jack_A
Engineer_Keen писал(а): Однажды точно также не срабатывало прерывание одного из таймеров (в какой-то меге, точно не помню), а в железе все прекрасно работало.
Я когда-то тоже на это нарвался. Пот`ом в последующем релизе Студии они багу исправили.