Страница 1 из 1
Помогите плиз с прерываниями
Добавлено: Пт окт 24, 2008 13:07:41
Артур
Скажите пожалуйста в чем проблема? Не вызывается прерывание окончания передачи UART
Код: Выделить всё
;включаем файл описания контроллера AT90S2313
.include "C:\Program Files\Atmel\AVR Tools\AvrStudio4\include\AT90S2313def.inc"
.def temp=r16
.def temp2=r17
.def temp3=r18
.cseg
.org 0
rjmp RESET ;Прерывание от вывода сброса
nop ;rjmp EXT_INT0 ;External Interrupt0 Vector Address
nop ;rjmp EXT_INT1 ;External Interrupt1 Vector Address
nop ;rjmp TIM_CAPT1 ;Input Capture1 Interrupt Vector Address
nop ;rjmp TIM_COMP1 ;Output Compare1 Interrupt Vector Address
nop ;rjmp TIM_OVF1 ;Overflow1 Interrupt Vector Address
nop ;rjmp TIM_OVF0 ;Overflow0 Interrupt Vector Address
nop ;rjmp UART_RXC ;Прерывание по окончании приема UART
nop ;rjmp UART_DRE ;Прерывание по пустому регистру данных UART
rjmp UART_TXC ;Прерывание по окончании передачи UART
nop ;rjmp ANA_COMP ;Прерывание от аналогового компаратора
;Начало основной программы
RESET:
ldi temp, low(ramend);установка стека
out spl,temp
clr temp
;Настройка UART
ldi temp,25 ;Скорость обмена 9600 бод (для 4Мгц ошибки 0,2%)
out ubrr,temp
ldi temp,1<<txb8|1<<txen|1<<txcie;режим 8N1 бит, передачу разрешить, прерывание по окончании передачи
out ucr,temp
SEND:
sei
ldi temp,'a' ;отправка символа ACSII
out udr,temp
rjmp reset
;Обработчик прерывания окончания передачи
uarttxc:
rjmp SEND
reti
Добавлено: Пт окт 24, 2008 15:21:12
akl
Код: Выделить всё
;включаем файл описания контроллера AT90S2313
.
;*******************************************************
Здравствуйте. Попробовал Ваш код в "студии" и:
-постоянная инициализация UART не дает передатчику нормально завершить передачу;
- после окончания передачи (обработка прерывания) нормальный выход нужно делать командой RETI
Добавлено: Пт окт 24, 2008 15:28:50
tych
Надо отловить баги в симуляторе.
Добавлено: Пт окт 24, 2008 17:12:47
YurkaM
вот так, например, попробуй
Код: Выделить всё
.....
out ucr,temp
rcall uarttxc ;первый раз на отправку символа принудительно, потом по прерываниям
main_loop: ;основной цикл
nop ;здесь можно делать чего-нить полезное...
rjmp main_loop ;на начало цикла
;Обработчик прерывания окончания передачи
uart_txc:
ldi temp,'a' ;отправка символа ACSII
out udr,temp
reti
А лучше сам внимательно разберись, почему у тебя не работает. Используй пошаговую отладку в симуляторе, как уже советовали (хотя тут и без симулятора ошибки налицо - возможно просто невнимательность...)
Добавлено: Сб окт 25, 2008 02:45:21
Артур
Спасибо! Пробовал как сказали но без результата!

Почему не срабатывает прерывание? Программа не переходит на вектор
Код: Выделить всё
rjmp UART_TXC ;Прерывание по окончании передачи UART
Использую АВР СТУДИЮ
akl писал(а):
Здравствуйте. Попробовал Ваш код в "студии" и:
-постоянная инициализация UART не дает передатчику нормально завершить передачу;
- после окончания передачи (обработка прерывания) нормальный выход нужно делать командой RETI
Покажите на примере что надо изменить или дополнить?
ДАЖЕ ТАК НЕ СРАБАТЫВАЕТ!

Выкидывает на RESET
Код: Выделить всё
;включаем файл описания контроллера AT90S2313
.include "C:\Program Files\Atmel\AVR Tools\AvrStudio4\include\AT90S2313def.inc"
.def temp=r16
.def temp2=r17
.def temp3=r18
.cseg
.org 0
rjmp RESET ;Прерывание от вывода сброса
nop;rjmp EXT_INT0 ;External Interrupt0 Vector Address
nop;rjmp EXT_INT1 ;External Interrupt1 Vector Address
nop;rjmp TIM_CAPT1 ;Input Capture1 Interrupt Vector Address
nop;rjmp TIM_COMP1 ;Output Compare1 Interrupt Vector Address
nop;rjmp TIM_OVF1 ;Overflow1 Interrupt Vector Address
nop;rjmp TIM_OVF0 ;Overflow0 Interrupt Vector Address
nop;rjmp UART_RXC ;Прерывание по окончании приема UART
nop;rjmp UART_DRE ;Прерывание по пустому регистру данных UART
rjmp UART_TXC ;Прерывание по окончании передачи UART
nop;rjmp ANA_COMP ;Прерывание от аналогового компаратора
;Начало основной программы
RESET:
ldi temp, low(ramend);установка стека
out spl,temp
clr temp
sei
rjmp uartini
nop
rjmp send
UARTINI:;Настройка UART
ldi temp,25 ;Скорость обмена 9600 бод (для 4Мгц ошибки 0,2%)
out ubrr,temp
ldi temp,1<<txb8 ;режим 8N1 бит
out ucr,temp
ldi temp,1<<txen ;передачу разрешить
out ucr,temp
ldi temp,1<<txcie ;прерывание по окончании передачи
out ucr,temp
reti
SEND:;отправка символа ACSII
ldi temp,'a'
out udr,temp
ldi temp,'t'
out udr,temp
reti
uarttxc: ;Обработчик прерывания окончания передачи
nop;тут будет код обработчика
reti
Помогите плиззз! Спасибо!
Добавлено: Сб окт 25, 2008 05:22:27
akl
Здравствуйте. Странно, но у меня не получилось выложить кодом. Попробую так.
Добавлено: Сб окт 25, 2008 08:57:04
Артур
извините но всёравно не работает

как узнать в авр студии что передача UART завершена? В регистр UDR данные которые я отправляю, затем он очищается, но прерывания не происходит!
Добавлено: Сб окт 25, 2008 12:07:59
tych
Артур писал(а):извините но всёравно не работает

как узнать в авр студии что передача UART завершена? В регистр UDR данные которые я отправляю, затем он очищается, но прерывания не происходит!
Либо настроив прерывание по окончании прерывания, либо просто анализируя флаг окончания передачи и опустошения UDR. Подробно написано в задаче 4 и 5 у меня в домашней страничке.
Добавлено: Сб окт 25, 2008 19:58:11
YurkaM
Артур писал(а): как узнать в авр студии что передача UART завершена? В регистр UDR данные которые я отправляю, затем он очищается, но прерывания не происходит!
Потому что из UDR данные сразу перекидываются в собственно буфер, из которого пойдёт передача. Но! Передача-то идёт медленнее намного, чем ты щёлкаешь в отладчике по F11.
Чтобы поймать момент прерывания, поставь "Breakpoint" (F9) на строку, где вектор прерывания, т.е. сюда:
Код: Выделить всё
rjmp _uart_txc ;Прерывание по окончании передачи UART
и запускай отладчик по F5
ps: и тот твой код, который "ДАЖЕ ТАК НЕ СРАБАТЫВАЕТ!" не будет работать, там всё неправильно.... накидал бы хоть в виде алгоритма на бумажке что-ли, чего ты хочешь получить (для себя в смысле, чтобы легче было....)