Incompatibiltà Timer1 e la seriale ?

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

Master_con_PROGMEM.ino (12.5 KB)

Non mi risulta. The microprocessor of the Arduino Uno/Nano (ATmega328P) has 3 timers:

  • timer0 (8 bits) counts from 0 to 256 and controls the PWM of pins 5 and 6. It is also used by the delay(), millis() and micros() functions.
  • timer1 (16 bits) counts from 0 to 65535 and is used for the PWM control of pins 9 and 10. It is also used by the Servo.h library
  • timer2 (8 bits) which is used by the Tone() function and the PWM generation on pins 3 and 11.

Spiega meglio cosa succede. Qualche cosa su seriale vedi almeno dal setup oppure non funziona nulla ?

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.

Ciao.

Se il buffer di trasmissione si satura, la print su seriale diventa bloccante e ferma tutto il resto... potrebbe essere questo?

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

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.