В этом разделе описываются особенности обработки прерываний, выполняемые в ATtiny13A.
Полезная справочная таблица по векторам прерываний Attiny2313:
Расположение векторов прерываний в таблице определяет приоритет их обработки. Чем младше адрес прерывания, тем выше приоритет.
Взято с сайта avrinfo
А вот таблица векторов прерываний для МК Attiny13A:
Vector No. | Program Address | Source | Interrupt Definition |
1 | 0x0000 | RESET | Внешний контакт, сброс при включении питания, cброс при отключении питания, сброс сторожевого таймера |
2 | 0x0001 | INT0 | Внешнее прерывание 0 |
3 | 0x0002 | PCINT0 | Прерывание по изменению состояния выводов |
4 | 0x0003 | TIM0_OVF | Переполнение таймера\счётчика |
5 | 0x0004 | EE_RDY | EEPROM готова |
6 | 0x0005 | ANA_COMP | Аналоговый компаратор |
7 | 0x0006 | TIM0_COMPA | Совпадение А таймера\счётчика T0 |
8 | 0x0007 | TIM0_COMPB | Совпадение B таймера\счётчика T0 |
9 | 0x0008 | WDT | Переполнение сторожевого таймера |
10 | 0x0009 | ADC | Преобразование АЦП завершено |
Если программа никогда не активирует источник прерывания, векторы прерывания не используются, и обычный программный код может быть размещен в этих местах.
Наиболее типичная и общая настройка программы для адресов вектора сброса и прерывания в
ATtiny13A (пример):
Address Labels Code Comments
0x0000 rjmp RESET ; Reset Handler
0x0001 rjmp EXT_INT0 ; IRQ0 Handler
0x0002 rjmp PCINT0 ; PCINT0 Handler
0x0003 rjmp TIM0_OVF ; Timer0 Overflow Handler
0x0004 rjmp EE_RDY ; EEPROM Ready Handler
0x0005 rjmp ANA_COMP ; Analog Comparator Handler
0x0006 rjmp TIM0_COMPA ; Timer0 CompareA Handler
0x0007 rjmp TIM0_COMPB ; Timer0 CompareB Handler
0x0008 rjmp WATCHDOG ; Watchdog Interrupt Handler
0x0009 rjmp ADC ; ADC Conversion Handler
;
0x000A RESET: ldi r16, low(RAMEND) ; Main program start
0x000B out SPL,r16 ; Set Stack Pointer to top of RAM
0x000C sei ; Enable interrupts
0x000D <instr> xxx
... ... ... ...
Внешние прерывания
Внешние прерывания запускаются выводом INT0 или любым выводом PCINT[5:0]. Заметьте, что если они включены, прерывания будут срабатывать, даже если выводы INT0 или PCINT[5:0] сконфигурированы как выходы. Эта функция позволяет применять программное прерывание. Прерывания смены контакта PCI сработает, если какой-либо включенный вывод PCINT[5:0] переключится. Регистр PCMSK определяет, какие контакты способствуют прерываниям по смене пина. Прерывания смены пина на PCINT[5:0] обнаруживаются асинхронно. Это означает, что эти прерывания могут использоваться для пробуждения устройства из спящего (sleep) режима, отличающегося от режима ожидания (idle).
Прерывания INT0 могут быть вызваны падающим или нарастающим фронтом или низким уровнем. Это настраивается, как указано в спецификации для регистра управления MCU – MCUCR. Когда прерывание INT0 включено и настроено как срабатывание по уровню, прерывание будет срабатывать до тех пор, пока контакт удерживается на низком уровне. Обратите внимание, что распознавание прерываний по заднему или переднему фронту на INT0 требует наличия таймера ввода-вывода (I/O clock).
Прерывание по низкому уровню (low level interrupt)
Прерывание низкого уровня на INT0 обнаруживается асинхронно. Это означает, что это прерывание может быть использовано для пробуждения детали из спящего режима (sleep), в отличие от режима ожидания (idl). Таймер ввода-вывода (I/O Clock) остановлен в
всех спящих режимах (sleep), кроме режима ожидания (idle).
Обратите внимание, что если прерывание, запускаемое по уровню, используется для пробуждения после выключения питания (power down), то необходимый уровень должен удерживаться достаточно долго, чтобы MCU завершил пробуждение, чтобы вызвать прерывание по уровню. Если
уровень исчезнет до наступления запущенного состояния (Start-up Time), MCU всё равно проснётся, но уже без прерывания. Время запуска определяется фьюзами SUT и CKSEL, как описано в
«Системные таймеры и параметры таймеров».
Если низкий уровень на контакте прерывания изменён до того, как устройство проснулось, тогда исполнение команды по прерыванию не будет переключено на процедуру обслуживания прерывания, а продолжится с инструкции, следующей за командой SLEEP.
Пример программы на ассемблере для Attiny13A с использованием прерываний — управление системой полива
Описывая такие важные и сложные темы, как прерывания, не мешало бы дать РАБОТАЮЩИЙ пример на ассемблере. Иначе, получается, что автор , собственно, не описывает, а просто переписывает из техописания (дайташита) давно уже изложенное. И его заслуга — только перевод с английского с помощью online-переводчика.
Уважаемый Сергей! Спасибо, что заглянули на сайт. Разделяю ваше недовольство, однако должен заметить, что я опубликовал эту информацию как раз из-за отсутствия даташита на тинку13 на русском языке. И раздел так и называется «Datasheet Attiny 13 на русском» — это просто моя попытка перевести толстую книжку на русский. Вы напишите, что именно планируете сделать с прерываниями, а я попробую вам помочь с кодом на ассемблере.