Étape 17 : Écriture du noyau de l’esquisse
Comme nous l’avons vu avant, j’ai voulu une acquisition continue et j’ai écrit l’ADC Interrupt Service Routine pour stocker dans la mémoire tampon circulaire les données en permanence. Il s’arrête dès qu’il atteint l’index qui est égale à stopIndex. Le tampon est mis en œuvre pour employer la circulaire l’opérateur modulo.
//-----------------------------------------------------------------------------
Interrompre la Conversion ADC complète
//-----------------------------------------------------------------------------
ISR(ADC_vect)
{
Lorsque ADCL est lue, le registre de données ADC n’est pas actualisé jusqu'à ADCH
est lue. Par conséquent, si le résultat n’est pas ajusté et plus
que de 8 bits de précision est requise, il suffit de lire ADCH.
Dans le cas contraire, ADCL doit être lu en premier lieu, puis ADCH.
ADCBuffer [ADCCounter] = ADCH ;
ADCCounter = (ADCCounter + 1) % ADCBUFFERSIZE ;
Si (attendre)
{
Si (stopIndex == ADCCounter)
{
Geler la situation
Désactiver l’ADC et arrêter le Mode de Conversion gratuit en cours d’exécution
CBI (ADCSRA, ADEN) ;
geler = true ;
}
}
}
L’analogique comparateur Interrupt Service Routine (ce qui est appelé lorsqu’un signal passe le seuil) se désactive et raconte l’ISR ADC pour commencer la phase d’attente et définit le stopIndex.
//-----------------------------------------------------------------------------
Interruption de comparateur analogique
//-----------------------------------------------------------------------------
ISR(ANALOG_COMP_vect)
{
Désactiver l’interruption comparateur analogique
CBI (ACSR, ACIE) ;Allumez les errorPin
digitalWrite (errorPin, HIGH) ;
SBI (PORTB, PORTB5) ;attendre = true ;
stopIndex = (ADCCounter + waitDuration) % ADCBUFFERSIZE ;
}
C’était vraiment facile, après toute cette terre !