настройка прерывания
-
Канстантин
- Родился
- Сообщения: 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
Верна ли программа и как правильно настроить прерывание таймер-счетчика?
есть программа для измерения частоты на входе МК 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: настройка прерывания
.. из того что написано, тоже понять сложно .... пишите комментарии - тут не экстрасенсы ........поэтому пока мало что понимаю...
ошибки: 1
Код: Выделить всё
rjmp Init
Init:
.org $0005
rjmp tim1
clr new
Код: Выделить всё
rjmp Init
.org $0005
rjmp tim1
Init:
clr new3 обработка прерывания должна завершаться командой 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
.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: настройка прерывания
Еще одна жертва обучалки
а где сам обработчик прерывания?
то что там написано, извините - даже бредом назвать сложно.
только без обид.
ну прочтите хотя бы Евстифеева (я уже не говорю про ДШ а оригинале - боже упаси) про прерывания.
а где сам обработчик прерывания?
то что там написано, извините - даже бредом назвать сложно.
только без обид.
ну прочтите хотя бы Евстифеева (я уже не говорю про ДШ а оригинале - боже упаси) про прерывания.
Re: настройка прерывания
Ну как же - есть универсальный, один на все прерывания, RETIGP1 писал(а): а где сам обработчик прерывания?![]()
- Реклама
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: настройка прерывания
НеJack_A писал(а):
Ну как же - есть универсальный, один на все прерывания, RETI
у него отдельный
Код: Выделить всё
TIMER0COMP: ; обработка прерыванияКод: Выделить всё
sei
rjmp schet_1-
Канстантин
- Родился
- Сообщения: 11
- Зарегистрирован: Сб апр 09, 2011 18:18:58
Re: настройка прерывания
всё равно не работает
.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
.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: настройка прерывания
а что ОНО должно считать, ты словами опиши
и вставь коменты , чтобы было понятно что ты пытаешься делать, я не имею ввиду
это-то как раз и так понятно.
и вставь коменты , чтобы было понятно что ты пытаешься делать, я не имею ввиду
Код: Выделить всё
; записываем таблицу векторв прерываний- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: настройка прерывания
Канстантин - почитайте теорию и поймите как работают прерывания и вообще что это такое ...
.. выход из обработчика разрешает прерывания автоматически - sei не нужна
PS - чаще используйте макросы ... например поместится в одну строку outi TIMSK,0b00001000, если использовать макрос ... размер исходника уменьшится и станет более читаем
Код: Выделить всё
sei
retiPS - чаще используйте макросы ... например
Код: Выделить всё
ldi temp,0b00001000
out TIMSK, tempКод: Выделить всё
.macro outi
ldi temp,@1
out @0,temp
.endm-
Канстантин
- Родился
- Сообщения: 11
- Зарегистрирован: Сб апр 09, 2011 18:18:58
Re: настройка прерывания
спасибо
я первый раз пишу
но все таки при симуляции счетный регистр становится равным регистру сравнения, а на метку прерывания он не переходит. почему?
может кто у себя откомпилировать попробует
в цикле считаются импульсы по входящему фронту на входе A0
но все таки при симуляции счетный регистр становится равным регистру сравнения, а на метку прерывания он не переходит. почему?
может кто у себя откомпилировать попробует
в цикле считаются импульсы по входящему фронту на входе A0
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: настройка прерывания
... это не значит, что нужно лепить ошибки в любом доступном местеКанстантин писал(а):....я первый раз пишу
Код: Выделить всё
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: настройка прерывания
типовая по:
-переполнению
-сравнению
-захвату
????
-переполнению
-сравнению
-захвату
????
-
Канстантин
- Родился
- Сообщения: 11
- Зарегистрирован: Сб апр 09, 2011 18:18:58
Re: настройка прерывания
по сравнению
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: настройка прерывания
в разделе описания векторов пишем:
для регистра А
или, для регистра В
настраиваем таймер:
в TCCR1A и TCCR1B
Настраиваем нужное прерывание:
для А
для В
ну и сам обработчик:
для регистра А
Код: Выделить всё
.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
но происходит затык в этом месте, в реале контроллер здесь встанет?
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: настройка прерывания
1. Не понимаю, что ты вообще пытаешся сделать
2. Если не будет коментов, я не буду ковыряться в коде.
2. Если не будет коментов, я не буду ковыряться в коде.
-
Канстантин
- Родился
- Сообщения: 11
- Зарегистрирован: Сб апр 09, 2011 18:18:58
Re: настройка прерывания
здесь хочу передать 3 байта по UART
а вообще программа должна считать импульсы на входе pinA0, через промежуток времени, который задается таймером, передать по uart и считать заново
а вообще программа должна считать импульсы на входе pinA0, через промежуток времени, который задается таймером, передать по uart и считать заново
-
Канстантин
- Родился
- Сообщения: 11
- Зарегистрирован: Сб апр 09, 2011 18:18:58
Re: настройка прерывания
ты знаешь как более годно передать по uart? 



