0
Τα Interrupts, ή ρουτίνες Interrupts είναι ειδικά κομμάτια κώδικα που θα μπορούσαμε να πούμε πως εκτελούνται παράλληλα με το κυρίως πρόγραμμά μας. Στο παρακάτω διάγραμμα βλέπουμε την “παράλληλη” εκτέλεση.
Βλέπουμε πως η ρουτίνα του interrupt είναι σχεδόν παράλληλη προς το κύριο τμήμα του προγράμματος. Μιας και έχουμε μόνο μία CPU δεν υπάρχει παράλληλη επεξεργασία αλλά το κυρίως πρόγραμμα διακόπτεται μόλις φτάσει το σήμα για ένα interrupt και εκτελείτε η ρουτίνα του. Μόλις εκτελεστεί η ρουτίνα του interrupt συνεχίζεται η εκτέλεση του κυρίως προγράμματος.
Για να πάμε τώρα στην παρακάτω εφαρμογή.
Έχουμε λοιπόν 2 LED, το ένα συνδεδεμένο στο port B.7 ( κίτρινο LED) και το άλλο στο port C.0 ( πράσινο LED ) . Θέλουμε λυπών το πρόγραμμα να λειτουργεί ως εξής :
Στην αρχή μόλις δοθεί η τροφοδοσία στον MC να αναβοσβήνει το πράσινο λαμπάκι ( port C.0 ) . Στη συνέχεια μόλις πατήσουμε το button να σταματήσει το εκτελούμενο πρόγραμμα που αναβοσβήνει το πράσινο LED και να αρχίσει η υπορουτίνα των διακοπών ( interrupt ) Που θα ανάψει το κίτρινο LED για 300 ms θα το σβήσει , θα περιμένει 300 ms και θα συνεχίσει να εκτελείται το αρχικό πρόγραμμα ( με το πράσινο LED ) που είχε αρχίσει.
Πάμε λυπών στο CodeVision και με τον ίδιο τρόπο που είπαμε στα προηγούμενα μαθήματα
γράφουμε τον κώδικα και τον εκτελούμε για να πάρουμε το αρχείο .hex
Κώδικας:#include <mega8.h> #include <delay.h> //epexergastis diakopwn ________________________________________________________________________ interrupt[3] void ExtInt1(void) //epexergastis diakopwn se int1(Port D, exwdos 3) { PORTB.7=1; // iporutina pu energopoieitai otan dexthei sima to int1 ( kitrino LED) delay_ms(300); PORTB.7=0; delay_ms(300); } // rithmiseis thirwn kai twn kataxwritwn __________________________________________________________________ void main(void) { DDRC=0b11111111; //Olus tus exwdus tu port C ws exwdoi PORTC=0b00000000; // Midenizume to port C prin arxisei to programma (kalu kaku) DDRB=0b11111111; //Olus tus exwdus tu port B ws exwdoi PORTB=0b00000000; // Midenizume to port B prin arxisei to programma (kalu kaku) DDRD=0b00000000; // Olus tus exwdus tu port D ws exwdoi PORTD=0b11111111; // Energopoiume ta Pull-up resistors GICR=0b10000000; /* Registr General Interrupt Control Register – Anigei tis exwterikes diakopes */ /* 10 000000 – Sto pin int1; 01 000000 –Sto pin int0; 11 000000 – Sto pin int1 & int0 */ MCUCR=0b00001000; /* Registr Micro Controller Unit Control Registr - Rithmizei tin energopoiish twn diakopwn 0000 10 00 – Kata tin ptosi tu simatos apo logiko 1 se 0 stin exwdo int1; 0000 11 00 – Kata tin anwdo tu simatos apo logiko 0 se 1 stin exwdo int1; 0000 00 00 - Kata tin xamili stathmi 0 tu simatos stin exwdo int1; 0000 01 00 - Se opoiadipote logiki allagi tu simatos stin exwdo tu int1 */ #asm("sei") // I alios SREG = (1<<7); //Status Register - epitrepei tis diakopes // To kiriws programma ___________________________________________________________________________ while(1) { PORTC.0=1; delay_ms(300); // To kirios programma pu anavosvinei to prasino LED PORTC.0=0; delay_ms(300); } }
Μερικές σημαντικές διευκρινίσεις στον κώδικα
Το interrupt[3] void ExtInt1(void) - Εδώ γίνεται η επεξεργασία των διακοπών, η αρχή τις υπορουτίνας .
Παρακάτω σας λέω για το πώς ρυθμίζονται οι καταχώρησες . Γι αυτούς που δεν ξέρουν τη ακριβώς είναι ένας καταχώρησης θα το πω με μεγάλη συντομία. Εξάλλου στο internet υπάρχει μπόλικη θεωρία για διάβασμα. Καταχώρησης είναι με λίγα λόγια μία αποθήκη πληροφορίας που δίνει στον μικροελεγκτή να καταλάβει το τη ακριβώς πρέπει να κάνει.
Κατ' ουσίαν οι καταχωρητές ρυθμίζουν στη περίπτωση μας τον μικροελεγκτή. Πρισσότερα μπορείτε να διαβάσετε στα τεχνικά χαρακτηριστικά του MC.
GICR=0b10000000; /* Registr General Interrupt Control Register – Ανοίγει τις εξωτικές διακοπές */
/* 10 000000 – Στο pin int1;
01 000000 – Στο pin int0;
11 000000 – Στο pin int1 & int0 */
MCUCR=0b00001000; /* Registr Micro Controller Unit Control Registr - Ρυθμίζει την ενεργοποίηση των διακοπών */
/*
0000 10 00 – Κατά την πτώση του σήματος από λογικό 1 σε λογικό 0 στην έξοδο int1
Πηγή: Greek Electronics