настройка прерывания

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

настройка прерывания

Сообщение Канстантин »

только начал разбираться с ассемблером и avr studio, поэтому пока мало что понимаю...
есть программа для измерения частоты на входе МК atmega8515.

.include "m8515def.inc"
.list
;
.cseg
;
.def temp =r16
.def new =r17
.def old =r18
;XL=26 XH=27
;
rjmp Init

Init:
.org $0005
rjmp tim1

clr new
clr old
clr XL
clr XH
clr temp
ldi temp,0b00001000
out TIMSK, temp
ldi temp,7
out OCR1AH,temp
ldi temp,83
out OCR1AL,temp
clr temp
out TCNT1H,temp
out TCNT1L,temp
ldi temp,0b00000100
out TCCR1B,temp

ldi temp,LOW(RAMEND)
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi temp,0b00000000
out DDRA,temp

sei

schet_1:
in new,PinA
com old
and old,new
sbrc old,0
adiw XL,1
mov old,new
rjmp schet_1

tim1:

ldi temp,0

Wait_uart_00:
sbis ucsra,udre
rjmp Wait_uart_00
out udr,temp
Wait_uart_10:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XL
Wait_uart_20:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XH

clr temp
clr XL
clr XH
out TCNT1H,temp
out TCNT1L,temp

sei
rjmp schet_1

При симуляции программа зависает на этом месте
schet_1:
in new,PinA
com old
and old,new
sbrc old,0
adiw XL,1
mov old,new
rjmp schet_1

Верна ли программа и как правильно настроить прерывание таймер-счетчика?
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: настройка прерывания

Сообщение ChipKiller »

......поэтому пока мало что понимаю...
.. из того что написано, тоже понять сложно .... пишите комментарии - тут не экстрасенсы ..
ошибки: 1

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

 rjmp Init

Init:
.org $0005
rjmp tim1

clr new
а надо

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

 rjmp Init
.org $0005
rjmp tim1
Init:
clr new
2 нет инициализации стека
3 обработка прерывания должна завершаться командой reti
Реклама
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

попробовал переписать код. во время симуляции в avr studio все равно не срабатывает прерывание по совпадению счетчико Т0. значение счетного регистра сравнивается с заданным, а прерывания нет



.include "m8515def.inc"
.list
;
.cseg
;
.def temp =r16
.def new =r17
.def old =r18
;XL=26 XH=27
;


.cseg
.org 0
rjmp RESET
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt
rjmp Timer1_compa
rjmp Timer1_compb
rjmp Timer1_OVF
rjmp Timer0_OVF
rjmp STC
rjmp priem
rjmp pust
rjmp peredacha
rjmp ANA_COMP
rjmp INT_2
rjmp TIMER0COMP
rjmp EE_RDY
rjmp SPM_RDY


;Reset:
INT_0:
INT_1:
Timer1_capt:
Timer1_compa:
Timer1_compb:
Timer1_OVF:
Timer0_OVF:
STC:
priem:
pust:
peredacha:
ANA_COMP:
INT_2:
EE_RDY:
SPM_RDY:

reti


Reset:

ldi temp,LOW(RAMEND) ; инициализация стека счетчика команд
out SPL,temp
ldi temp,HIGH(RAMEND)
out SPH,temp
ldi temp,0b00000000
out DDRA,temp

clr new ; очищаем регистры, настраиваем счетчик T0 на прерывание по совпадению
clr old
clr XL
clr XH
clr temp
ldi temp,0b00000010
out TIMSK, temp
ldi temp,1
out OCR0,temp
clr temp
out TCNT0,temp
ldi temp,0b00000100
out TCCR0,temp


sei

schet_1: ; считаем импульсы на входе A0
in new,PinA
com old
and old,new
sbrc old,0
adiw XL,1
mov old,new
rjmp schet_1

TIMER0COMP: ; обработка прерывания
cli

ldi temp,0

Wait_uart_00:
sbis ucsra,udre
rjmp Wait_uart_00
out udr,temp
Wait_uart_10:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XL
Wait_uart_20:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XH

clr temp
clr XL
clr XH
out TCNT1H,temp
out TCNT1L,temp

sei
rjmp schet_1
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: настройка прерывания

Сообщение GP1 »

Еще одна жертва обучалки :))) :))) :)))
а где сам обработчик прерывания? :shock:
то что там написано, извините - даже бредом назвать сложно.
только без обид.
ну прочтите хотя бы Евстифеева (я уже не говорю про ДШ а оригинале - боже упаси) про прерывания.
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6320
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: настройка прерывания

Сообщение Jack_A »

GP1 писал(а): а где сам обработчик прерывания? :shock:
Ну как же - есть универсальный, один на все прерывания, RETI
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: настройка прерывания

Сообщение GP1 »

Jack_A писал(а):
Ну как же - есть универсальный, один на все прерывания, RETI
Не :dont_know:
у него отдельный

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

TIMER0COMP: ; обработка прерывания
правда выход из него х.. знает куда, точнее независимо от точки вызова всегда в одну точку:

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

sei
rjmp schet_1
такого я еще ни разу не видел :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

всё равно не работает :cry:

.include "m8515def.inc"
.list
;
.cseg
;
.def temp =r16
.def new =r17
.def old =r18
;XL=26 XH=27
;


.cseg
.org 0
; записываем таблицу векторв прерываний
.CSEG
.ORG $0000 ; RESET
RJMP Reset
.ORG $0001
RETI ; INT0
.ORG $0002
RETI ; INT1
.ORG $0003
RETI ; TIMER1CAPT
.ORG $0004
RETI ; TIMER1COMPA
.ORG $0005
RETI ; TIMER1COMPB
.ORG $0006
RETI ; TIMER1OVF
.ORG $0007
RETI ; TIMER0OVF
.ORG $0008
RETI ; SPI,STC
.ORG $0009
RETI ; USART,RXC
.ORG $000A
RETI ; USART,UDRE
.ORG $000B
RETI ; USART,TXC
.ORG $000C
RETI ; ANA_COMP
.ORG $000D
RETI ; INT2
.ORG $000E
RJMP TIMER0COMP ; TIMER0COMP
.ORG $000F
RETI ; EE_RDY
.ORG $0010
RETI ; SPM_RDY

Reset:


LDI R19,Low(RAMEND) ; Инициализация стека
OUT SPL,R19

LDI R19,High(RAMEND)
OUT SPH,R19

ldi temp,0b00000000
out DDRA,temp

clr new ; очищаем регистры, настраиваем счетчик на прерывание
clr old
clr XL
clr XH
clr temp
ldi temp,0b00000010
out TIMSK, temp
ldi temp,1
out OCR0,temp
clr temp
out TCNT0,temp
ldi temp,0b00000100
out TCCR0,temp


sei

schet_1: ; счет импульсов на входе A0
in new,PinA
com old
and old,new
sbrc old,0
adiw XL,1
mov old,new
rjmp schet_1

TIMER0COMP:

ldi temp,0

Wait_uart_00: ; передача по UART (прерывание по совпадению счетчика T0)
sbis ucsra,udre
rjmp Wait_uart_00 ; (прерывание по совпадению счетчика T0)
out udr,temp
Wait_uart_10:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XL
Wait_uart_20:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XH

clr temp
clr XL
clr XH
out TCNT0,temp


sei
reti
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: настройка прерывания

Сообщение GP1 »

а что ОНО должно считать, ты словами опиши :write:
и вставь коменты , чтобы было понятно что ты пытаешься делать, я не имею ввиду

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

; записываем таблицу векторв прерываний
это-то как раз и так понятно.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: настройка прерывания

Сообщение ChipKiller »

Канстантин - почитайте теорию и поймите как работают прерывания и вообще что это такое ...

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

sei
reti
.. выход из обработчика разрешает прерывания автоматически - sei не нужна

PS - чаще используйте макросы ... например

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

ldi temp,0b00001000
out TIMSK, temp
поместится в одну строку outi TIMSK,0b00001000, если использовать макрос

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

.macro  outi
		ldi	temp,@1
		out @0,temp
.endm
... размер исходника уменьшится и станет более читаем
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

спасибо :) я первый раз пишу
но все таки при симуляции счетный регистр становится равным регистру сравнения, а на метку прерывания он не переходит. почему?
может кто у себя откомпилировать попробует :))
в цикле считаются импульсы по входящему фронту на входе A0
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: настройка прерывания

Сообщение ChipKiller »

Канстантин писал(а):....я первый раз пишу
... это не значит, что нужно лепить ошибки в любом доступном месте

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

Wait_uart_10:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XL
Wait_uart_20:
sbis ucsra,udre
rjmp Wait_uart_10
очевидно нужно

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

Wait_uart_10:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XL
Wait_uart_20:
sbis ucsra,udre
rjmp Wait_uart_20
... и повторюсь еще раз - здесь не экстрасенсы ... проще подсказать, что нужно сделать, когда понятна конечная задача, а не "играть в угадайку"
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

Спасибо!
есть у кого-нибудь типовая программа прерывания по счетчику?
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: настройка прерывания

Сообщение GP1 »

типовая по:
-переполнению
-сравнению
-захвату
????
Чем дальше, тем больше становлюсь занудой...
Изображение
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

по сравнению
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: настройка прерывания

Сообщение GP1 »

в разделе описания векторов пишем:
для регистра А

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

.org	OC1Aaddr	;= 0x0004	 Timer/Counter1 Compare Match A
   rjmp t1_compA
или, для регистра В

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

.org	OC1Baddr	;= 0x0005	 Timer/Counter1 Compare MatchB
   rjmp t1_compB
настраиваем таймер:
в TCCR1A и TCCR1B

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

; TCCR1A - Timer/Counter1 Control Register A
.equ	PWM10	= 0	; Pulse Width Modulator Select Bit 0
.equ	PWM11	= 1	; Pulse Width Modulator Select Bit 1
.equ	COM1B0	= 4	; Compare Output Mode 1B, bit 0
.equ	COM1B1	= 5	; Compare Output Mode 1B, bit 1
.equ	COM1A0	= 6	; Compare Ouput Mode 1A, bit 0
.equ	COM1A1	= 7	; Compare Output Mode 1A, bit 1

; TCCR1B - Timer/Counter1 Control Register B
.equ	CS10	= 0	; Clock Select1 bit 0
.equ	CS11	= 1	; Clock Select1 bit 1
.equ	CS12	= 2	; Clock Select1 bit 2
.equ	CTC1	= 3	; Clear Timer/Counter1 on Compare Match
.equ	ICES1	= 6	; Input Capture 1 Edge Select
.equ	ICNC1	= 7	; Input Capture 1 Noise Canceler
Настраиваем нужное прерывание:

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

; TIMSK - Timer/Counter Interrupt Mask Register
.equ	TICIE1	= 3	; Timer/Counter1 Input Capture Interrupt Enable
.equ	OCIE1B	= 5	; Timer/Counter1 Output CompareB Match Interrupt Enable
.equ	OCIE1A	= 6	; Timer/Counter1 Output CompareA Match Interrupt Enable
.equ	TOIE1	= 7	; Timer/Counter1 Overflow Interrupt Enable
для А

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

ldi tmp,1<<OCIE1A
out TIMSK,tmp
для В

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

ldi tmp,1<<OCIE1В
out TIMSK,tmp
ну и сам обработчик:

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

t1_compA:
push tmp
in tmp,SREG
push tmp
..
..
..
;здесь будет что-то обрабатываться
..
..
pop tmp
out SREG,tmp
pop tmp
reti

Чем дальше, тем больше становлюсь занудой...
Изображение
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

Спасибо огромное :)) ща попробую!
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

прерывания работают, спасибо
но происходит затык в этом месте, в реале контроллер здесь встанет?

Wait_uart_00: ; передача по UART (во время прерывания по совпадению)
sbis ucsra,udre
rjmp Wait_uart_00
out udr,temp
Wait_uart_10:
sbis ucsra,udre
rjmp Wait_uart_10
out udr,XL
Wait_uart_20:
sbis ucsra,udre
rjmp Wait_uart_20
out udr,XH
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: настройка прерывания

Сообщение GP1 »

1. Не понимаю, что ты вообще пытаешся сделать
2. Если не будет коментов, я не буду ковыряться в коде. :kill:
Чем дальше, тем больше становлюсь занудой...
Изображение
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

здесь хочу передать 3 байта по UART

а вообще программа должна считать импульсы на входе pinA0, через промежуток времени, который задается таймером, передать по uart и считать заново
Канстантин
Родился
Сообщения: 11
Зарегистрирован: Сб апр 09, 2011 18:18:58

Re: настройка прерывания

Сообщение Канстантин »

ты знаешь как более годно передать по uart? :)
Закрыто

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