Страница 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
Покажите на примере что надо изменить или дополнить?
ДАЖЕ ТАК НЕ СРАБАТЫВАЕТ! :shock: Выкидывает на 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: и тот твой код, который "ДАЖЕ ТАК НЕ СРАБАТЫВАЕТ!" не будет работать, там всё неправильно.... накидал бы хоть в виде алгоритма на бумажке что-ли, чего ты хочешь получить (для себя в смысле, чтобы легче было....)