Initializing 2nd OLED display gives EXCVADDR:0x00000000

pwn-gh
Posts: 2
Joined: Tue Mar 08, 2022 6:09 am

Initializing 2nd OLED display gives EXCVADDR:0x00000000

Postby pwn-gh » Sun Mar 13, 2022 7:38 am

After I added another OLED display, the Initialize routine seems to cause crashes, but I don't know how to fix it.
Screenshot (12).png
Debugger screenshot
Screenshot (12).png (201.59 KiB) Viewed 1789 times
Code is below

Guru Meditation Error: Core 1 panic'ed (StoreProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x4000c46c PS : 0x00060730 A0 : 0x800d226c A1 : 0x3ffb1f30
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000400 A5 : 0x00000000
A6 : 0x000000ff A7 : 0x00000040 A8 : 0x800d3ce0 A9 : 0x3ffb1f00
A10 : 0x00000002 A11 : 0x3f4001dc A12 : 0x00000000 A13 : 0x00000064
A14 : 0x00000019 A15 : 0x60013000 SAR : 0x00000017 EXCCAUSE: 0x0000001d
EXCVADDR: 0x00000000 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0x0000003f

ELF file SHA256: 0000000000000000

Backtrace: 0x4000c46c:0x3ffb1f30 0x400d2269:0x3ffb1f40 0x400d1100:0x3ffb1f60 0x400d1295:0x3ffb1f80 0x400d5842:0x3ffb1fb0 0x40086a75:0x3ffb1fd0

Code: Untitled.cpp Select all

#include <Arduino.h>

int bootDelay = 1000;

// SSD1306:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Screen width, Screen height, Protocol, Oled reset pin
Adafruit_SSD1306 display(128, 64, &Wire, -1);
bool SSD1306Initialized = false;
void SSD1306Initialize();
Adafruit_SSD1306 display2(128, 64, &Wire, -1);
bool SSD1306_2Initialized = false;
void SSD1306_2Initialize();

// BNO055
// #include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
// ID, Address
Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);
bool BNO055Initialized = false;

sensors_event_t bnoEulerData , bnoGyrData , bnoLinAccData, bnoMagData, bnoAccData, bnoGravData;
int8_t bnoTempData;
uint8_t bnoSysStatus, bnoGyrStatus, bnoAccStatus, bnoMagStatus = 0; // Calibration data
void BNO055Initialize();
void BNO055GetData();
void BNO055Display();

// BME280
#include <Wire.h>
// #include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
unsigned long delayTime;
bool BME280Initialized = false;
// m hPa % m
float bmeTempData , bmePresData , bmeHumiData , bmeAltiData;
void BME280Initialize();
void BME280GetData();

void setup() {
Serial.begin(115200);
Serial2.begin(115200);
//Initialize SSD1306 OLED Screen
SSD1306Initialize();
SSD1306_2Initialize();
//Initiaize BNO055 Sensor
BNO055Initialize();
//Initiaize BME280 Sensor
BME280Initialize();

delay(bootDelay);
display.clearDisplay();
display.display();
}

void loop() {
uint32_t startTime = millis();

display.clearDisplay();
// Get BNO055 Data
BNO055GetData();
// Get BME280 Data
BME280GetData();

uint32_t measurementTime = millis();
measurementTime = measurementTime - startTime;
startTime = millis();

BNO055Display();

uint32_t displayTime = millis();
displayTime = displayTime - startTime;
display.setCursor(0, 56);
display.printf("time:MS:%i,DISP:%i", measurementTime, displayTime);
Serial.printf("Measurement Time: %i, Display Time: %i\n", measurementTime, displayTime);
Serial.println();
}

void SSD1306Initialize() {
SSD1306Initialized = display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // True if successful
Serial.println(F("SSD1306: Initialization: Begin"));
if (!SSD1306Initialized) {
Serial.println(F("SSD1306: Initialization: Failed "));
} else {
Serial.println(F("SSD1306: Initialization: Success"));
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.cp437(true);
display.setTextWrap(false);
display.print(F("CUHAR FC(Debug)"));
display.display();
}
Serial.println(F("SSD1306: Initialization: Done"));
}

void SSD1306_2Initialize() {
SSD1306_2Initialized = display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
Serial.println(F("SSD1306_2: Initialization: Begin"));
if (!SSD1306_2Initialized) {
Serial.println(F("SSD1306: Initialization: Failed "));
} else {
Serial.println(F("SSD1306_2: Initialization: Success"));
display2.clearDisplay();
display2.setTextSize(1);
display2.setTextColor(SSD1306_WHITE);
display2.setCursor(0, 0);
display2.cp437(true);
display2.setTextWrap(false);
display2.print(F("CUHAR FC(Debug),DISP2"));
display2.display();
}
Serial.println(F("SSD1306_2: Initialization: Done"));
}

void BNO055Initialize() {
Serial.println(F("BNO055: Initialization: Begin"));
BNO055Initialized = bno.begin();
display.setCursor(0, 8);
//display2.setCursor(0, 8);
if (!BNO055Initialized) {
Serial.println(F("BNO055: Initialization: Failed"));
display.print(F("BNO055 ... Error"));
//display2.print(F("BNO055 ... Error"));
} else {
Serial.println(F("BNO055: Initialization: Success"));
display.print(F("BNO055 ... Init"));
//display2.print(F("BNO055 ... Init"));
}
bno.setExtCrystalUse(true);
Serial.println(F("BNO055: Initialization: SSD1306 Status Set"));
display.display();
//display2.display();
Serial.println(F("BNO055: Initialization: SSD1306 Display()"));
}

void BME280Initialize() {
Serial.println(F("BME280: Initialization: Begin"));
BME280Initialized = bme.begin(0x77, &Wire);
display.setCursor(0, 16);
display2.setCursor(0, 16);
if (!BME280Initialized) {
Serial.println(F("BME280: Initialization: Failed."));
display.print(F("BNO055 ... Error"));
display2.print(F("BNO055 ... Error"));
} else {
Serial.println(F("BME280: Initialization: Success"));
display.print(F("BME280 ... Init"));
display2.print(F("BME280 ... Init"));
}
bme.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X16, // Temperature
Adafruit_BME280::SAMPLING_X16, // Pressure
Adafruit_BME280::SAMPLING_X16, // Humidity
Adafruit_BME280::FILTER_X16 ); // IIR filter coefficient
Serial.println(F("BME280: Initialization: SSD1306 Status Set"));
display.display();
display2.display();
Serial.println(F("BME280: Initialization: SSD1306 Display()"));
}

void BNO055GetData() {
bno.getEvent(&bnoEulerData, Adafruit_BNO055::VECTOR_EULER); // Euler angle
bno.getEvent(&bnoGyrData, Adafruit_BNO055::VECTOR_GYROSCOPE); // Rad/s
bno.getEvent(&bnoLinAccData, Adafruit_BNO055::VECTOR_LINEARACCEL); // Linear Acceleration
bno.getEvent(&bnoMagData, Adafruit_BNO055::VECTOR_MAGNETOMETER); // Magnetometer
bno.getEvent(&bnoAccData, Adafruit_BNO055::VECTOR_ACCELEROMETER); // Accelerometer
bno.getEvent(&bnoGravData, Adafruit_BNO055::VECTOR_GRAVITY); // Gravity
bnoTempData = bno.getTemp(); // Sensor temperature
bno.getCalibration(&bnoSysStatus, &bnoGyrStatus, &bnoAccStatus, &bnoMagStatus);// Calibration status
}

void BNO055Display(){
display.setCursor(0, 0);
display.printf("CL:S:%i, G:%i, A:%i, M:%i", bnoSysStatus, bnoGyrStatus, bnoAccStatus, bnoMagStatus);
Serial.printf("BNO055: Data: Calibration Status: System: %i, Gyro:%i, Accel:%i, Mag:%i\n", bnoSysStatus, bnoGyrStatus, bnoAccStatus, bnoMagStatus);
display.setCursor(0, 8);
display.printf("E:%.2f,%.2f,%.2f", bnoEulerData.orientation.x, bnoEulerData.orientation.y, bnoEulerData.orientation.z);
Serial.printf("BNO055: Data: Euler: %.2f,%.2f,%.2f\n", bnoEulerData.orientation.x, bnoEulerData.orientation.y, bnoEulerData.orientation.z);
display.setCursor(0, 16);
display.printf("G:%.2f,%.2f,%.2f", bnoGyrData.gyro.x, bnoGyrData.gyro.y, bnoGyrData.gyro.z);
Serial.printf("BNO055: Data: Gyro: %.2f,%.2f,%.2f\n", bnoGyrData.gyro.x, bnoGyrData.gyro.y, bnoGyrData.gyro.z);
display.setCursor(0, 24);
display.printf("L:%.2f,%.2f,%.2f\n", bnoLinAccData.acceleration.x, bnoLinAccData.acceleration.y, bnoLinAccData.acceleration.z);
Serial.printf("BNO055: Data: Linear Acceleration: %.2f,%.2f,%.2f", bnoLinAccData.acceleration.x, bnoLinAccData.acceleration.y, bnoLinAccData.acceleration.z);
display.setCursor(0, 32);
display.printf("M:%.2f,%.2f,%.2f\n", bnoMagData.magnetic.x, bnoMagData.magnetic.y, bnoMagData.magnetic.z);
Serial.printf("BNO055: Data: Magnetometer: %.2f,%.2f,%.2f", bnoMagData.magnetic.x, bnoMagData.magnetic.y, bnoMagData.magnetic.z);
display.setCursor(0, 40);
display.printf("A:%.2f,%.2f,%.2f\n", bnoAccData.acceleration.x, bnoAccData.acceleration.y, bnoAccData.acceleration.z);
Serial.printf("BNO055: Data: Accelerometer: %.2f,%.2f,%.2f", bnoAccData.acceleration.x, bnoAccData.acceleration.y, bnoAccData.acceleration.z);
display.setCursor(0, 48);
display.printf("G:%.2f,%.2f,%.2f\n", bnoGravData.acceleration.x, bnoGravData.acceleration.y, bnoGravData.acceleration.z);
Serial.printf("BNO055: Data: Gravity: %.2f,%.2f,%.2f", bnoGravData.acceleration.x, bnoGravData.acceleration.y, bnoGravData.acceleration.z);
Serial.println();
display.display();
}

void BME280GetData() {
bme.takeForcedMeasurement();
bmeTempData = bme.readTemperature();
bmePresData = bme.readPressure();
bmeHumiData = bme.readHumidity();
bmeAltiData = bme.readAltitude(SEALEVELPRESSURE_HPA);
}

Sprite
Espressif staff
Espressif staff
Posts: 10619
Joined: Thu Nov 26, 2015 4:08 am

Re: Initializing 2nd OLED display gives EXCVADDR:0x00000000

Postby Sprite » Mon Mar 14, 2022 1:01 am

Possibly an issue where the display library doesn't support two displays (at least in the way you use it). Can you decode that backtrace? That usually helps zoom in on the error.

Who is online

Users browsing this forum: Bing [Bot] and 5 guests