|
Πίνακας Ι.
Χειρισμός διακοπών στον 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 Πορλιδάς Δημήτριος
|
|