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