Разделы

В сети

Пользователей: 249
Из них просматривают:
Аналоги: 97. Видео: 2. Даташиты: 79. Инструкции: 3. Новости: 15. Остальное: 9. Производители: 1. Профиль пользователя: 3. Теги: 3. Форум: 37.
Участников: 2
Гостей: 247

Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.

Atmega128. Прерывания

Написал MACTEP 31.03.2010 11:00:00 (Просмотров: 7631)

Прерывания

В данном разделе описывается специфика обработки прерываний, реализованная в ATmega128. Общее описание обработки прерываний приведено в разделе “Сброс и обработка прерываний”.



Векторы прерываний в ATmega128

Таблица 23 – Векторы сброса и прерываний

№ вектора Адрес памяти программ(4) Источник Условие возникновения прерывания
1 $0000(1) RESET Внешний сброс, сброс при подаче питания, сброс при недопустимом снижении питания, сброс сторожевым таймером и сброс через JTAG-интерфейс
2 $0002 INT0 Запрос на внешнее прерывание 0
3 $0004 INT1 Запрос на внешнее прерывание 1
4 $0006 INT2 Запрос на внешнее прерывание 2
5 $0008 INT3 Запрос на внешнее прерывание 3
6 $000A INT4 Запрос на внешнее прерывание 4
7 $000C INT5 Запрос на внешнее прерывание 5
8 $000E INT6 Запрос на внешнее прерывание 6
9 $0010 INT7 Запрос на внешнее прерывание 7
10 $0012 TIMER2 COMP Срабатывание компаратора таймера-счетчика 2
11 $0014 TIMER2 OVF Переполнение таймера-счетчика 2
12 $0016 TIMER1 CAPT Захват фронта таймером-счетчиком 1
13 $0018 TIMER1 COMPA Срабатывание компаратора А таймера-счетчика 1
14 $001A TIMER1 COMPB Срабатывание компаратора В таймера-счетчика 1
15 $001C TIMER1 OVF Переполнение таймера-счетчика 1
16 $001E TIMER0 COMP Срабатывание компаратора таймера-счетчика 0
17 $0020 TIMER0 OVF Переполнение таймера-счетчика 0
18 $0022 SPI, STC Завершение последовательной передачи интерфейсом SPI
19 $0024 USART0, RX Завершение приема УСАПП 0
20 $0026 USART0, UDRE Регистр данных УСАПП0 свободен
21 $0028 USART0, TX Завершение передачи УСАПП 0
22 $002A ADC Завершение преобразования АЦП
23 $002C EE READY Готовность ЭСППЗУ
24 $002E ANALOG COMP Аналоговый компаратор
25 $0030(3) TIMER1 COMPC Срабатывание компаратора С таймера-счетчика 1
26 $0032(3) TIMER3 CAPT Захват фронта таймером счетчиком 3
27 $0034(3) TIMER3 COMPA Срабатывание компаратора А таймера-счетчика 3
28 $0036(3) TIMER3 COMPB Срабатывание компаратора В таймера-счетчика 3
29 $0038(3) TIMER3 COMPC Срабатывание компаратора С таймера-счетчика 3
30 $003A(3) TIMER3 OVF Переполнение таймера счетчика 3
31 $003C(3) USART1, RX Завершение приема УСАПП 1
32 $003E(3) USART1, UDRE Регистр данных УСАПП1 свободен
33 $0040(3) USART1, TX Завершение передачи УСАПП1
34 $0042(3) TWI Двухпроводной последовательный интерфейс
35 $0044(3) SPM READY Готовность записи в память программ

Прим.:

  1. Если конфигурационный бит BOOTRST запрограммирован, то микроконтроллер выполняет переход на адрес сброса в загрузочном секторе, см. “ Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи ”.
  2. Если установлен бит IVSEL в регистре MCUCR, то векторы прерываний перемещаются в начало загрузочного сектор флэш-памяти. В этом случае к адресу каждого вектора прерывания из таблицы прибавляется стартовый адрес загрузочного сектора флэш-памяти.
  3. Прерывания по адресам $0030 - $0044 не существуют в режиме совместимости с ATmega103.

В таблице 24 показано расположение векторов сброса и прерываний в зависимости от различных установок BOOTRST и IVSEL. Если программа не использует прерывания, то она может быть размещена равномерно, используя ячейки с адресами векторов прерываний для хранения программного кода. Возможен также случай, когда вектор сброса располагается в секторе прикладной программы, а векторы прерываний – в загрузочном секторе или наоборот.

Таблица 24 – Размещение векторов сброса и прерываний

BOOTRST IVSEL Адрес сброса Начальный адрес векторов прерываний
1 0 $0000 $0002
1 1 $0000 Адрес сброса в загрузочном секторе + $0002
0 0 Адрес сброса в загрузочном секторе $0002
0 1 Адрес сброса в загрузочном секторе Адрес сброса в загрузочном секторе + $0002

Прим. : Адрес сброса загрузочного сектора показан в таблице 113. Для конфигурационного бита BOOTRST “1” означает незапрограммированное состояние, “0” - запрограммированное.

Ниже приведено большинство типичных и общих программных установок адресов сброса и векторов прерываний у ATmega128:

Адрес   Инструкция       Комментарий
$0000   jmp RESET        ; Переход на обработку сброса
$0002   jmp EXT_INT0     ; Переход на  обработку запроса IRQ0 
$0004   jmp EXT_INT1     ; Переход на  обработку запроса IRQ1
$0006   jmp EXT_INT2     ; Переход на  обработку запроса IRQ2
$0008   jmp EXT_INT3     ; Переход на  обработку запроса IRQ3
$000A   jmp EXT_INT4     ; Переход на  обработку запроса IRQ4
$000C   jmp EXT_INT5     ; Переход на  обработку запроса IRQ5
$000E   jmp EXT_INT6     ; Переход на  обработку запроса IRQ6
$0010   jmp EXT_INT7     ; Переход на  обработку запроса IRQ7
$0012   jmp TIM2_COMP    ; Переход на обработку при выполнении условия сравнения таймера 2
$0014   jmp TIM2_OVF     ; Переход на обработку при переполнении  таймера 2
$0016   jmp TIM1_CAPT    ; Переход на обработку при захвате фронта таймером  1
$0018   jmp TIM1_COMPA   ; Переход на обработку при срабатывании компаратора А таймера 1
$001A   jmp TIM1_COMPB   ; Переход на обработку при срабатывании компаратора В таймера 1
$001C   jmp TIM1_OVF     ; Переход на обработку при переполнении таймера 1
$001E   jmp TIM0_COMP    ; Переход на обработку при выполнения условия сравнения таймера 0
$0020   jmp TIM0_OVF     ;Переход на обработку при переполнении таймера 0
$0022   jmp SPI_STC      ; Переход на обработку при завершении передачи SPI
$0024   jmp USART0_RXC   ; Переход на обработку при завершении приема УСАПП0
$0026   jmp USART0_DRE   ; Переход на обработку при освобождении регистра данных UDR УСАПП0
$0028   jmp USART0_TXC   ; Переход на обработку при завершении передачи УСАПП0
$002A   jmp ADC          ; Переход на обработку при завершении преобразования АЦП
$002C   jmp EE_RDY       ; Переход на обработку при готовности ЭСППЗУ
$002E   jmp ANA_COMP     ; Переход на обработку при срабатывании аналогового компаратора
$0030   jmp TIM1_COMPC   ; Переход на обработку при срабатывании компаратора С таймера 1
$0032   jmp TIM3_CAPT    ; Переход на обработку при захвате фронта таймером 3
$0034   jmp TIM3_COMPA   ; Переход на обработку при срабатывании компаратора А таймера 3
$0036   jmp TIM3_COMPB   ; Переход на обработку при срабатывании компаратора В таймера 3
$0038   jmp TIM3_COMPC   ; Переход на обработку при срабатывании компаратора С таймера 3
$003A   jmp TIM3_OVF     ; Переход на обработку при переполнении таймера 3
$003C   jmp USART1_RXC   ; Переход на обработку по завершении приема УСАПП1
$003E   jmp USART1_DRE   ; Переход на обработку при освобождении регистра данных UDR УСАПП1
$0040   jmp USART1_TXC   ; Переход на обработку при завершении передачи УСАПП1
$0042   jmp TWI          ; Переход на обработку прерывания по двухпроводному последовательному интерфейсу 
$0044   jmp SPM_RDY      ; Переход на обработку прерывания при готовности выполнения команды SPM
;
$0046   RESET:ldir16, high(RAMEND); Начало основной программы
$0047   out SPH,r16      ; Установка указателя стека в конце ОЗУ
$0048   ldi r16, low(RAMEND)
$0049   out SPL,r16
$004A   sei ; Разрешение прерываний
$004B  xxx
... ... ... ...

Если конфигурационный бит BOOTRST незапрограммирован, размер загрузочного сектора установлен 8 кбайт и бит IVSEL установлен в регистре MCUCR перед разрешением любого прерывания, то можно использовать следующий пример распределения программы по адресам векторов сброса и прерываний.

Адрес   Инструкция      Комментарий
$0000   RESET:ldi r16,high(RAMEND) ; Начало основной программы
$0001   out SPH,r16     ; Установка указателя стека в конце ОЗУ
$0002   ldi r16,low(RAMEND)
$0003   out SPL,r16
$0004   sei ; Разрешение прерываний
$0005  xxx
;
.org $F002
$F002   jmp EXT_INT0    ; Переход на обработку прерывания IRQ0
$F004   jmp EXT_INT1    ; Переход на обработку прерывания IRQ1
... ... ... ;
$F044   jmp SPM_RDY     ; Переход на обработку прерывания по готовности к записи в память программ

Если конфигурационный бит BOOTRST запрограммирован и установлен размер загрузочного сектора 8 кбайт, то можно использовать следующий шаблон программы:

Адрес   Инструкция     Комментарий
.org $0002
$0002   jmp EXT_INT0   ; Переход на обработку прерывания IRQ0
$0004   jmp EXT_INT1   ; Переход на обработку прерывания IRQ1
... ... ... ;
$0044   jmp SPM_RDY    ; Переход на обработку прерывания по готовности к записи в память программ
;
.org $F000
$F000   RESET: ldi r16,high(RAMEND) ; Начало основной программы
$F001   out SPH,r16    ; Установка указателя стека в конец ОЗУ
$F002   ldi r16,low(RAMEND)
$F003   out SPL,r16
$F004   sei            ; Разрешение прерываний
$F005  xxx

Если конфигурационный бит BOOTRST запрограммирован, размер загрузочного сектора установлен 8 кбайт и бит IVSEL в регистре MCUCR установлен перед разрешение любого из прерываний, то распределение адресов в программе следующее:

Адрес   Инструкция     Комментарий
;
.org $F000
$F000   jmp RESET      ; Переход на обработку сброса
$F002   jmp EXT_INT0   ; Переход на обработку прерывания IRQ0
$F004   jmp EXT_INT1   ; Переход на обработку прерывания IRQ1
... ... ... ;
$F044   jmp SPM_RDY    ; Переход на обработку прерывания по готовности записи в память программ
$F046   RESET: ldi r16,high(RAMEND) ; Начало основной программы
$F047   out SPH,r16    ; Установка указателя стека в конец ОЗУ
$F048   ldi r16,low(RAMEND)
$F049   out SPL,r16
$F04A   sei            ; Разрешение прерываний
$F04B  xxx

Перемещение между секторами загрузочной и прикладной программы

Общий регистр управления прерываниями задает размещение таблицы векторов прерываний.

Регистр управления микроконтроллером – MCUCR

Разряд 7 6 5 4 3 2 1 0  
  SRE SRW10 SE SM1 SM0 SM2 IVSEL IVCE MCUCR
Чтение/запись Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп.  
Исх. значение 0 0 0 0 0 0 0 0  

Разряд 1 – IVSEL: Выбор вектора прерывания

Если бит IVSEL сброшен (=0), то векторы прерываний размещаются в начале флэш-памяти. Если данный бит установлен (=1), то векторы прерываний перемещаются в начало загрузочного сектора флэш-памяти. Фактический адрес начала загрузочного сектора определяется значением конфигурационных бит BOOTSZ. См. раздел “Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи” для выяснения подробностей. Во избежание несанкционированных изменений таблицы векторов прерываний необходимо выполнить специальную последовательность записи при изменении бита IVSEL:

  1. Записать лог. 1 в бит разрешения изменения вектора прерывания (IVCE).
  2. В течение четырех машинных циклов записать желаемое значение в IVSEL, при этом записывая лог.0 в IVCE.

Прерывания будут автоматически отключены при выполнении такой последовательности. Прерывания отключаются во время установки IVCE и останутся отключенными до перехода к инструкции следующей за инструкцией записи в IVSEL. Если IVSEL не записан, то прерывания будет находиться в отключенном состоянии 4 такта синхронизации. Состояние бита I в регистре статуса не затрагивается при автоматическом отключении прерываний.

Прим. : Если векторы прерываний помещаются в загрузочный сектор и бит защиты загрузочного сектора BLB02 запрограммирован, то прерывания будут отключены при выполнения программы с секторе прикладной программы. Если векторы прерываний размещены в прикладном секторе и бит защиты BLB12 запрограммирован, то прерывания становятся отключенными при выполнении программы в загрузочном секторе. См. также “ Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи ” для более подробного изучения бит защиты.

Разряд 0 – IVCE: Разрешение изменения вектора прерывания

В бит IVCE должна быть записана лог. 1, чтобы разрешить изменение бита IVSEL. IVCE сбрасывается аппаратно через четыре машинных цикла после записи лог. 1 в IVSEL. Установка бита IVCE приведет к отключению прерываний, что описано при рассмотрении бита IVSEL выше. Ниже приведен пример кода.

Пример кода на Ассемблере
Move_interrupts:
; Разрешение изменения векторов прерываний
ldi r16, (1<<ivce) 1="" ldi="" out="" r16=""><<ivsel) mcucr="(1<<IVCE);" out="" r16="" ret="" void="">

 

<< Предыдущая глава
Оглавление Следующая глава >>
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Интересно

Если на шприц отсоса припоя надеть отрезок силиконовой трубки.
То работать шприц станет лучше,некоторое количество припоя просто останутся в трубке,откуда и удалить их проще,так что при взводе шприца меньше сыпятся на плату остатки припоя из шприца.

Похожие статьи