Ngt là mt tín hiu gi đn b x lí, yêu cu b x lí tm ngng các hot đng hin ti đ nhy đn mt nơi khác thc hin mt nhim v nào đó. Chương trình đi cùng vi ngt đưc gi là trình dch v ngt ISR (Interrupt Service Routine) hay còn gi là trình qun lý ngt (Interrupt handler). Ngt là gì?
Các tín hiu dn đn ngt có th xut phát t : 1.Thit b bên trong chip (ngt báo b đm timer/counter tràn, ngt báo quá trình gi d liu bng RS232 kt thúc…). 2. Các tác nhân bên ngoài (ngt báo có 1 button đưc nhn, ngt báo có 1 gói d liu đã đưc nhn 3…
Đi vi mi ngt thì phi có mt trình phc v ngt ISR. Khi mt ngt đc gi thì b vi điu khin chy trình phc v ngt. Đi vi mi ngt thì có mt v trí c đnh trong b nh đ gi đa ch ISR ca nó. BNG VECTOR NGT. Nhóm các v trí nh đưc dành riêng đ gi các đa ch ca các ISR đưc gi là bng véc tơ ngt.
Các bưc hot đng ca mt ngt Vi điu khin kt thúc lnh đang thc hin và lưu đa ch ca lnh k tip vào ngăn xp. Nó nhy đn mt v trí c đnh trong b nh đưc gi là bng véc tơ ngt nơi lưu gi đa ch ca mt trình phc v ngt. B vi điu khin nhn đa ch ISR t bng véc tơ ngt và nhy ti đó. Nó bt đu thc hin trình phc v ngt cho đn lnh cui cùng ca ISR là RETI (tr v t ngt ). Khi thc hin lnh RETI b vi điu khin quay tr v nơi nó đã b ngt. Trưc ht nó nhn đa ch ca b đm chương trình PC t ngăn xp bng cách kéo hai byte trên đnh ca ngăn xp vào PC. Sau đó bt đu thc hin các lnh t đa ch đó.
TH T ƯU TIÊN NGT. Mt vec tơ ngt có đa ch thp hơn trong b nh chương trình có mc đ ưu tiên cao hơn Chn hn ngt ngoài 0 ( INT0 ) có mc đ ưu tiên cao hơn ngt ngoài 1 ( INT1 ).
TH T ƯU TIÊN NGT Khi AVR đang thc hin mt trình phc v ngt thuc mt ngt nào đó thì li có mt ngt khác đưc kích hot. Trong nhng trưng hp như vy thì mt ngt có mc ưu tiên cao hơn có th ngt mt ngt có mc ưu tiên thp hơn.Lúc này ISR ca ngt có mc ưu tiên cao hơn s đưc thc thi (*). Khi thc hin xong ISR ca ngt có mc ưu tiên cao hơn thì nó mi quay li phc v tip ISR ca ngt có mc ưu tiên thp hơn trưc khi tr v chương trình chính. Đây gi là ngt trong ngt
Sơ đ các ngt lng nhau
External Interrupt – Ngt ngoài Đây là loi ngt duy nht đc lp vi các thit b ngoi vi ca chip, các ngt khác thưng gn vi hot đng ca 1 thit b nào đó như Timer/Counter,ADC… ATmega128 có 8 ngt ngoài t INT0 đn INT7 ( chưa k ti ngt reset ).Tám ngt này tương ng vi 8 chân ca MCU là INT0,INT1, …, INT7 tương ng vi các PIN ca Atmega128
Có 4 thanh ghi liên quan đn ngt ngoài đó là : 1.Thanh ghi EIMSK (External Interrupt Mask Register). 2. Thanh ghi EICRA (External Interrupt Control Register A). 3. Thanh ghi EICRB (External Interrupt Control Register B) 4.Thanh ghi EIFR(External Interrupt Flag Register)
1.Thanh ghi EIMSK Thanh ghi 8 bit, cho phép 8 ngt ngoài. Bit có giá tr là 1: cho phép ngt 0: không cho phép ngt
Khi cho phép ngt toàn cc ( set bit I trong thanh ghi SREG thành 1 ) thì các ngt vn chưa th thc thi, đ ngt có th thc thi ta cn phi cho phép nó, 8 bit trong thanh ghi EIMSK s quyt đnh 8 ngt ngoài tương ng ( t INT7...INT0 ) có đưc cho phép hay không. Khi mt trong s 8 bit ( t INT7...INT0 ) đưc set thành 1 và ngt toàn cc đưc cho phép thì ngt ngoài tương ng đưc cho phép. Còn tín hiu ngt là mc hay cnh s do các thanh ghi EICRA và EICRB qui đnh.
Thanh ghi EICRA Tám bit ca thanh ghi EICRA s điu khin kiu bt mu cho 4 ngt INT3, INT2, INT1, INT0
Bng điu khin ý nghĩa ca ngt : ISCn1ISCn0Kiu bt mu 00Mc thp s to yêu cu ngt 01D tr 10Cnh xung ( Falling ) s to yêu cu ngt 11Cnh lên ( Rising ) s to yêu cu ngt n = 0, 1, 2 hoc 3 Ví d: cho phép s dng ngt s 6 (INT6), như vy chúng ta cn phi khi to cho thanh ghi EIMSK giá tr là: b tương ng EIMSK=0x40
Thanh ghi EICRB thanh ghi 8 bit, điu khin ngt t INT 4 -> INT7 Ví d: Khi to CPU cho phép ngt ngoài s 6 và phát sinh ngt khi có tác đng mc thp. EIMSK= 0x40 // cho phép ngt ngoài s 6 EICRB = 0x00 // tác đng mc thp
Bng điu khin ý nghĩa ca ngt:
4.Thanh ghi EIFR
Bits 7..0 – INTF7 - INTF0: External Interrupt Flags 7 – 0 : Đây là tám c ngt tương ng vi tám ngt ngoài INT7..INT0. Khi có tín hiu yêu cu ngt ngoài thì c ngt tương ng s đưc set thành 1, nu ngt tương ng đưc cho phép thì MCU s nhy ti bng véc tơ ngt, c ngt s đưc xóa khi chương trình phc v ngt ( ISR ) đưc thc thi. Ngoài ra ta cũng có đt hay xóa c ngt bng cách ghi trc tip mt giá tr logic vào nó.
chương trình phc v ngt #include // Khai báo bin toàn cc (nu cn) // Khai báo hàm khi to CPU, PORT // Khai báo hàm phc v ngt #pragma interrupt_handler : void (void) { // Thc thi các yêu cu ngt } // Khai báo các hàm con // Đon chương trình chính void main (void) { CPU_init (); PORT_init ();... while(1) { // Các lnh thc thi yêu cu // Gi hàm con }