Girino - snabb Arduino oscilloskop (17 / 26 steg)
Steg 17: Skriver kärnan av skiss
Som vi såg innan, jag ville ha en kontinuerlig förvärv och jag skrev den ADC avbryta tjänsten rutin för att lagra i cirkulär buffert data kontinuerligt. Den stannar när den når det index som är lika med stopIndex. Bufferten är implementerad som cirkulär anställning den modulooperatorn.
//-----------------------------------------------------------------------------
ADC konvertering komplett avbryta
//-----------------------------------------------------------------------------
ISR(ADC_vect)
{
När ADCL läses, uppdateras ADC Data registrera inte förrän ADCH
läses. Följaktligen, om resultatet lämnas justerad och inte mer
än 8-bitars precision krävs, är det tillräckligt att läsa ADCH.
Annars måste ADCL läsas först, sedan ADCH.
ADCBuffer [ADCCounter] = ADCH;ADCCounter = (ADCCounter + 1) % ADCBUFFERSIZE;
om (vänta)
{
om (stopIndex == ADCCounter)
{
Frysa situation
Inaktivera ADC och stoppa gratis kör konverteringsläge
CBI (ADCSRA, ADEN);frysa = sant;
}
}
}
Den Analog komparator avbryta tjänsten rutin (som kallas när en signal passerar tröskeln) inaktiverar själv och berättar ADC ISR att starta den väntande fasen och sätter stopIndex.
//-----------------------------------------------------------------------------
Analoga komparator avbrott
//-----------------------------------------------------------------------------
ISR(ANALOG_COMP_vect)
{
Inaktivera Analog komparator avbrott
CBI (ACSR, ACIE);Aktivera errorPin
digitalWrite (errorPin, hög);
SBI (PORTB, PORTB5);vänta = sant;
stopIndex = (ADCCounter + waitDuration) % ADCBUFFERSIZE;
}
Detta var verkligen lätt efter att jordning!