salve a tutti.
C'è una cosa che non riesco a spiegarmi.
In un mio progetto avevo dei malfunzionamenti random, ogni tanto, subito dopo il loader il sistema andava in crash.
A forza di semplificazioni/eliminazione parti di codice, ho scoperto che:
- se nel progetto includo la libreria Adafruit_SH1106G
- ci sono due for ( ; ; ), uno per valorizzare gli elementi e l'altro per visualizzarne il contenuto
- se si superano i 31 come elementi nel vettore
- il sistema si blocca.
Senza la libreria Adafruit_SH1106G va sempre bene, ho provato fino a 200 elementi.
Un altro modo per farlo funzionare è quello di fare un unico for( ; ; ) per valorizzare e visualizzare.
Uso un Arduino UNO R3, ho provato con IDE 1.8 ed anche 2.0, stessi risultati.
Allego il progetto ridotto ai minimi termini:
//#define __PRINT oled.print
#define __PRINT Serial.println
// #define __PRINT ;
#define __OLED
//----per display OLED SH1106/SSD1306------------------------------------------------
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#define i2c_Address 0x3c
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#ifdef __OLED
Adafruit_SH1106G oled = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#endif
//----fine display OLED SH1106/SSD1306--------------------------------------------------
#define MAX_BLK 150 // ???????????????????????????????
#define N_PAR 8
unsigned char sBlocco_AUT[MAX_BLK][N_PAR] = {0};
/////////////////////////////////////////////////////////////////////////////////////
//
/////////////////////////////////////////////////////////////////////////////////////
void setup()
{
char sApp[20];
unsigned int i;
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
InitOLED();
for (i=0; i<(MAX_BLK); i++)
{
sBlocco_AUT[i][0] = i; // ????????????
}
for (i=0; i<(MAX_BLK); i++)
{
// sBlocco_AUT[i][0] = i; // ????????????
sprintf(sApp, "%06d ", sBlocco_AUT[i][0]);
__PRINT(sApp);
}
#ifdef __OLED
oled.display();
#endif
}
///////////////////////////////////////////////////////////////////
//
///////////////////////////////////////////////////////////////////
void loop()
{
delay(100);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
///////////////////////////////////////////////////////////////////
// inizializza display OLED SH1106
///////////////////////////////////////////////////////////////////
void InitOLED(void)
{
#ifdef __OLED
delay(250); // wait for the OLED to power up
if(!oled.begin(i2c_Address, true))
{
Serial.print(F("SH1106 allocation failed") );
for(;;)
;
}
oled.display();
delay(2000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setCursor(0, 10);
oled.setTextColor(SH110X_WHITE);
oled.display();
#endif
}
Nel codice ho evidenziato con // ?????? i punti "critici".
Se qualcuno ha tempo/voglia di verificare ....
Ho notato anche che il compilatore si comporta in modo differente a seconda che nel codice ci siano uno o due for( ; ; ):
- **con unico for()** lo spazio occupato dalle variabili globali è sempre di **600bytes** anche se è presente un solo elemento (?).
- **con due for()** lo spazio occupato varia a seconda del numero degli elementi presenti nel vettore (ovviamente).
grazie