Не работают прерывания в UART
Не работают прерывания в UART
Помогите пожалуйста, не могу понять, почему не вызывается прерывание по окончанию передачи UART
rjmp main ; External Reset, Power-on Reset and Watchdog Reset
nop ; External Interrupt Request 0
nop ; External Interrupt Request 1
nop ; Timer/Counter 1 Capture Event
nop ; Timer/Counter 1 Compare Match
nop ; Timer/Counter 1 Overflow
nop ; Timer/Counter 0 Overflow
nop ; UART, Rx complete
nop ; UART Data Register Empty
rjmp trans ; UART, TX complete
nop ; Analog Comparator
main:
ldi r16, ramend
out spl, r16
ldi r16, 0b11011000
out ucr, r16
ldi r16, 25
out ubrr,r16
sei
loop:
sbis USR,5
rjmp loop
; Передача байта (число 9)
ldi r16, 9
out udr, r16
rjmp loop
trans:
; прерывание почему-то не выполняется ?????
reti
rjmp main ; External Reset, Power-on Reset and Watchdog Reset
nop ; External Interrupt Request 0
nop ; External Interrupt Request 1
nop ; Timer/Counter 1 Capture Event
nop ; Timer/Counter 1 Compare Match
nop ; Timer/Counter 1 Overflow
nop ; Timer/Counter 0 Overflow
nop ; UART, Rx complete
nop ; UART Data Register Empty
rjmp trans ; UART, TX complete
nop ; Analog Comparator
main:
ldi r16, ramend
out spl, r16
ldi r16, 0b11011000
out ucr, r16
ldi r16, 25
out ubrr,r16
sei
loop:
sbis USR,5
rjmp loop
; Передача байта (число 9)
ldi r16, 9
out udr, r16
rjmp loop
trans:
; прерывание почему-то не выполняется ?????
reti
-
Foks
- Поставщик валерьянки для Кота
- Сообщения: 2108
- Зарегистрирован: Пт авг 29, 2008 16:28:19
- Откуда: Киев
Или мне кажется, или на каждое прерывание нужно два NOP'а. А еще лучше использовать .org с константами адресов прерываний. Они определены в инклюдах асма, по крайней мере в AVR Studio.
Для включения глобального флага разрешения прерываний после main: нужно написать:
bset 7
И еще: скажите, какой у Вас микроконтроллер, чтоб мы не гадали.
Для включения глобального флага разрешения прерываний после main: нужно написать:
bset 7
И еще: скажите, какой у Вас микроконтроллер, чтоб мы не гадали.
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Не плохо было бы указать какой контроллер
Попробуй так:
(для Tiny2313)
reset:
rjmp main
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
rjmp trans ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
; Program starts here after Reset
;
main:
ldi r16, ramend
out spl, r16
ldi r16, 25
out ubrr,r16
ldi r16, 0b11011000
out ucr, r16
sei
loop:
sbis USR,5
rjmp loop
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
ldi r16, 9
out udr, r16
rjmp loop
trans:
;
reti
delay:
ldi temp,0xff
d1:
dec temp
cpi temp, 0
brne d1
ret
То, что регистр данных UDR пуст, ещё совсем не значит, что передача закончена.
Попробуй так:
(для Tiny2313)
reset:
rjmp main
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
rjmp trans ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
; Program starts here after Reset
;
main:
ldi r16, ramend
out spl, r16
ldi r16, 25
out ubrr,r16
ldi r16, 0b11011000
out ucr, r16
sei
loop:
sbis USR,5
rjmp loop
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
ldi r16, 9
out udr, r16
rjmp loop
trans:
;
reti
delay:
ldi temp,0xff
d1:
dec temp
cpi temp, 0
brne d1
ret
То, что регистр данных UDR пуст, ещё совсем не значит, что передача закончена.
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
Foks писал(а):Для включения глобального флага разрешения прерываний после main: нужно написать:
bset 7
А написаного
Код: Выделить всё
seiне достаточно ?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Настройки не смотрел. Достаточно вот этого куска кода :
Он не даст выставить флаг завершения передачи TXC, соответственно не будет вызвано и прерывание по завершению передачи. Данный флаг устанавливается в "1" после передачи всех разрядов посылки из сдвигового регистра передатчика, при условии, что в регистр данных UDR не было загружено нового значения.
Кидайте первый байт в udr из основной программы. А последующие байты посылки - по прерыванию "Опустошение регистра данных".
Код: Выделить всё
rjmp loop
; Передача байта (число 9)
ldi r16, 9
out udr, r16
rjmp loop
Он не даст выставить флаг завершения передачи TXC, соответственно не будет вызвано и прерывание по завершению передачи. Данный флаг устанавливается в "1" после передачи всех разрядов посылки из сдвигового регистра передатчика, при условии, что в регистр данных UDR не было загружено нового значения.
Кидайте первый байт в udr из основной программы. А последующие байты посылки - по прерыванию "Опустошение регистра данных".
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
что значит:
Проблема здесь только в том, что новое значение в UDR загружается сразу после установки флага опустошения,
loop:
sbis USR,5
rjmp loop
а он в свою очередь устанавливается раньше(что в полне закономерно), чем флаг завершения передачи, т.к. для завершения передачи опустошения UDR явно недостаточно.
[/code]
?Он не даст выставить флаг завершения передачи TXC
Проблема здесь только в том, что новое значение в UDR загружается сразу после установки флага опустошения,
loop:
sbis USR,5
rjmp loop
а он в свою очередь устанавливается раньше(что в полне закономерно), чем флаг завершения передачи, т.к. для завершения передачи опустошения UDR явно недостаточно.
[/code]
-
Старый Бабай
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Ср окт 29, 2008 12:23:21
Re: Не работают прерывания в UART
Nash писал(а):Помогите пожалуйста, не могу понять, почему не вызывается прерывание по окончанию передачи UART
rjmp main ; External Reset, Power-on Reset and Watchdog Reset
nop ; External Interrupt Request 0
nop ; External Interrupt Request 1
nop ; Timer/Counter 1 Capture Event
nop ; Timer/Counter 1 Compare Match
nop ; Timer/Counter 1 Overflow
nop ; Timer/Counter 0 Overflow
nop ; UART, Rx complete
nop ; UART Data Register Empty
rjmp trans ; UART, TX complete
nop ; Analog Comparator
main:
ldi r16, ramend
out spl, r16
ldi r16, 0b11011000
out ucr, r16
ldi r16, 25
out ubrr,r16
sei
loop:
sbis USR,5
rjmp loop
; Передача байта (число 9)
ldi r16, 9
out udr, r16
rjmp loop
trans:
; прерывание почему-то не выполняется ?????
reti
Давайте смотреть инициализацию UARTa
Код: Выделить всё
ldi r16, 0b11011000
out ucr, r16
ldi r16, 25
out ubrr,r16
Идет установка битов
RXCIE - разрешение прерывания по ЗАВЕРШЕНИЮ ПРИЕМА
TXCIE - разрешение прерывания по ЗАВЕРШЕНИЮ ПЕРЕДАЧИ
RXEN - разрешение приема
TXEN - разрешение передачи
Вроде все понятно...
Но где тогда обработчик прерывания ПО ПРИЕМУ СИМВОЛА?
И самое важное ФЛАГ TXC будет выставлен тогда когда данные переданы и в UDR ничего больше не пишется...
А у вас запись в UDR идет постояно в цикле
Данный код вызовет срабатывание прерывания один раз
Код: Выделить всё
sei
;loop:
;sbis USR,5
;rjmp loop
; Передача байта (число 9)
ldi r16, 9
out udr, r16
;rjmp loop
main:
nop
rjmp main
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Код рабочий я уже писал выше.
После установки флага опустошения UDR
надо выдержать паузу
(1 MHz - порядка 14 ms)
и всё будет работать!
После установки флага опустошения UDR
Код: Выделить всё
loop:
sbis USR,5
rjmp loop надо выдержать паузу
(1 MHz - порядка 14 ms)
Код: Выделить всё
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
rcall delay
и всё будет работать!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
за ваш код (совет) с паузами надо отстреливать все пальцы
Ну, как программист программиста я ,конечно, вас понимаю.
Но на мой взгляд, при объяснении человеку принципа работы чего-либо,
совсем не стоит лезть в какие то дебри, гораздо лучше и понятнее показать всё "на пальцах", которые Вы так яростно стремитесь мне ОТСТРЕЛИТЬ. Да ещё и все.
И вообще, не нравится, предложите свой вариант.
Объяснять нужно людям, а не мозги засе..ть.
-
Старый Бабай
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Ср окт 29, 2008 12:23:21
Слушайте какие "ПАЛЪЦЫ".
На At90S2113 даташит давным давно переведен на русский.
Единствено в тхт файле , а непэдэфка..
Так что надо читать внимательно...
Не понятно прочитать еще раз...
Лпять не понятно - опять читаем
И если вы разрешаете прерывание по ОКОНЧАНИЕ ПЕРЕДАЧИ БАЙТА, то не надо слать байты в цикле постояно. Тогда и задержки не понадобятся
На At90S2113 даташит давным давно переведен на русский.
Единствено в тхт файле , а непэдэфка..
Так что надо читать внимательно...
Не понятно прочитать еще раз...
Лпять не понятно - опять читаем
И если вы разрешаете прерывание по ОКОНЧАНИЕ ПЕРЕДАЧИ БАЙТА, то не надо слать байты в цикле постояно. Тогда и задержки не понадобятся
-
Старый Бабай
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Ср окт 29, 2008 12:23:21
- Jotto
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Чт май 22, 2008 18:35:31
- Откуда: Москва, ВАО
- Контактная информация:
Pooher писал(а):Ну, как программист программиста я ,конечно, вас понимаю.![]()
Но на мой взгляд, при объяснении человеку принципа работы чего-либо,
совсем не стоит лезть в какие то дебри, гораздо лучше и понятнее показать всё "на пальцах", которые Вы так яростно стремитесь мне ОТСТРЕЛИТЬ. Да ещё и все.
И вообще, не нравится, предложите свой вариант.
Объяснять нужно людям, а не мозги засе..ть.
Ну я не стремлюсь... отстрелить... но!
Если вы, как программист, понимаете, то зачем предлагать КОНЦЕПТУАЛЬНО НЕВЕРНОЕ решение (даже представим, что оно будет работать) Потому что: при применении механизма прерываний нужно использовать именно этот механизм, при применении механизма флагов нужно ожидать флаги. Всевозможные примочки типа задержек уместны лишь в определенных ситуациях и никак, в данном случае с асинхронным портом, они неприменимы. Поэтому, что-бы на пальцах объяснить и не лезть в дебри, нужно написать правильно. Или не писать. Поэтому я не пишу тут кода, потому что ASM не мой профиль. Но не предостеречь от "индо-пакистанского" кода не могу.
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Jotto писал(а):Pooher писал(а):Ну, как программист программиста я ,конечно, вас понимаю.![]()
Но на мой взгляд, при объяснении человеку принципа работы чего-либо,
совсем не стоит лезть в какие то дебри, гораздо лучше и понятнее показать всё "на пальцах", которые Вы так яростно стремитесь мне ОТСТРЕЛИТЬ. Да ещё и все.
И вообще, не нравится, предложите свой вариант.
Объяснять нужно людям, а не мозги засе..ть.
Ну я не стремлюсь... отстрелить... но!
Если вы, как программист, понимаете, то зачем предлагать КОНЦЕПТУАЛЬНО НЕВЕРНОЕ решение (даже представим, что оно будет работать) Потому что: при применении механизма прерываний нужно использовать именно этот механизм, при применении механизма флагов нужно ожидать флаги. Всевозможные примочки типа задержек уместны лишь в определенных ситуациях и никак, в данном случае с асинхронным портом, они неприменимы. Поэтому, что-бы на пальцах объяснить и не лезть в дебри, нужно написать правильно. Или не писать. Поэтому я не пишу тут кода, потому что ASM не мой профиль. Но не предостеречь от "индо-пакистанского" кода не могу.
Не могу с этим не согласиться, но я считаю, что лучше в качестве примера показать в каком-то смысле "неверный" код, который визуально и интуитивно понятно иллюстрирует ПРОЦЕССЫ, которые происходят, а не выкладывать сложный для понимания "правильный" код, который в конечном счёте может окончательно закипятить человеку мозги. Ведь если он возьмёт кусок кода и начнёт его впихивать в приложение, то есть 2 варианта: или он окончательно запутается, или у него всё получится, но и в том и в другом случае мы ему совсем даже не поможем, как может показаться, а как раз наоборот.
Ведь для полноценного понимания того, что ты делаешь, надо самому искать пути решения проблемы, а не пользоваться готовыми , тем более, что в данной ситуации ВЫХОД обозначен жирной стрелкой.
- Jotto
- Первый раз сказал Мяу!
- Сообщения: 33
- Зарегистрирован: Чт май 22, 2008 18:35:31
- Откуда: Москва, ВАО
- Контактная информация:
Pooher писал(а):... но я считаю, что лучше в качестве примера показать в каком-то смысле "неверный" код, который визуально и интуитивно понятно иллюстрирует ПРОЦЕССЫ, которые происходят, а не выкладывать сложный для понимания "правильный" код...
А вот я тут не соглашусь. Иллюстрировать процессы можно (и нужно) вербально. Сграфиками, диаграммами, с чем угодно, даже с верным кодом, который вдумчивый ученик проанализирует. А "неверный" код приведет вот к чему: человек схватит идею (а багажа других знаний по теме нет) поэтому отпечатается некая "аксиома" или "шаблон", который, весьма возможно, скопируется в другие места, потом разработчик поднимает частоту кристалла, скорость порта... и... вуаля, такой "прекрасный" код, который работал - перестал. Кстати, rcall delay позволяет внутри себя прерывания?