Ciao a tutti, ho un piccolo problema su un progetto che sto realizzando, la scheda è realizzata con un Atmega 2560 standalone e sul bus SPI ho connesse una SD card gestita con la libreria Sdfat e due ADC mpc3208 gestite con la libreria standard MPC3208.h.
Il porblema riscontrato è che il codice in maniera casuale , a volte dopo pochi minuti, a volte dopo ore, si rallenta durante la lettura degli ADC come se non ricevesse risposta dai moduli MPC3208 e aspettasse un timeout , questo "lag" dura circa 2000 ms e una volta che si presenta permane fino al reset della scheda.
La mia domanda è se nella libreria SPI o nella libreria MPC3208.h c'è una qualche funzione che gestisce un timeout e se nel caso questo tempo si possa ridurre.
Il passaggio critico del codice, dove saltuarimente avviene il lag è questo:
ADC1_ch(0) = adc1.analogRead(0);
normalmente questa lettura impiega circa 5 ms , e funziona perfettamente su tutti gli 8 canali dei due ADC , ma diciamo "random"... si rallenta fino a 2000 ms circa.
La libreria è abbastanza semplice e la parte di lettura del dato è in pratica
uint16_t MCP3208::analogRead(uint8_t pin) {
uint8_t addr = 0b01100000 | ((pin & 0b111) << 2);
digitalWrite(_cs, LOW);
(void) spiTransfer(addr);
uint8_t b1 = spiTransfer(0);
uint8_t b2 = spiTransfer(0);
digitalWrite(_cs, HIGH);
return (b1 << 4) | (b2 >> 4);
}
uint8_t MCP3208::spiTransfer(uint8_t i) {
uint8_t d;
#ifdef __PIC32MX__
d = _spi->transfer(i);
#else
d = SPI.transfer(i);
#endif
return d;
}
Esiste un timeout sulla funzione SPI.transfer che , nel caso l'ADC non risponda, o il dati sia per qualche ragione corrotto che possa rallentare il loop ? Suggerimenti per evitare questa condizione ?
Grazie !