ESP32 multiprocessamento com dois canais de comunicação I2C

Olá,


Estou realizando um projeto no qual utilizo Esp32, sendo os dois Processadores separadamente e dois canais de I2C (TwoWire), onde em cada processador utilizo um canal I2C.

O Processador Zero utilizo para rotinas de leitura de sensores através do canal I2C (INA219, BME680, ADS1115, DS1302), armazenando os valores em variáveis globais.

O Processador Um utilizo para as demais rotinas e controle do LCD e teclado ambos I2C e demonstração dos valores das variáveis globais.

Na compilação tudo da certo, porem depois de ligado o Esp32 ele funciona por alguns segundos e depois trava.

O I2C estou utilizando da seguinte forma:

TwoWire I2C_1 = TwoWire(0);
TwoWire I2C_2 = TwoWire(1);

I2C_1.begin(21, 22, 100000);
I2C_2.begin(15, 4, 100000);

Os Processadores estou criando da seguinte forma:

xTaskCreatePinnedToCore(CoreZero, "CoreZero", 16392, NULL, 5, NULL, 0);
delay(500);

xTaskCreatePinnedToCore(CoreOne, "CoreOne", 16392, NULL, 5, NULL, 1);
delay(500);

void loop() {

vTaskDelete(NULL);

}

Observação:

Os processadores sendo usados um um sem rotina no outro funciona perfeitamente, porem os dois ligado juntos não funciona.

Preciso de uma ajuda para tentar esclarecer o problema e para quem me ajudar a esclarecer darei um pagamento.

Obrigado.

Exibições: 127

Responder esta

Respostas a este tópico

Olá.

   Veja no monitor serial o que ele apresenta no travamento.

   Suspeito de problemas relacionados a Watchdog. 

   Poste aqui a mensagem de erro que vem no monitor serial na travada (melhor se anexo como .txt).

Segue anexos.

Uma foto mostra o momento que esta em funcionamento e depois de alguns segundos apaga e trava.

Conto com vosso apoio.

Zap 35-99891-7692

Anexos

Exatamente o que suspeitava.

Veja na primeira linha: "Interrupt wdt timeout on CPU0"

Isso é o Whatchdog timer.

Se vc não reinicializar ele de tempos em tempos ele entende que seu programa travou e reinicia.

Vale ver a doc:

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-ref...

Leia também:

https://www.embarcados.com.br/esp32-watchdog-timer/

Edu eu uso a rotina de WDT porem ele não era para resetar, pois existem varias rotinas para ele executar e eu ate mensurei o tempo que levava para executar todas as rotinas juntas, dando um tempo de aproximadamente 500 ms.

void CoreZero( void * pvParameters ){

  esp_task_wdt_init(4, true);
  esp_task_wdt_add(NULL);

  while(true) {


    Relogio();
    INA();
    LeituraADS();
    IAQ();

    esp_task_wdt_reset();

  }
}

O que eu posso fazer para resolver esse problema?

RSS

© 2022   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço