IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Interruption Usart RX


Sujet :

Arduino

  1. #1
    Membre confirmé

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut Interruption Usart RX
    Bonjour,

    Je travaille sur une carte ARDUINO UNO (je me lance )

    Voila mon projet :

    Je dois piloter 60 led RGB, 64 led standard. Je pilote le tout par un Rasberry (soft dévellopé sous Lazarus).

    Je récupere les octets sur la carte Arduino par : (morceau de code)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    void serialEvent() // déclaration de la fonction d'interruption sur la voie série
    {
      if (Serial.available() > 0) {
        Octet = Serial.parseInt ();
        switch (cas) {
            case 1:
                  Tableau[x] = Octet;
                  x++;
                  if (x==179){
                  compteur1 = 0;
                  for (k=0; k<178 ; k= k +3) {
                      TabRouge [compteur1] = Tableau[k];
                      TabVert [compteur1] = Tableau[k+1];
                      TabBleu[compteur1] = Tableau[k+2];
                      compteur1++;
     
                  }
                  compteur1 =0;
                  }               
                  break;
     
     
            case 2:
                  tampon[x] = Octet;
    etc...
    En fonction du case (dans la boucle loop), j'appelle des fonctions qui tournent en boucle et qui passent rarement par le loop()
    Cette méthode ne me plait pas car j'ai lu que serial.event() était déclenché qu'a la fin du loop.
    Pour moi, ce n'est donc pas une interruption !

    J'ai recherché comment faire une VRAIE interruption. Voici ce code (qui fonctionne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     #include <avr/interrupt.h>
    #include <avr/io.h>
     
    char temp;
    void setup()
    {
       pinMode(13, OUTPUT);  // configuring pin 13 as output
       UBRR0 = 103; // for configuring baud rate of 9600bps
       UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00); 
    // Use 8-bit character sizes
       UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);  
    // Turn on the transmission, reception, and Receive interrupt     
       sei();// enable global interrupt  
    }
     
    void loop()
    {
      switch(temp)
      {
        case '0':
        digitalWrite(13,LOW);
        break;
     
        case '1':
        digitalWrite(13,HIGH);
         UDR0 = temp; // essai de transmition !
        break;
     
        case '2':
        digitalWrite(13,HIGH);
        delay(300);
        digitalWrite(13,LOW);
        delay(300);
        break;
     
        case '3':
        digitalWrite(13,HIGH);
        delay(1000);
        digitalWrite(13,LOW);
        delay(1000);
        break;   
      }
    }
     
    ISR(USART_RX_vect)
    { 
      temp=UDR0;// read the received data byte in temp
    }
    .... Et voila ma question Est-ce une vraie interruption ?

    ps : Quand je mets une boucle infinie après le loop(), l'interruption ne se déclenche plus.


    Merci pour vos réponses et votre temps.

    elecpic

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 242
    Par défaut
    Bonjour,
    Citation Envoyé par elecpic
    Est-ce une vraie interruption ?
    Sans avoir pris le temps de regarder en détail la configuration des registres, oui ça ressemble à une vraie interruption.

    Essaye de déclarer ta variable globale en volatile pour forcer le rafraichissement de son emplacement en RAM sinon le compilateur peut laisser les nouvelles valeurs de temp dans un registre de travail et tu auras l'impression que rien ne se passe.
    volatile char temp;


    Si tu as un oscilloscope place des traceurs dans ton code, comme tu as fait dans le switch, ça te permettra de voir si tu passes ou pas dans l'interruption. Ensuite tu retires le traceur :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ISR(USART_RX_vect)
    { 
      temp=UDR0;// read the received data byte in temp
      digitalWrite(LED,HIGH);
      delay(1000);
      digitalWrite(LED,LOW);
     
    }

  3. #3
    Membre confirmé

    Inscrit en
    Mars 2008
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 75
    Par défaut l'oscillo, mais c'est bien sur !
    Bonjour Vincent,

    Suite à tes conseils, je viens de mettre le montage sous oscilloscope.

    traceur1 : routine dans les sous fonction du programme (très loin du loop())
    traceur2 : dans la routine d'interruption.

    Conclusion : c'est bien une interruption VRAIE

    J'ai également passé la variable globale en "volatile char" : je ne connaissait pas

    Merci pour tes précieux conseils et ton temps passé.

    elecpic

    Ps : je clore cette discussion.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser l'interruption clavier
    Par Ninkosen dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 28/03/2003, 01h01
  2. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33
  3. interruption materiel port parrallele
    Par pyrostan dans le forum C
    Réponses: 2
    Dernier message: 13/01/2003, 08h22
  4. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22
  5. Bouquins d'Assembleur - interruptions matérielles
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/11/2002, 21h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo