Вроде и прочитал то, что нужно, но физически реализовать не могу! Подскажите, как сделать так, что бы МК при включении проходил инициализацию и уходил в сон, а просыпался при нажатии кнопки? Лучше, если с примером на ассемблере.
Помогите, пожалуйста!
AVR ATTiny13. Помогите разобраться с прерываниями
-
colonelmarch
- Родился
- Сообщения: 9
- Зарегистрирован: Чт авг 23, 2012 21:15:08
- Реклама
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: AVR ATTiny13. Помогите разобраться с прерываниями
Вот тут я разбирался -- может поможет. Почитай, там не много!
Re: AVR ATTiny13. Помогите разобраться с прерываниями
сидел как раз тоже изучал AVR ATTiny13
наверно как то так, но я могу ошибаться:
наверно как то так, но я могу ошибаться:
Спойлер
Код: Выделить всё
.include "tn13Adef.inc"
;=============
;программа делает важные действия по нажатию кнопки между 6й ногой и землей
;=============
.org 0
rjmp RESET ;External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset
.org INT0addr ; External Interrupt 0
rjmp EXT_INT0
.org PCI0addr ; External Interrupt Request 0
reti
.org OVF0addr ; Timer/Counter0 Overflow
reti
.org ERDYaddr ; EEPROM Ready
reti
.org ACIaddr ; Analog Comparator
reti
.org OC0Aaddr ; Timer/Counter Compare Match A
reti
.org OC0Baddr ; Timer/Counter Compare Match B
reti
.org WDTaddr ; Watchdog Time-out
reti
.org ADCCaddr ; ADC Conversion Complete
reti
;=============
EXT_INT0: ;внешнее прерывание 0
push r16
in r16,SREG;
push r16
ldi r16,(0<<INT0)|(0<<PCIE) ;выключаемегочтобнемешало
out GIMSK,r16
pop r16
out SREG,r16
pop r16
reti
;=============
SUPERPUPERZADACHA: ;МЕГАСУПЕРЗАДАЧА
nop
nop ;ТУТ важные для всего процесса действия!!!
nop
nop
ret
;=============
RESET:
;=============
;установка указателя стека
;================
cli
ldi R16,low(RamEnd)
out SPL,R16
;================
; Инициализация периферии
;================
;Порты
;================
;PORTB
ldi r16,0
out ddrb,r16
ldi r16,1<<PB1 ;подтяжку на INT0
out portb,r16
;=============
;=============
MAIN:
ldi r16,(1<<INT0)|(0<<PCIE) ;включить прерывание
out GIMSK,r16
ldi r16,(2<<SM0)|(1<<SE)|(0<<ISC00) ;включить Power-down и условие низкий уровень
out MCUCR,r16
sleep ;спим пока какой нибудь идиот не нажмет кнопку
ldi r16,0
out MCUCR,r16
rcall SUPERPUPERZADACHA ;ЗАПУСТИМ МЕГАСУПЕРЗАДАЧУ
rjmp MAIN
;=============

