ping HCSR04 - avr-gcc

Ciao ,

Ogni tanto salto su avr-gcc sperando di capire qualcosa del "dietro le quinte".
Ho scritto questo codice , eccetto che l'utoa per studiare l'icp dell'avr.
il codice sembra funzionare perchè mi ritorna la misura in modo proporzionale rispetto all'ostacolo che incontra.
questo icp misura il tempo che intercorre tra un fronte di salita ed uno di discesa di ogni echo ricevuto dal sensore. Il tempo viene misurato contanto i passi del timer1 opportunamente prescalato.
Il valore del timer1 viene assegnato ad una array per calcolare la media ogni circa 60ms.
Il 60 ms è la pausa tra ogni richiesta di ping ( c'e scritto sul manuale), quindi quando l'echo è off ( 0 Volts).
Il mio dubbio è che non sincronizzo perfettamente l'assegnazione del valore del timer1 ( TCNT1), questo perchè tale assegnazione si verifica nel main.
La tentazione è di inserire l'array nell'interrupt dell'ICP e poi fare la media nel main...Ma non so se è una cosa lecita
Vorrei anche non rendere bloccante il calcolo della media perchè infatti è all'interno di una while, ma per rendere questo possibile devo sincronizzare perfettamente come detto sopra.

+info
Sul fronte di salita spengo il timer0 (zero) mentre su quello di discesa azzero tcnt0(timer0) e accendo il timer0 per il nuovo conteggio (60ms )
ci tengo a precisarlo perchè così facendo ho sincronizzato i due interrupt senza rischiare ( annidamenti ?)

grazie a chi ha tempo/voglia di rispondere.
allego codice commentato
Edit:
Allego link pasbin

Ciao,
non capisco bene qual è l'intento e la questione..
in generale, per l'HCSR04 non ti conviene usare la libreria newPing (Arduino Playground - NewPing Library) ? Molto semplice e funziona bene..

Ciao Ulixxes,

Non voglio reinventare la ruota . Lo scopo è solo didattico ;:slight_smile:
Ho postato il codice per chiedere un parere su come ho gestito l'interrupt e su come gestire il calcolo della media prendendo come esempio il sensore hcsr04
Molti utenti sono persone con esperienza e quindi volevo "approfittare", anche perchè non conosco altri forum italiani attivi che parlano di micro avr.

La libreria newping l'ho giù utilizzata è funziona bene.
Grazie

Ah, ok: capito.
Raramente vedo usare i registri dell'avr direttamente: non lo faccio spesso perchè si guadagna in efficienza ma purtroppo si perde un po la compatibilità con librerie arduino. Per quanto ne so, è sempre un po' un problema sincronizzare interrupt con task asincrone. Se dovessi fare una cosa del genere metterei il buffer nell'interrupt, ma lo farei circolare:

// in interrupt

// metti l'ultimo valore letto nel buffer
value[i] = newvalue;

// incrementi l'indice
i = (i + 1) % MAX_BUFFER;

e nel main periodicamente ricalcolare la media su tutti i campioni senza preoccuparsi di essere sincrono: in ogni caso, essendo il buffer circolare avresti dentro sempre gli ultimi MAX_BUFFER valori letti quindi la media sarebbe corretta.

le operazioni su tipo int su avr mi sembra siano atomiche quindi non dovresti avere problemi di letture / scritture interrotte a metà

Grazie , gli do un'occhiata , ma il ring buffer non ha due indici ?
comunque vedo di implementarlo :smiley: :smiley: