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

 

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

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

electronics@porlidas.gr

Facebook

Linkedin


 

 

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

Vector No

 Program Address

 Source

 Interrupt Definition

1

 $0000

 RESET

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

2

 $0002

 INT0

 External Interrupt Request 0

3

 $0004

 INT1

 External Interrupt Request 1

4

 $0006

 INT2

 External Interrupt Request 2

5

 $0008

 INT3

 External Interrupt Request 3

6

 $000A

 INT4

 External Interrupt Request 4

7

 $000C

 INT5

 External Interrupt Request 5

8

 $000E

 INT6

 External Interrupt Request 6

9

 $0010

 INT7

 External Interrupt Request 7

10

 $0012

 PCINT0

 Pin Change Interrupt Request 0

11

 $0014

 PCINT1

 Pin Change Interrupt Request 1

12

 $0016

 PCINT2

 Pin Change Interrupt Request 2

13

 $0018

 WDT

 Watchdog Time-out Interrupt

14

 $001A

 TIMER2 COMPA

 Timer/Counter2 Compare Match A

15

 $001C

 TIMER2 COMPB

 Timer/Counter2 Compare Match B

16

 $001E

 TIMER2 OVF

 Timer/Counter2 Overflow

17

 $0020

 TIMER1 CAPT

 Timer/Counter1 Capture Event

18

 $0022

 TIMER1 COMPA

 Timer/Counter1 Compare Match A

19

 $0024

 TIMER1 COMPB

 Timer/Counter1 Compare Match B

20

 $0026

 TIMER1 COMPC

 Timer/Counter1 Compare Match C

21

 $0028

 TIMER1 OVF

 Timer/Counter1 Overflow

22

 $002A

 TIMER0 COMPA

 Timer/Counter0 Compare Match A

23

 $002C

 TIMER0 COMPB

 Timer/Counter0 Compare match B

24

 $002E

 TIMER0 OVF

 Timer/Counter0 Overflow

25

 $0030

 SPI, STC SPI

 Serial Transfer Complete

26

 $0032

 USART0 RX

 USART0 Rx Complete

27

 $0034

 USART0 UDRE

 USART0 Data Register Empty

28

 $0036

 USART0 TX

 USART0 Tx Complete

29

 $0038

 ANALOG COMP

 Analog Comparator

30

 $003A

 ADC

 ADC Conversion Complete

31

 $003C

 EE READY

 EEPROM Ready

32

 $003E

 TIMER3 CAPT

 Timer/Counter3 Capture Event

33

 $0040

 TIMER3 COMPA

 Timer/Counter3 Compare Match A

34

 $0042

 TIMER3 COMPB

 Timer/Counter3 Compare Match B

35

 $0044

 TIMER3 COMPC

 Timer/Counter3 Compare Match C

36

 $0046

 TIMER3 OVF

 Timer/Counter3 Overflow

37

 $0048

 USART1 RX

 USART1 Rx Complete

38

 $004A

 USART1 UDRE

 USART1 Data Register Empty

39

 $004C

 USART1 TX

 USART1 Tx Complete

40

 $004E

 TWI

 2-wire Serial Interface

41

 $0050

 SPM READY

 Store Program Memory Ready

42

 $0052

 TIMER4 CAPT

 Timer/Counter4 Capture Event

43

 $0054

 TIMER4 COMPA

 Timer/Counter4 Compare Match A

44

 $0056

 TIMER4 COMPB

 Timer/Counter4 Compare Match B

45

 $0058

 TIMER4 COMPC

 Timer/Counter4 Compare Match C

46

 $005A

 TIMER4 OVF

 Timer/Counter4 Overflow

47

 $005C

 TIMER5 CAPT

 Timer/Counter5 Capture Event

48

 $005E

 TIMER5 COMPA

 Timer/Counter5 Compare Match A

49

 $0060

 TIMER5 COMPB

 Timer/Counter5 Compare Match B

50

 $0062

 TIMER5 COMPC

 Timer/Counter5 Compare Match C

51

 $0064

 TIMER5 OVF

 Timer/Counter5 Overflow

52

 $0066

 USART2 RX

 USART2 Rx Complete

53

 $0068

 USART2 UDRE

 USART2 Data Register Empty

54

 $006A

 USART2 TX

 USART2 Tx Complete

55

 $006C

 USART3 RX

 USART3 Rx Complete

56

 $006E

 USART3 UDRE

 USART3 Data Register Empty

57

 $0070

 USART3 TX

 USART3 Tx Complete

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

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

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

 

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

 


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

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

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

 

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

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