Εμφάνιση αποτελεσμάτων : 1 έως 1 από 1

Θέμα: Αρχή με τον Atmega8 - Διακοπές

  1. #1
    Μέλος Το avatar του χρήστη master3763
    Όνομα
    master3763
    Εγγραφή
    Aug 2007
    Περιοχή
    Αλεξανδρούπολη
    Μηνύματα
    83

    Προεπιλογή Αρχή με τον Atmega8 - Διακοπές

    Τα 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

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη master3763 : 19-03-12 στις 15:10

  2. 2 μέλη ευχαρίστησαν τον master3763 για αυτό το χρήσιμο μήνυμα:

    FILMAN (19-03-12), nikknikk4 (20-03-12)

Παρόμοια Θέματα

  1. Αρχή με τον Atmega8 - Κουμπιά σε MC
    By master3763 in forum Μικροελεγκτές
    Απαντήσεις: 8
    Τελευταίο Μήνυμα: 19-03-12, 14:38
  2. Απαντήσεις: 37
    Τελευταίο Μήνυμα: 16-03-12, 18:22
  3. Αρχή με τον Atmega8 - μαθήματα μικροελεγκτών
    By master3763 in forum Μικροελεγκτές
    Απαντήσεις: 44
    Τελευταίο Μήνυμα: 15-03-12, 10:27

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας