Interruption ATmega328
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Interruption ATmega328



  1. #1
    invitea2fbcca3

    Interruption ATmega328


    ------

    Bonjour,

    J'utilise un ATmega328, le port PD2 (INT0) est utilisé comme interruption pour lancer une routine à un flanc descendant du signal connecté.
    J'aimerai utiliser le port PD3 (INT1) pour lancer une autre interruption sur un flanc descendant d'un autre signal.

    Que se passe t-il s'il y a un flanc descendant sur INT1 alors que la routine d'interruption liée à INT0 est en cours ?

    J'ai du mal à trouver la réponse dans la doc de l'ATmega328 et sur le net, pourriez-vous m'aider svp ?

    Merci

    -----

  2. #2
    invite29971eb1

    Re : Interruption ATmega328

    Tu as regardé dans la datasheet?

  3. #3
    invite39a88b12

    Re : Interruption ATmega328

    Bonjour,
    ca dépend de ton code. Avec avr-libc tu peux configurer les ISR pour qu'elles ne soient ou non interruptibles par d'autres ISRs. Tu peux même faire une avalanche d'ISR en te débrouillant bien .

    Voir http://www.nongnu.org/avr-libc/user-...nterrupts.html , section Nested Interrupts.

    a+
    Charlot

  4. #4
    invitea2fbcca3

    Re : Interruption ATmega328

    Oui j'ai écrit dans le premier message que j'ai lu le datasheet mais je n'ai pas bien compris..

    Merci charlesgg ta réponse et pour le lien, c'est très intéressant !
    Cependant ça ne va pas trop m'aider dans le cas présent, je ne peux pas interrompre une interruption au profit d'une autre.. il faut que je trouve une autre façon de faire ce que je veux...

  5. A voir en vidéo sur Futura
  6. #5
    invite39a88b12

    Re : Interruption ATmega328

    Bonjour,
    en fait la manière courante de faire est d'avoir des routines d'interruption très courtes, genre :

    Code:
    volatile uint8_t passe_dans_int0;
    volatile uint8_t passe_dans_int1;
    
    ISR vect_INT0 {
          passe_dans_int0 = 1;
    }
    ISR vect_INT1 {
          passe_dans_int1 = 1;
    }
    
    int main() {
         uint8_t copie_passe_dans_int0, copie_passe_dans_int1;
         cli(); // desactiver les interruptions
         copie_passe_dans_int0 = passe_dans_int0;
         passe_dans_int0 = 0;
         copie_passe_dans_int1 = passe_dans_int1;
         passe_dans_int1 = 0;
         sei(); // reactiver les interruptions
         if(copie_passe_dans_int0 == 1) {
             // faire des trucs pour int0
         }
         if(copie_passe_dans_int1 == 1) {
             // faire des trucs pour int1
         }
    }
    l'idée est d'interrompre le déroulement normal du programme le moins longtemps possible.
    1/ Les variables modifiées dans les interruptions sont à déclarer en volatile pour empêcher le compilateur de les optimiser. cf un livre sur le C.
    2/ Pour pouvoir les copier, on désactive les interruptions. Ici ce n'est pas obligatoire car copier une valeur d'un octet ne prend qu'un cycle. Pour une valeur genre 32 bits (un compteur incrémenté dans l'interruption), c'est obligatoire, car sinon la valeur peut changer pendant la copie.
    3/ On doit les copier, car leur valeur risque de changer à tout moment, et si tu dois les tester plusieurs fois dans ton code, tu risques d'avoir des valeurs différentes à chaque fois (race condition, en anglais).

Discussions similaires

  1. AVR ATMEL JTagice mk II sur ATMega328
    Par invite5fcf89e8 dans le forum Électronique
    Réponses: 6
    Dernier message: 18/12/2011, 23h04
  2. ports pb6/pb7 sur arduino/atmega328
    Par Hoedus dans le forum Électronique
    Réponses: 2
    Dernier message: 13/05/2011, 15h01
  3. Interruption en C
    Par invitedf66cb3b dans le forum Électronique
    Réponses: 5
    Dernier message: 02/12/2010, 15h49
  4. Interruption
    Par invite28559ad9 dans le forum Électronique
    Réponses: 4
    Dernier message: 06/01/2009, 22h07
  5. Interruption
    Par invited59ff025 dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2008, 15h05
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...