Salve,
E' da qualche giorno che mi scontro con un problema che non riesco a risolvere , molto probabilmente per la mia insufficiente conoscenza degli interrupt di Arduino.
Ho scritto un Sw abbastanza complesso che gestisce un display LCD ed un encoder digitale.
A seconda che commenti o no l'istruzione
#define _Serial_Deb
il programma funziona o no. In pratica se cerco di usare la seriale per analizzare il flusso del programma si blocca. Quando escludo la seriale dalla compilazione tutto funziona perfettamente.
Che in arduino Nano che uso ci sia incompatibilità tra Timer1 e la seriale ?
Allego il main come file perchè è abbastanza lungo.
Spero che riusciate a spiegarmi il perchè di questo comportamentoe come aggirare il problema..
grazie per l'aiuto......
Giulio
In realtà sono stato un pò sbrigativo.
Dopo aver caricato il SW con la seriale abilitata sul serial monitor ho questo risultato:
13:50:49.630 -> ho inizializzato gli oggetti
13:50:49.675 -> Ram libera = 1358
13:51:10.657 -> >> sono in intro <<
13:53:51.423 -> >> sono in setting_up <<
Se uno vede il main ci si rende conto che il programma è correttamente in esecuzione e l'ultima riga parrebbe dimostrare che anche la lettura dell'encoder avviene correttamente ( per entrare in setting up bisogna cliccare l'encoder dalla perima riga del menù principale ) l'unica cosa che non va è la visualizzazione come se cpa2Lcd non fosse instanziato correttamente ( senza la seriale viaggia tutto ok ) cpa2Lcd viene passato alla classe mymenu per i metodi di visualizzazione
grazie
Risolto , era una incompatibilità con la libreria liquidcrystal installata nel mio IDE 2.1.1.
Installano dal library manager l'ultima versione Liquidcrystal da Arduino Adafruit 1.0.7 tutto funziona regolarmente anche con la seriale abilitata.
Grazie per avermi fatto riflettere sulla causa vera del malfunzionamento.
In realtà mi sono reso conto che anche l'ultima vesrione di Adafruit_LiquidCrystal versione 2.0.2 è abbastanza critica. Va abbastanza bene ma ogni tanto si blocca soprattutto quando si eseguono molti Serial.Print. Che sia il fatto che nessuna library liquid cristal che conosco implementa l'utilizzo di R/W e tutte lo pongono a ground ?
La cosa strana è che non c'è incompatibilità tra l'uso della seriale e il display LCD qualunque essa sia la libreria.
Qualunque libreria per hd44780 di base operano alla stessa maniera e nessuna spegne gli interrupt globali.
Mentre print li spegne gli interrupt globali per un brevissimo periodo.
Con la Adafruit_LiquidCrystal ci sono meno problemi che con la LiquidCrystal originale di arduino. In ogni caso devono aver modificato qualcosa perchè con le versioni precedenti non funzionava mai.
Ho provato ad aumentare la velocità di trasmissione del monitor seriale a 57600 baud e pare che le cose migliorino . Faro' delle prove di stress per vedere se era il buffer che si riempiva a 9600.
Avevi proprio ragione, ho fatto delle prove ed era una questione di saturazione del buffer. Io pensavo che il problema della saturazione del buffer fosse solo un problema di ricezione, evidentemente non è così.
Grazie