Διακοπές – Interrupts (IRQ)

 

Συγγραφέας: Πορλιδάς Δημήτριος

Βιογραφικό Σημείωμα

electronics@porlidas.gr

Facebook

Linkedin


 

 

Πίνακας Ι. Χειρισμός διακοπών στον ATmega16.

A/A

Program address

Source

Vector

Interrupt definition

1

$000

RESET

 

External Pin, Power-on Reset, Brown-outReset, Watchdog Reset, and JTAG AVR Reset

2

$002

INT0

EXT_INT0_vect

External Interrupt Request 0

3

$004

INT1

EXT_INT1_vect

External Interrupt Request 1

4

$006

TIMER2 COMP

TIM2_COMP_vect

Timer/Counter2 Compare Match

5

$008

TIMER2 OVF

TIM2_OVF_vect

Timer/Counter2 Overflow

6

$00A

TIMER1 CAPT

TIM1_CAPT_vect

Timer/Counter1 Capture Event

7

$00C

TIMER1 COMPA

TIM1_COMPA_vect

Timer/Counter1 Compare Match A

8

$00E

TIMER1 COMPB

TIM1_COMPB_vect

Timer/Counter1 Compare Match B

9

$010

TIMER1 OVF

TIM1_OVF_vect

Timer/Counter1 Overflow

10

$012

TIMER0 OVF

TIM0_OVF_vect

Timer/Counter0 Overflow

11

$014

SPI, STC

SPI_STC_vect

Serial Transfer Complete

12

$016

USART, RXC USART, Rx

USART_RXC_vect

Complete

13

$018

USART, UDRE USART

USART_UDRE_vect

Data Register Empty

14

$01A

USART, TXC USART, Tx

USART_TXC_vect

Complete

15

$01C

ADC

ADC_vect

ADC Conversion Complete

16

$01E

EE_RDY

EE_RDY_vect

EEPROM Ready

17

$020

ANA_COMP

ANA_COMP_vect

Analog Comparator

18

$022

TWI

TWSI_vect

Two-wire Serial Interface

19

$024

INT2

EXT_INT2_vect

External Interrupt Request 2

20

$026

TIMER0 COMP

TIM0_COMP_vect

Timer/Counter0 Compare Match

21

$028

SPM_RDY

SPM_RDY_vect

Store Program Memory Ready

Οι AVR υποστηρίζουν διακοπές κατά τις οποίες το πρόγραμμα διακόπτει[1] την κανονική ροή του και εκτελεί κάποιες λειτουργίες που ορίζονται από το διάνυσμα της διακοπής. Οι διακοπές μπορεί να είναι είτε εξωτερικές είτε εσωτερικές. Οι εξωτερικές διακοπές προέρχονται από σήματα από εξωτερικές πηγές οι οποίες είναι συνδεδεμένες σε εισόδους του μικροελεγκτή ενώ οι εσωτερικές από τα εσωτερικά περιφερειακά του μικροελεγκτή. Κάθε διακοπή έχει ένα διάνυσμα στη μνήμη προγράμματος. Η διακοπή, το διάνυσμα και η διεύθυνσή του παρουσιάζονται στον Πίνακα Ι .Όσο μικρότερη είναι η διεύθυνση του διανύσματος, τόσο μεγαλύτερη είναι η προτεραιότητα της διακοπής. Από το διάνυσμα της διακοπής διευθυνσιοδοτείται ο Program Counter για να εκτελέσει τη ρουτίνα της διακοπής.

Οι διακοπές έχουν το δικό τους bit ενεργοποίησης στον αντίστοιχο καταχωρητή κατάστασής τους, το οποίο πρέπει να γίνει 1 προκειμένου να είναι διαθέσιμη να προκληθεί από την αιτία της και ένα γενικό bit[2] για όλες τις διακοπές, το οποίο πρέπει και αυτό να γίνει 1. Αν υπάρξει η αιτία για μια διακοπή γίνεται 1 η σημαία της διακοπής και αν είναι ενεργοποιημένες οι διακοπές από το γενικό bit, ξεκινάει να εκτελείται και καθαρίζεται η σημαία. Στη συνέχεια οι διακοπές απενεργοποιούνται[3] καθαρίζοντας το γενικό bit και ενεργοποιούνται ξανά όταν το πρόγραμμα βγει από τη διακοπή. Αν δεν είναι ενεργοποιημένες οι διακοπές, για οποιοδήποτε λόγο, τότε παραμένει σε αναμονή με τη σημαία της 1 έως ότου ενεργοποιηθούν. Αν εν τω μεταξύ υπάρξουν αιτίες και για άλλες διακοπές, θα γίνουν οι σημαίες τους 1 και θα είναι όλες σε αναμονή. Η διακοπή που θα εκτελεστεί πρώτη είναι αυτή με την υψηλότερη προτεραιότητα.    

Οι εξωτερικές διακοπές μπορούν να προγραμματιστούν ώστε να προκληθούν από μέτωπο παλμού ή από χαμηλή λογική κατάσταση. Οι διακοπές INT0 και INT1 όταν είναι ενεργοποιημένες ως διακοπές μετώπου παλμού, απαιτούν την παρουσία ρολογιού (I/O clock), ενώ όταν είναι ενεργοποιημένες ως διακοπές χαμηλής λογικής η διακοπή θα δρα όσο υπάρχει χαμηλή λογική στην είσοδο και δεν απαιτούν την παρουσία ρολογιού. Εκτελούνται ακόμα και αν ο μικροελεγκτής βρίσκεται σε sleep mode όπου δεν υπάρχει λειτουργία ρολογιού και για αυτό μπορούν να χρησιμοποιηθούν για να τον επαναφέρουν από αυτή την κατάσταση. Η διακοπή INT2 μπορεί να προγραμματιστεί μόνο ως διακοπή μετώπου παλμού και δρα ασύγχρονα.

 

©2016 Πορλιδάς Δημήτριος

 


[1] Με τη διακοπή RESET το πρόγραμμα επανεκκινεί ενώ με τις υπόλοιπες συνεχίζει από το σημείο που σταμάτησε κατά την έναρξη της διακοπής.

[2] Στον καταχωρητή SREG το Bit 7 με ονομασία I: Global Interrupt Enable.

[3] Αν θέλουμε να είναι ενεργοποιημένες ώστε να είναι δυνατό να δράσει μια άλλη διακοπή κατά τη διάρκεια εκτέλεσης των εντολών της διακοπής που έχει ήδη σε εξέλιξη, πρέπει να ενεργοποιήσουμε ξανά τις διακοπές με την εντολή sei().

 

Σας ευχαριστώ για την υποστήριξή σας ώστε να γίνει η ιστοσελίδα μου καλύτερη.

© 2017 Πορλιδάς Δημήτριος