[RESOLU] crash de XPT2046_Touchscreen avec esp8266 sous interruption

Bonjour à tous,
J'utilise un module générique à base de esp8266.
Lorsque j'utilise la classe XPT2046_Touchscreen en mode pooling: XPT2046_Touchscreen ts(CS_PIN);
pas de pb.

Mais en mode interruption: XPT2046_Touchscreen ts(CS_PIN, TIRQ_PIN);
ça compile bien mais l'exec boucle sur erreur.

Voici le source d'exemple:

#include <XPT2046_Touchscreen.h>
#include <SPI.h>

#define CS_PIN  4
// MOSI=11, MISO=12, SCK=13

// The TIRQ interrupt signal must be used for this example.
#define TIRQ_PIN  5


XPT2046_Touchscreen ts(CS_PIN/*, TIRQ_PIN*/);  // Param 2 - Touch IRQ Pin - interrupt enabled polling

void setup() {
  Serial.begin(115200);
  ts.begin();
  ts.setRotation(1);
  while (!Serial && (millis() <= 1000));
}

void loop() {

  // tirqTouched() is much faster than touched().  For projects where other SPI chips
  // or other time sensitive tasks are added to loop(), using tirqTouched() can greatly
  // reduce the delay added to loop() when the screen has not been touched.
  
  if (ts.tirqTouched()) {
    if (ts.touched()) {
      TS_Point p = ts.getPoint();
      Serial.print("Pressure = ");
      Serial.print(p.z);
      Serial.print(", x = ");
      Serial.print(p.x);
      Serial.print(", y = ");
      Serial.print(p.y);
      delay(30);
      Serial.println();
    }
  }
  
}

Message d'erreur:


rst cause:2, boot mode:(3,6)
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vac02aff5
~ld
ISR not in IRAM!


Si quelqu'un à une idée?

Bonjour

A l'excécution le système se plaint de ne pas trouver la routine d'interruption (ISR) au bon endroit (IRAM)

Voir ici comment gérer les interruptions externes avec un ESP8266

D'après ce que je comprends, la routine de service d'interruption isr est partie intégrant et gérée par la classe XPT2046 sinon à quoi servirait de lui transmettre en paramètre le n° de pin de l'interruption externe dans
XPT2046_Touchscreen ts(CS_PIN, TIRQ_PIN);

la librairie utilisée est-elle compatible ESP8266 en mode interruption ?
sait elle mettre en place une interruption externe dans les cas des ESP8266 ?
(je ne connais pas la ou les librairies gérant ce composant pour écran tactile)

Bonjour

En parcourant rapidement la librairie XPT2046 de Paul Stroffregen on voit que pour l'ESP32 la routine d'interruption parait positionnée au bon endroit (IRAM) (cf message d'erreur)

#if def ESP32
void IRAM ATTR isrpin (void)

Il manque peut être l'équivalent pour ESP8266 ?

En fait, j'ai pris un module esp86 neuf et j'ai testé un bout de programme tout simple gérant une interruption externe sur le esp8266 et j'ai exactement le même message d'erreur (ISR not in IRAM).

const byte interruptPin = 5;
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;
 
void setup() {
 
  Serial.begin(115200);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
 
}
 
void handleInterrupt() {
  interruptCounter++;
}
 
void loop() {
 
  if(interruptCounter>0){
 
      interruptCounter--;
      numberOfInterrupts++;
 
      Serial.print("An interrupt has occurred. Total: ");
      Serial.println(numberOfInterrupts);
  }
 
}

C'est à désespérer!

Tu as peut-être une ancienne version de la bibliothèque ou du core ESP8266 dans l'IDE? Tente des mises à jour

Tester ce code (interruption sur D5 = GPIO14 , carte Wemos D1 Mini)

const byte interruptPin = D5;
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;

void ICACHE_RAM_ATTR  handleInterrupt() {
  interruptCounter++;
}

void setup() {
  Serial.begin(115200);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}

void loop() {
  if (interruptCounter > 0) {
    interruptCounter--;
    numberOfInterrupts++;
    Serial.print("An interrupt has occurred. Total: ");
    Serial.println(numberOfInterrupts);
  }
}

plus de "ISR not in IRAM!"....... L'attribut ICACHE_RAM_ATTR permet de positionner la routine de service d'interruption au bon endroit (en IRAM)
(j'ai pris modèle sur le code de la librairie SoftSerial pour ESP8266 qui fonctionne ... et utilise des interruptions externes)
Il semble donc que la présence de cet attribut soit maintenant nécessaire (core 2.52 dans mon cas)

Donc, j'ai modifié la bibliothèque XPT2046 de Paul Stroffregen et tout roule!

Parfait !!
peux tu reprendre le titre du fil en ajoutant [résolu] ?

Où se trouve le bouton résolu, je ne vois pas..

pas de bouton résolu, reprendre le message initial et écrire [RESOLU] en début du titre.

Merci beaucoup al1fch. Je vois que tu es redoutablement perspicace. Bravo!