Помогите плиз с прерываниями

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Скажите пожалуйста в чем проблема? Не вызывается прерывание окончания передачи 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
Век живи! - Век учись!
ICQ-15B87330h
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Код: Выделить всё

;включаем файл описания контроллера AT90S2313
.

;*******************************************************
Здравствуйте. Попробовал Ваш код в "студии" и:
-постоянная инициализация UART не дает передатчику нормально завершить передачу;
- после окончания передачи (обработка прерывания) нормальный выход нужно делать командой RETI
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Надо отловить баги в симуляторе.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

вот так, например, попробуй

Код: Выделить всё

.....
out ucr,temp

rcall uarttxc  ;первый раз на отправку символа принудительно, потом по прерываниям

main_loop:     ;основной цикл
nop            ;здесь можно делать чего-нить полезное...
rjmp main_loop ;на начало цикла

;Обработчик прерывания окончания передачи 
uart_txc: 
ldi temp,'a'   ;отправка символа ACSII 
out udr,temp 
reti
А лучше сам внимательно разберись, почему у тебя не работает. Используй пошаговую отладку в симуляторе, как уже советовали (хотя тут и без симулятора ошибки налицо - возможно просто невнимательность...)
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

Спасибо! Пробовал как сказали но без результата! :( Почему не срабатывает прерывание? Программа не переходит на вектор

Код: Выделить всё

 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
Помогите плиззз! Спасибо!
Век живи! - Век учись!
ICQ-15B87330h
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Здравствуйте. Странно, но у меня не получилось выложить кодом. Попробую так.
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 157
Зарегистрирован: Пн дек 04, 2006 09:50:08
Откуда: Vladivostok

Сообщение Артур »

извините но всёравно не работает :( как узнать в авр студии что передача UART завершена? В регистр UDR данные которые я отправляю, затем он очищается, но прерывания не происходит!
Век живи! - Век учись!
ICQ-15B87330h
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Артур писал(а):извините но всёравно не работает :( как узнать в авр студии что передача UART завершена? В регистр UDR данные которые я отправляю, затем он очищается, но прерывания не происходит!
Либо настроив прерывание по окончании прерывания, либо просто анализируя флаг окончания передачи и опустошения UDR. Подробно написано в задаче 4 и 5 у меня в домашней страничке.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

Артур писал(а): как узнать в авр студии что передача UART завершена? В регистр UDR данные которые я отправляю, затем он очищается, но прерывания не происходит!
Потому что из UDR данные сразу перекидываются в собственно буфер, из которого пойдёт передача. Но! Передача-то идёт медленнее намного, чем ты щёлкаешь в отладчике по F11.
Чтобы поймать момент прерывания, поставь "Breakpoint" (F9) на строку, где вектор прерывания, т.е. сюда:

Код: Выделить всё

 rjmp _uart_txc   ;Прерывание по окончании передачи UART
и запускай отладчик по F5

ps: и тот твой код, который "ДАЖЕ ТАК НЕ СРАБАТЫВАЕТ!" не будет работать, там всё неправильно.... накидал бы хоть в виде алгоритма на бумажке что-ли, чего ты хочешь получить (для себя в смысле, чтобы легче было....)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»