Вт сен 12, 2017 08:37:46
Вт сен 12, 2017 09:23:25
Вт сен 12, 2017 09:53:20
DS на ATtiny2313 утверждает, что нет.• Bit 6 – ICES1: Input Capture Edge Select
This bit selects which edge on the Input Capture pin (ICP1) that is used to trigger a capture
event. When the ICES1 bit is written to zero, a falling (negative) edge is used as trigger, and
when the ICES1 bit is written to one, a rising (positive) edge will trigger the capture.
When a capture is triggered according to the ICES1 setting, the counter value is copied into the
Input Capture Register (ICR1). The event will also set the Input Capture Flag (ICF1), and this
can be used to cause an Input Capture Interrupt, if this interrupt is enabled.
Вт сен 12, 2017 09:57:54
Вт сен 12, 2017 11:31:13
Вт сен 12, 2017 11:58:45
После отсечки дребезга запускается таймер и останавливается при отпускании кнопки. При переполнении таймера, считается что кнопка достаточно долго нажата.radio-fan писал(а):Надо чтобы длинное без отпускания ловил.
Ср сен 13, 2017 06:49:01
Ср сен 13, 2017 17:40:21
Ср сен 13, 2017 20:41:00
Сб сен 16, 2017 05:34:08
Сб сен 16, 2017 05:41:38
Сб сен 16, 2017 08:06:26
Сб сен 23, 2017 13:44:06
.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
;ATmega8 программируем
;тактовая частота 8 МГц
.def Temp=R16 ;рабочая перемнная
.def Flag=R17 ;3-0 бит счётчик нажатий, 4 бит инверсии (1 инверсия), 5 бит нажатия отпускания (0 нажатие, 1 отпускание), 6 бит длинное короткое нажатие(0 короткое, 1 длинное)
.def Count=R18 ;счётчик эффектов
.def TimCount=R19 ;счётчик переполнений таймер 0
.def Temp1=R20
.def Temp2=R21
.def Temp3=R22
.cseg
.org 0
rjmp RESET ;переход на обработку сброса
rjmp EXT_INT0 ;переход на обработку запроса IRQ0
reti;rjmp EXT_INT1 ;переход на обработку запроса IRQ1
reti;rjmp TIM2_COMP ;переход на обработку сравнения Timer2
reti;rjmp TIM2_OVF ;переход на обработку при переполнении Timer2
reti;rjmp TIM1_CAPT ;переход на обработку при захвате фронта Timer1
rjmp TIM1_COMPA ;переход на обработку при срабатывании компаратора A Timer1
reti;rjmp TIM1_COMPB ;переход на обработку при срабатывании компаратора B Timer1
reti;rjmp TIM1_OVF ;переход на обработку при переполнении Timer1
rjmp TIM0_OVF ;переход на обработку при переполнении Timer0
reti;rjmp SPI_STC ;переход на обработку при завершении передачи SPI
reti;rjmp USART_RXC ;переход на обработку при завершении приёма УСАППО
reti;rjmp USART_UDRE ;переход на обработку при освобождении регистра
reti;rjmp USART_TXC ;переход на обработку при завершении передачи
reti;rjmp ACDC ;переход на обработку при завершении приобразования АЦП
reti;rjmp EE_RDY ;переход на обработку при готовности EEROM
reti;rjmp ANA_COMP ;переход на обработку при срабатывании аналогового компаратора
reti;rjmp TWSI ;двухпроводный последовательный интерфейс
reti;rjmp SPM_RDY ;переход на обработку прерывания при готовности записи в память программ
;************************************************************************************************
;МАССИВ
;************************************************************************************************
ARRAY0:
.db 0b01001001, 0b10010010, 0b00100100, 0 ;Максимум 16 эффектов
ARRAY1:
.db 0b00000001, 0b00000010, 0b00000100, 0b00001000 ;1 светодиод светится 1/8 с (125000мкс)
.db 0b00010000, 0b00100000, 0b01000000, 0b10000000 ;частота без предделиеля 8Мгц => 1 такт 0,125мкс
.db 0b01000000, 0b00100000, 0b00010000, 0b00001000 ;всего 65535 => 1 такт должен длиться 2мкс =>
.db 0b00000100, 0b00000010, 0, 0 ;частота предделителя 8*10^6/32 гц (011) (1такт 4мкс)
ARRAY2:
.db 0b00011000, 0b00100100, 0b01000010, 0b10000001 ;125000/4=31250 (7A12)
.db 0b01000010, 0b00100100, 0, 0 ;
ARRAY3:
.db 0b00000001, 0b00000010, 0b00000100, 0b00001000 ;
.db 0b00010000, 0b00100000, 0b01000000, 0b10000000 ;
.db 0, 0 ;
ARRAY4:
.db 0b10000000, 0b01000000, 0b00100000, 0b00010000 ;
.db 0b00001000, 0b00000100, 0b00000010, 0b00000001 ;
.db 0, 0 ;
ARRAY5:
.db 0b00011000, 0b00100100, 0b01000010, 0b10000001 ;
.db 0, 0 ;
ARRAY6:
.db 0b00000001, 0b00000011, 0b00000111, 0b00001111 ;
.db 0b00011111, 0b00111111, 0b01111111, 0b11111111 ;
.db 0b11111110, 0b11111100, 0b11111000, 0b11110000 ;
.db 0b11100000, 0b11000000, 0b10000000, 0 ;
ARRAY7:
.db 0b10000000, 0b11000000, 0b11100000, 0b11110000 ;
.db 0b11111000, 0b11111100, 0b11111110, 0b11111111 ;
.db 0b01111111, 0b00111111, 0b00011111, 0b00001111 ;
.db 0b00000111, 0b00000011, 0b00000001, 0 ;
ARRAY8:
.db 0b00011000, 0b00111100, 0b01111110, 0b11111111 ;
.db 0b01111110, 0b00111100, 0, 0 ;
ARRAY9:
.db 0b00000001, 0b00000011, 0b00000111, 0b00001111 ;
.db 0b00011111, 0b00111111, 0b01111111, 0b11111111 ;
.db 0b01111111, 0b00111111, 0b00011111, 0b00001111 ;
.db 0b00000111, 0b00000011, 0, 0 ;
ARRAY10:
.db 0b10000000, 0b11000000, 0b11100000, 0b11110000 ;
.db 0b11111000, 0b11111100, 0b11111110, 0b11111111 ;
.db 0b11111110, 0b11111100, 0b11111000, 0b11110000 ;
.db 0b11100000, 0b11000000, 0, 0 ;
;################################################################################################
;ИНИЦИАЛИЗАЦИЯ
;################################################################################################
Reset: ldi Temp, high(RAMEND) ;Инциализация стека
out SPH, Temp ;
ldi Temp, low(RAMEND) ;
out SPL, Temp ;
ldi Temp, 0b11111111 ;Инициализация портов
out DDRB, Temp ;
ldi Temp, 0b00000100 ;Подтягивающий резистор на INT0
out PORTD, Temp ;
clr Flag ;
clr Count ;
clr TimCount ;
ldi Temp, 0b00000010 ;инициализируем INT0 по спаду
out MCUCR, Temp ;
ldi Temp, 0b01000000 ;включаем прерывание int0
out GICR, Temp ;
ldi Temp, 0b00010001 ;настройка прерываний(разрешаем прерывание компаратора 1-ого таймера)
out TIMSK, Temp ;вывод в TIMSK
ldi Temp, high(31250) ;Задаём число в компаратор
out OCR1AH, Temp ;
ldi Temp, low(31250) ;
out OCR1AL, Temp ;
ldi Temp, 0b00000011 ;настройка предделителя
out TCCR1B, Temp ;вывод в TCCR1B
clr Temp ;Обнуляем таймер
out TCNT1H, Temp ;
out TCNT1L, Temp ;
sei ;
;#################################################################################################
;ООСНОВНОЙ ЦИКЛ
;#################################################################################################
Do: sbrs Flag, 6 ;
rjmp Do ;
ldi Temp3, 0x12 ;загружаем число 124F80 задержка 0,75с
ldi Temp2, 0x48 ;6000000/5=1200000
ldi Temp1, 0x80 ;750000/0,125=6000000
Delay: subi Temp1, 1 ;задержка
sbci Temp2, 0 ;
sbci Temp3, 0 ;
brcc Delay ;
cli ;запрещаем прерывания
cbr Flag, 0b01000000 ;устанавливаем короткое нажатие
sbrs Flag, 4 ;инверсия эффектов
rjmp Invers ;
cbr Flag, 0b00010000 ;
rjmp End ;
Invers: sbr Flag, 0b00010000 ;
End: ldi Temp, 0b00000010 ;инициализируем INT0 по спаду
out MCUCR, Temp ;
ldi Temp, 0b00000011 ;настройка предделителя
out TCCR1B, Temp ;вывод в TCCR1B
sei ;разрешаем прерывния
rjmp Do ;
;#################################################################################################
;ПРЕРЫВАНИЕ КОМПАРАТОРА
;#################################################################################################
TIM1_COMPA: in Temp, SREG ;сохраняем флаги в стек
push Temp ;
clr Temp ;Обнуляем таймер
out TCNT1H, Temp ;
out TCNT1L, Temp ;
Test0: mov Temp, Flag ;Проверка кнопки
andi Temp, 0b00001111 ;
cpi Temp, 0 ;
brne Test1 ;
ldi ZH, High(ARRAY0*2) ;
ldi ZL, Low(ARRAY0*2) ;
rjmp Readarray ;
Test1: cpi Temp, 1 ;
brne Test2 ;
ldi ZH, High(ARRAY1*2) ;
ldi ZL, Low(ARRAY1*2) ;
rjmp Readarray ;
Test2: cpi Temp, 2 ;(10)
brne Test3 ;
ldi ZH, High(ARRAY2*2) ;
ldi ZL, Low(ARRAY2*2) ;
rjmp Readarray ;
Test3: cpi Temp, 3 ;(11)
brne Test4 ;
ldi ZH, High(ARRAY3*2) ;
ldi ZL, Low(ARRAY3*2) ;
rjmp Readarray ;
Test4: cpi Temp, 4 ;(100)
brne Test5 ;
ldi ZH, High(ARRAY4*2) ;
ldi ZL, Low(ARRAY4*2) ;
rjmp Readarray ;
Test5: cpi Temp, 5 ;(101)
brne Test6 ;
ldi ZH, High(ARRAY5*2) ;
ldi ZL, Low(ARRAY5*2) ;
rjmp Readarray ;
Test6: cpi Temp, 6 ;(110)
brne Test7 ;
ldi ZH, High(ARRAY6*2) ;
ldi ZL, Low(ARRAY6*2) ;
rjmp Readarray ;
Test7: cpi Temp, 7 ;(111)
brne Test8 ;
ldi ZH, High(ARRAY7*2) ;
ldi ZL, Low(ARRAY7*2) ;
rjmp Readarray ;
Test8: cpi Temp, 8 ;(1000)
brne Test9 ;
ldi ZH, High(ARRAY8*2) ;
ldi ZL, Low(ARRAY8*2) ;
rjmp Readarray ;
Test9: cpi Temp, 9 ;(1001)
brne Test10 ;
ldi ZH, High(ARRAY9*2) ;
ldi ZL, Low(ARRAY9*2) ;
rjmp Readarray ;
Test10: cpi Temp, 10 ;(1010,A)
ldi ZH, High(ARRAY10*2) ;
ldi ZL, Low(ARRAY10*2) ;
Readarray: ldi Temp, 0 ;загружаем элемент массива
add ZL, Count ;
adc ZH, Temp ;
lpm ;
mov Temp, R0 ;
cpi Temp, 0 ;
breq Go ;
inc Count ;
rjmp Output ;
Go: clr Count ;
rjmp Test0 ;
Output: sbrc Flag, 4 ;проверка на бегущую тень
com Temp ;
out PortB, Temp ;вывод в порты
pop Temp ;
out SREG, Temp ;
reti ;
;#############################################################################################
;ПРЕРЫВАНИЕ ПО КНОПКЕ
;#############################################################################################
EXT_INT0: in Temp, SREG ;сохраняем флаги в стек
push Temp ;
clr Temp ;
out GICR, Temp ;запрещаем прерывание по кнопке
out TCCR1B, Temp ;останавливаем компаратор
out TCCR0, Temp ;останавливаем таймер 0
out TCNT0, Temp ;очищаем регистр 0 таймера
cbr Flag, 0b01000000 ;длинного нажатия нет
sbrs Flag, 5 ;если 0 то было нажатие, если 1 то отпускание
rjmp PushCycl ;
clr Count ;
ldi Temp, 0b00000011 ;настройка предделителя
out TCCR1B, Temp ;вывод в TCCR1B
mov Temp, Flag ;сравниваем счётчик нажатий
andi Temp, 0b00001111 ;
cpi Temp, 11 ;
brne GO1 ;
andi Flag, 0b11110000 ;
rjmp GO2 ;
GO1: inc Flag ;
GO2: cbr Flag, 0b00100000 ;
ldi TimCount, 195 ;пауза 0,05 с
ldi Temp, 0b00000001 ;запускаем таймер 0
out TCCR0, Temp ;частота 1/8
clr count ;
pop Temp ;извлекаем флаги из стека
out SREG, Temp ;
reti
PushCycl: sbr Flag, 0b00100000 ;
ldi TimCount, 146 ;пауза 0,25 с
ldi Temp, 0b00000011 ;частота 1/32
out TCCR0, Temp ;
pop Temp ;извлекаем флаги из стека
out SREG, Temp ;
sei ;
rjmp Do ;конец прерывания
;#############################################################################################
;ПРЕРЫВАНИЕ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА 0
;#############################################################################################
TIM0_OVF: in Temp, SREG ;сохраняем флаги в стек
push Temp ;
dec TimCount ;
breq Timer ;
pop Temp ;извлекаем флаги из стека
out SREG, Temp ;
reti ;
Timer: clr Temp ;останавливаем таймер 0
out TCCR0, Temp ;
sbrs Flag, 5 ;
rjmp GO3 ;
ldi Temp, 0b00000011 ;инициализируем INT0 по фронту
out MCUCR, Temp ;
sbr Flag, 0b01000000 ;
ldi Temp, 0b01000000 ;включаем прерывание int0
out GICR, Temp ;
ldi Temp, 0b00000011 ;настройка предделителя
out TCCR1B, Temp ;вывод в TCCR1B
pop Temp ;извлекаем флаги из стека
out SREG, Temp ;
reti
GO3: ldi Temp, 0b00000010 ;инициализируем INT0 по спаду
out MCUCR, Temp ;
ldi Temp, 0b01000000 ;включаем прерывание int0
out GICR, Temp ;
pop Temp ;извлекаем флаги из стека
out SREG, Temp ;
sei ;
rjmp Do ;конец прерывания
Сб сен 23, 2017 15:28:51
Пн сен 25, 2017 05:51:31
Пн сен 25, 2017 09:27:42
Пн сен 25, 2017 09:32:10
ясен пень, куда ж ему деваться-то?radio-fan писал(а): если из прерывания выходить не через reti, то в стеке будет оставаться адрес?
Пн сен 25, 2017 10:38:10
Пн сен 25, 2017 10:40:26
только речь проBOB51 писал(а):По обработке стека и RET и RETI
ОДНО И ТО ЖЕ
akl писал(а):rjmp Do ;конец прерывания
Пн сен 25, 2017 10:45:53