Interruption sur entrée analogique pour M0

Bonjour,

J’essaie de trouver un moyen de configurer une interruption sur l’entrée A0 de ma carte Arduino M0.
J’ai trouver ce tutoriel : http://www.locoduino.org/spip.php?article64
Il est plutôt bien fait mais je me retrouve avec cet erreur à la compilation :

In file included from Z:\Arduino\Z-Magnétomètre-NV\Boitier Multi\Magnetometre_v2.2\Magnetometre_v2.2.ino:8:0:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:103:19: fatal error: new.h: No such file or directory

   #include <new.h>

                   ^

compilation terminated.

exit status 1
Erreur de compilation pour la carte Arduino M0

Il me semble donc que la bibliothèque ne fonctionne pas pour le µC du M0.

Est ce que vous connaîtriez une bibliothèque qui fonctionnerai pour le M0 ?

bonjour, le message est clair

fatal error: new.h: No such file or directory

A vérifier que ce fichier soit présent.

Le fichier est présent à cet emplacement : C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino

J'ai essayé de le copier dans le même dossier que la bibliothèque mais je me retrouve avec ces message d'erreur :

Les options de compilation ont été modifiées, tout sera recompilé
In file included from C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\cores\arduino/delay.h:27:0,

                 from C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\cores\arduino/Arduino.h:81,

                 from Z:\Arduino\Z-Magnétomètre-NV\Boitier Multi\Magnetometre_v2.2\Magnetometre_v2.2.ino:1:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: In constructor 'PCintPort::PCintPort(int, int, volatile uint8_t&)':

C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\variants\arduino_mzero/variant.h:66:44: error: base operand of '->' is not a pointer

 #define portInputRegister(port)    ( &(port->IN.reg) )

                                            ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:172:16: note: in expansion of macro 'portInputRegister'

  portInputReg(*portInputRegister(index)),

                ^

In file included from Z:\Arduino\Z-Magnétomètre-NV\Boitier Multi\Magnetometre_v2.2\Magnetometre_v2.2.ino:8:0:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: At global scope:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:301:32: error: 'PCMSK0' was not declared in this scope

 PCintPort portB=PCintPort(2, 0,PCMSK0); // port PB==2  (from Arduino.h, Arduino version 1.0)

                                ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:304:32: error: 'PCMSK1' was not declared in this scope

 PCintPort portC=PCintPort(3, 1,PCMSK1); // port PC==3  (also in pins_arduino.c, Arduino version 022)

                                ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:307:32: error: 'PCMSK2' was not declared in this scope

 PCintPort portD=PCintPort(4, 2,PCMSK2); // port PD==4

                                ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: In member function 'void PCintPort::enable(PCintPort::PCintPin*, PCIntvoidFuncPtr, uint8_t)':

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:374:2: error: 'PCICR' was not declared in this scope

  PCICR |= PCICRbit;

  ^

In file included from C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\cores\arduino/delay.h:27:0,

                 from C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\cores\arduino/Arduino.h:81,

                 from Z:\Arduino\Z-Magnétomètre-NV\Boitier Multi\Magnetometre_v2.2\Magnetometre_v2.2.ino:1:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: In static member function 'static int8_t PCintPort::attachInterrupt(uint8_t, PCIntvoidFuncPtr, int)':

C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\variants\arduino_mzero/variant.h:62:82: error: invalid conversion from 'PortGroup*' to 'uint8_t {aka unsigned char}' [-fpermissive]

 #define digitalPinToPort(P)        ( &(PORT->Group[g_APinDescription[P].ulPort]) )

                                                                                  ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:424:20: note: in expansion of macro 'digitalPinToPort'

  uint8_t portNum = digitalPinToPort(arduinoPin);

                    ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: In static member function 'static void PCintPort::detachInterrupt(uint8_t)':

C:\Users\NVaudaux\AppData\Local\Arduino15\packages\arduino\hardware\samd\1.6.16\variants\arduino_mzero/variant.h:62:82: error: invalid conversion from 'PortGroup*' to 'uint8_t {aka unsigned char}' [-fpermissive]

 #define digitalPinToPort(P)        ( &(PORT->Group[g_APinDescription[P].ulPort]) )

                                                                                  ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:447:20: note: in expansion of macro 'digitalPinToPort'

  uint8_t portNum = digitalPinToPort(arduinoPin);

                    ^

In file included from Z:\Arduino\Z-Magnétomètre-NV\Boitier Multi\Magnetometre_v2.2\Magnetometre_v2.2.ino:8:0:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:455:22: error: 'SREG' was not declared in this scope

    uint8_t oldSREG = SREG;

                      ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:456:8: error: 'cli' was not declared in this scope

    cli(); // disable interrupts

        ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:458:31: error: 'PCICR' was not declared in this scope

    if (port->portPCMask == 0) PCICR &= ~(port->PCICRbit);

                               ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: In member function 'void PCintPort::PCint()':

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:533:11: error: 'PCIFR' was not declared in this scope

   pcifr = PCIFR & PCICRbit;

           ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h: At global scope:

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:563:4: error: expected constructor, destructor, or type conversion before '(' token

 ISR(PORTBVECT) {

    ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:573:4: error: expected constructor, destructor, or type conversion before '(' token

 ISR(PORTCVECT) {

    ^

C:\Program Files (x86)\Arduino\libraries\PinChangeInt/PinChangeInt.h:583:4: error: expected constructor, destructor, or type conversion before '(' token

 ISR(PORTDVECT){ 

    ^

exit status 1
Erreur de compilation pour la carte Arduino M0

C'est bien ce que j'avais compris mais du coup je n'arrive pas à trouver de bibliothèque qui conviennent aux interruption pour le M0

Mon but est de lire l'entrée dès qu'il y a du changement dessus, j'ai cinq boutons relié à l'entrée et je voudrais pouvoir lire cette entrée via une interruption plutôt que de bloquer mon programme des que j'attend l'appui d'un bouton.

Pour ce qui est de faire le code moi même, je voulais être sur qu'il n'y ai pas de bibliothèque pour ça aant de me lancer dans les festivités ^^

hello je ne connais pas le MO

je viens de faire ce qui suit sur UNO …pour voir

veux tu tester?

//testé sur UNO + shield LCD 5 touches
//il faut mettre un shunt entre A0 et D2
#include <LiquidCrystal.h>
 LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int touch_Pin = A0;
int touch = 0;
void setup() {
  Serial.begin(115200);
  lcd.begin(16, 2);
  attachInterrupt(0, isr_touch, CHANGE);
  lcd.print("compteur =");
}

void loop() {
  // put your main code here, to run repeatedly:

}

void isr_touch()
{ 
  touch=analogRead(touch_Pin);
  lcd.setCursor(10, 0);
  lcd.print("    ");
  if (touch<1000){
  lcd.setCursor(10, 0);
  lcd.print(touch);}
  }

J’ai essayé avec attachInterrupt() et ça marche pour un seul appui, après ça ne marche plus…

Le programme doit certainement pouvoir être organisé différemment afin de ne pas recourir aux interruptions.

Mon programme marche déjà très bien sans les interruptions, c’est juste une amélioration à laquelle j’avais pensé

nathanv0: Mon but est de lire l'entrée dès qu'il y a du changement dessus, j'ai cinq boutons relié à l'entrée et je voudrais pouvoir lire cette entrée via une interruption plutôt que de bloquer mon programme des que j'attend l'appui d'un bouton.

Ce n'est pas une réponse directe à la question mais.... c'est un humain qui appuie sur le bouton ?

Parce que généralement on n'a pas besoin d'interruption pour gérer des boutons... mettre un test dans la loop() si elle est bien fichue et tourne assez vite n'a pas besoin d'être bloquant

Oui ce sont des boutons d'IHM qui permettent à l'utilisateur de naviguer dans les différent menu de l'application ou de lancer une acquisition.

C'est ce que je disais dans mon précédant post, c'est pas vraiment par nécessité que je cherche à faire une interruption, plus pour une propreté de codage.

Ma fonction de lecture des bouton n'est pas bloquante, je me suis mal exprimé. Ce qui est bloquant, c'est que j'actualise mon écran LCD en même temps que je lis mes boutons, mais pour éviter de voir l'écran clignoter à cause du rafraîchissement, j'ai un petit delay de 150 ms ce qui fait que la lecture n'est pas totalement fluide. Mon idée était d'utiliser une interruption pour donner la priorité à la lecture des boutons quand il le faut.

Ce n’est pas une bonne idée - vous essayez de contourner un “mauvais design” (pas de jugement de valeur) en utilisant un marteau pour écraser une mouche. Ce que vous Devez faire c’est virer le delay(), pas utiliser des interruptions. Pour ne pas que votre écran clignote il suffit de ne rien envoyer si l’affichage n’a pas changé. Déclarez une variable booléenne que vous mettez à vrai quand le contenu de l’écran change et préfacez votre appel à la mise à jour de l’écran pas un « si besoin de mise à jour alors .... » comme ça plus de clignotement

L’interruption est aussi une mauvaise idée car elle se doit d’être courte et ne pas piloter l’affichage donc tout ce que vous ferez dans l'ISR c’est noter que le bouton a été appuyé mais vous ne pourrez pas traiter l’info tant que vous n’êtes pas sorti du delay et revenu au début de votre loop() sans doute

OK j'ai ma réponse

Merci pour votre aide et bonne continuation

Bonjour,

J-M-L:
Ce n’est pas une bonne idée - vous essayez de contourner un “mauvais design” (pas de jugement de valeur) en utilisant un marteau pour écraser une mouche. …

C’est normal ;
“Lorsqu’on a un marteau en main, on considère tous les problèmes comme des clous”