Bonjour j'avais l'habitude de faire tourner mon programme sur ESP32 (en utilisant platformio) et aujourd'hui j'ai uploadé mon programme sans faire exprès et impossible de le faire fonctionner. l'ESP32 reboote continuellement.
J'obitiens ce message d'erreur (j'ai ajouté dans le .ini monitor_filters = esp32_exception_decoder à la place de monitor_filters = send_on_enter).
j'obtiens dans le terminal un message que je ne sais pas du tout interpréter.
Merci pour votre aide.
Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1).
Core 1 register dump:
PC : 0x4008b072 PS : 0x00060735 A0 : 0x80089fea A1 : 0x3ffbf0ec
A2 : 0x3ffb8a00 A3 : 0x3ffb8890 A4 : 0x00000004 A5 : 0x00060723
A6 : 0x00060723 A7 : 0x00000001 A8 : 0x3ffb8890 A9 : 0x00000018
A10 : 0x3ffb8890 A11 : 0x00000018 A12 : 0x3ffc2b94 A13 : 0x00060723
A14 : 0x007bf308 A15 : 0x003fffff SAR : 0x0000000a EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x40086008 LEND : 0x40086013 LCOUNT : 0x00000000
Core 1 was running in ISR context:
EPC1 : 0x400dbebf EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x00000000
Backtrace: 0x4008b06f:0x3ffbf0ec |<-CORRUPTED
** #0 0x4008b06f:0x3ffbf0ec in vListInsert at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/freertos/list.c:183**
Core 0 register dump:
PC : 0x4008b207 PS : 0x00060035 A0 : 0x80089c13 A1 : 0x3ffbea2c
A2 : 0x3ffbf308 A3 : 0xb33fffff A4 : 0x0000abab A5 : 0x00060023
A6 : 0x00060021 A7 : 0x0000cdcd A8 : 0x0000abab A9 : 0xffffffff
A10 : 0x00000000 A11 : 0x00000000 A12 : 0x3ffc29a4 A13 : 0x00000007
A14 : 0x007bf308 A15 : 0x003fffff SAR : 0x0000001a EXCCAUSE: 0x00000006
EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000
Backtrace: 0x4008b204:0x3ffbea2c |<-CORRUPTED
** #0 0x4008b204:0x3ffbea2c in esp_ptr_external_ram at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/soc/include/soc/soc_memory_types.h:97**
** (inlined by) spinlock_acquire at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/esp_hw_support/include/soc/spinlock.h:99**
** (inlined by) xPortEnterCriticalTimeout at /Users/ficeto/Desktop/ESP32/ESP32S2/esp-idf-public/components/freertos/port/xtensa/port.c:288**
#include <Arduino.h>
#include "driver/ledc.h"
const int BUFFER_SIZE = 100;
char buf[BUFFER_SIZE];
static int trame[5];
// DEFINITION DE LA SORTIE PWM
#define DCC_PIN 22
#define PWM_PIN 23 // Sortie du signal DCC envoi courant
// ON DEFINIT LES PULSIONS PWM
const uint16_t DCC_BIT_1_FREQ =8621; // 116 microsecondes
const uint16_t DCC_BIT_0_FREQ = 5000; // 200 microsecondes
const int dcc_pin_channel = 0; // CANAL PWM 0
const int dcc_sig_resolution =1; // on est sur 1 bit de resolution 2^1 2 valeurs possibles
const int dcc_sig_duty=1; // on est sur 1 bit de resolution 1/2^1 50%
//initialisation de la frequence
uint32_t dcc_sig_freq=DCC_BIT_1_FREQ;
static uint32_t old_dcc_sig_freq;
static uint64_t v; // variable de 48 bits
static byte pointer;
; // nb de bits
static byte DccBit; // valeur du bit
static uint64_t DccBitShift=0b100000000000000000000000000000000000000000000000;//((uint64_t) -1 )>> ((uint64_t)0 - 47); // creation d un masque pou egrener les bits
// declaration des voids
void dcc_sig_isr(); // fonction d interruption
void setup_ledc(void); // setup du PWM duty 50% sur 1 de precision il y a 2 periodes : 116microsecondes et 200 microsecondes
//void SpeedAndDir();
static byte Speedy;
static byte dccSpeed;
static byte addr;
//structure du message
struct __attribute__((packed)) t_message { // total de 48 bits sur les 64
uint64_t stop1: 1; // 1 bit à 1
uint8_t cksum: 8; // 8 bits de verification
uint8_t start3: 1; // 1 bit à 0
uint8_t SpeedDir: 8; // 8 bits de direction et de vitesse
uint8_t start2: 1; // 1 bit à 0
uint8_t address: 8; // 8 bits d'adresse
uint8_t start1: 1; // 1 bit à 0
uint8_t debut3: 4; // 4 bits à 1
uint8_t debut2: 8; // 8 bits à 1
uint8_t debut1: 8; // 8 bits à 1
};
// on recompose une variable de 48 bits
void dumpMessageBits(t_message& message) {
memcpy(&v, &message, sizeof v);
}
// la fonction construit le message et l'envoie avec la fonction dumpmassage
void buildMessage(t_message& message, byte addr, byte Speedy) {
message.debut1 = 0b11111111;
message.debut2 =0b11111111;
message.debut3 =0b1111;
message.start1 = 0b0;
message.address = addr;
message.start2= 0b0;
message.SpeedDir = Speedy;
message.start3 = 0b0;
message.cksum = addr ^ Speedy;
message.stop1 = 0b1;
dumpMessageBits(message);
}
t_message unMessage;
void dcc_sig_isr() {
// Serial.print(pointer);
//static uint32_t old_dcc_sig_freq ; // fréquence précédente
//Serial.print(pointer);
DccBit=!!(v&DccBitShift); // la variable v fait 48 bits il faut égrener
//DccBitShift>>=1; //on dácale les bits sur la droite
if (DccBitShift) {
if (DccBit) {
dcc_sig_freq=DCC_BIT_1_FREQ; // si tu pointes 1 envoie 1
Serial.print(DccBit);
}else{
dcc_sig_freq=DCC_BIT_0_FREQ; // si tu pointes 0 envoie 0
Serial.print(DccBit);
}
if (dcc_sig_freq !=old_dcc_sig_freq) {
ledc_set_freq(LEDC_HIGH_SPEED_MODE, LEDC_TIMER_0,dcc_sig_freq);
dcc_sig_freq=old_dcc_sig_freq;
}
DccBitShift>>=1;
}else{
// pointer; // quand le pointeur vaut 0 on recommence
DccBitShift=0b100000000000000000000000000000000000000000000000;
Serial.println();
pointer=48;
}
pointer--;
// le pointeur perd un //on dácale les bits sur la droite
}
void setup_ledc() {
ledcSetup(dcc_pin_channel,dcc_sig_freq,dcc_sig_resolution);
ledcAttachPin(DCC_PIN,dcc_pin_channel);
ledcWrite(dcc_pin_channel,dcc_sig_duty);
attachInterrupt(DCC_PIN,dcc_sig_isr,RISING);
}
void setup() {
Serial.begin(460800);
pinMode(PWM_PIN,OUTPUT);
digitalWrite(PWM_PIN,HIGH);
setup_ledc();
}
void SpeedAndDir(uint16_t addrLoco, byte Cran, byte SpeedorPort, bool DirectorActivate, bool OpenorClose) // vecteur de direction et de vitesse
{
byte ext;
byte extAcc;
//selectcran =6 =emerency
//selectcran 7 = smooth
uint8_t addrAcc;
switch(Cran) {
case 0: ////DCC_PACKET_TYPE_STEP_14
dccSpeed=map(SpeedorPort,0,14,0,14);
if (dccSpeed) dccSpeed++; // pas de cran 1
Speedy=(DirectorActivate?0x60:0x40)|dccSpeed;
addr=addrLoco;
break;
case 1: ///DCC_PACKET_TYPE_STEP_28
dccSpeed=map(SpeedorPort,0,128,0,28);
if (dccSpeed) dccSpeed+=3; // pas de cran 1,2,3
ext=(((dccSpeed&0x01)<<5)|dccSpeed)>>1; ///
Speedy=(DirectorActivate?0x60:0x40)|ext;
addr=addrLoco;
break;
case 2: //DCC_PACKET_TYPE_STEP_128;
dccSpeed=map(SpeedorPort,0,128,0,126);
if (dccSpeed) dccSpeed++; // pas de cran 1
Speedy=(DirectorActivate?0x60:0x40)|dccSpeed;
addr=addrLoco;
break;
case 4: //ARRET CENRALS
digitalWrite(PWM_PIN,LOW);
addr=addrLoco;
break;
case 5: //CENTRAL MARCHE
digitalWrite(PWM_PIN,HIGH);
break;
case 6: //IDLE;
Speedy=0b00000000;
break;
case 7:
Speedy=0b01000000;
addr=addrLoco;
break;
case 8:
Speedy=0b01000001;
addr=addrLoco;
break;
case 9://ARRET FONCTION
Speedy=0b10000000;
addr=addrLoco;
break;
case 10: // fonction FL
Speedy=0b10010000;
addr=addrLoco;
break;
case 11: // fonction F4
Speedy=0b10001000;
addr=addrLoco;
break;
case 12: // fonction F3
Speedy=0b10000100;
addr=addrLoco;
break;
case 13: // fonction F2
Speedy=0b10000010;
addr=addrLoco;
break;
case 14: // fonction F1
Speedy=0b10000001;
addr=addrLoco;
break;
case 100:
addrAcc=(0b10<<6)|(addrLoco&0b00111111); // adresse de l accessoire on prend les 6 poids faibles et on rajoute 01
extAcc = ((~((0b0000000111000000&addrLoco)>>6))|(1<<3))<<4;
// on isole les 3 poids forts qu on complemente. on decale tout a gauche de 1bit pour faire 1 R8 R7 R6
if (SpeedorPort==1) { // PORT = 0 0 = 1
extAcc=extAcc& ~(1<<2);
extAcc&=~(1<<1);
} else if (SpeedorPort==2) { // PORT 0 1 = 2
extAcc=extAcc& ~(1<<2);
extAcc|= (1<<1);
} else if (SpeedorPort==3) {// PORT 1 0 = 3
extAcc=extAcc|(1<<2);
extAcc&=~(1<<1);
} else if (SpeedorPort==4) { // PORT 1 1 = 4
extAcc=extAcc|(1<<2);
extAcc|= (1<<1);
}
addr=addrAcc;
extAcc=(DirectorActivate)?extAcc|=(1<<3):extAcc&=~(1<<3);
extAcc=(OpenorClose)?extAcc|=(1<<0):extAcc&=~(1<<0);
Speedy=extAcc;
break;
}
}
// la fonction bujilmessage est dans le loop
void loop() {
//if (Serial.available() )
//msg = Serial.parseInt(); // Lit le message reçu et l'affiche sur le moniteur
//(msg)?digitalWrite(PWM_PIN,HIGH):digitalWrite(PWM_PIN,LOW);
// check if data is available
// check if data is available
if (Serial.available() > 0) {
// read the incoming bytes:
int rlen = Serial.readBytesUntil('\n', buf, BUFFER_SIZE);
buf[rlen]=0;
// prints the received data
//Serial.print("I received: ");
sscanf(buf, "%d %d %d %d %d", &trame[0], &trame[1], &trame[2], &trame[3], &trame[4]);
// for (int i = 0; i < 4; i++) {
// Serial.print(trame[i]);
// Serial.print(',');
//}
// Serial.println();
}
SpeedAndDir(trame[0],trame[1],trame[2],trame[3],trame[4]);
//
delay(100);
//SpeedAndDir(3,0,12,1);
buildMessage(unMessage,addr, Speedy);
}