avrei bisogno di aiuto o chiarimenti sull'uso degli interrupt nel mio caso; sono giorni che ci sto sbattendo la testa senza venirne fuori;
il problema è questo; ho 2 arduino ( Arduino DuemilaNove e Mega 2560 ) in collegamento Master e Slave;
il primo il Duemilanove manda al Mega un valore int a blocchi di 4 bit ogni 20micro secondi e segnala al Mega che i bit sono caricati tramite un altro PIN che fa scattare;
l'interrupt sullo Slave ossia il Mega2560;
nella routine dello Slave recupero i 4 bit sul registro di porta PINA e dopo 4 interrupt ho la WORD ricostruita;
questa WORD la metto poi in un buffer circolare e sarà poi scritta dalla funzione di loop arduino appena ne avrà la possibilità:
funzione di interrupt:
void ISR_Nibble()
{
//questo shift è necessario per dare il peso giusto ai bit che arrivano
value+=((PINA >> 4)<<state);
if((state+=4)==16) //se state=16 cioè siamo all’ultimo blocco di 4 bit la WORD è ricostruita e viene scritta nel Buffer circolare
{
raw_data[(writeIdx++) % BLOCK_BUFFER]=value; //incrementa indice di scrittura e scrive valore su buffer circolare
value=state=0;
}
}
funzione loop:
void loop()
{
if(writeIdx>readIdx) //se l'indice di scrittura è maggiore di quello di scrittura si può scrivere il dato su file
{
readIdx++;
sprintf(buffer,"%ld %ld", readIdx, raw_data[ readIdx % BLOCK_BUFFER ]);
client.println(buffer);
}
}
il problema che ho è che le chiamate alla funzione di interrupt sembra che si accavallino in quanto nel file che esce leggo:
1 1
2 2
3 3
4 4
5 5
6 6
7 10
8 11
9 12
10 100 !! salto enorme
11 30 // qui ritorna a decrescere !! come è possibile? interrupt che si accavallano?
Ciao grazie per la risposta!
ho visto con l oscilloscopio che la routine di servizio impiega
circa 50 microsecondi ma sta ancora nei tempi stabiliti;
il collo di bottiglia e' nel loop dove scrivo su rete; la scrittura
impiega 1.5 ms ossia 4kb al sec; come posso fare per ovviare?
il dac deve acquisire per 1 ora e non so come scaricare questi dati.
scusa il ritardo! ti ringrazio per il suggerimento e soprattutto per il codice che mi hai postato, ma 32Kb non sono sufficienti
per acquisire 1 ora di seguito; una volta saturata la memoria avrei comunque il problema
di come scaricarla prima che arrivino nuovi dati;