Go Down

Topic: [RESOLU] crash de XPT2046_Touchscreen avec esp8266 sous interruption  (Read 187 times) previous topic - next topic

bisra

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:
Code: [Select]
#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?

al1fch

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


bisra

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);


al1fch

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)

al1fch

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)

Code: [Select]

#if def ESP32
void IRAM ATTR isrpin (void)

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

bisra

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).
Code: [Select]

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!

lesept

Tu as peut-être une ancienne version de la bibliothèque ou du core ESP8266 dans l'IDE? Tente des mises à jour
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

al1fch

Tester ce code (interruption sur D5 = GPIO14 , carte Wemos D1 Mini)
Code: [Select]
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)

bisra

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

al1fch

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

bisra


al1fch

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

bisra

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

Go Up