Arduino hög hastighet oscilloskop med PC-gränssnitt (4 / 7 steg)
Steg 4: Ställa in avbrottet för maskinvaran utlöste version
Denna metod är mycket lik versionen av programvaran.
Utlöser hanteras olika.
Digital Port två måste vara ansluten till analog ingång 1, att detta ska fungera.
I huvudsak om ingen utlöser markeras på adc avbryta aktiveras och data fångas omedelbart. Om utlöser väljs ett avbrott på digital port 2 används för att aktivera avbrott på adc-porten 1.
Digital port 2 kan konfigureras för att läsa analoga signaler och generera ett avbrott på stigande eller sjunkande data kanter. Det är mycket snabbt.
Min avbrott rutin kallas gotinterrupt och som jag använder digital port 2 avbrott-id är 0.
CONST byte ExtInterrupt = 2;
pinMode(ExtInterrupt,INPUT);
attachInterrupt (0, gotinterrupt, RISING);
attachInterrupt (0, gotinterrupt, faller);
.
Flaggan utlöste kontroller om digital port 2 avbrottet börjar på analog port 1 avbryta. När utlöste är falskt avbrottet börjar på adc avbryta när den upptäcker en kant i den analoga ingången.
.
samma som programvaran avbryta koden upp till här...
SBI(ADCSRA,ADEN); Aktivera ADC
sedan...
om (trigger == 0) {
SBI(ADCSRA,ADSC); Starta ADC mätningar på avbrott
StartTime=Micros();
} annat {
tillåta pw2 avbrott att starta adc avbrott
utlöste = false;
}
SEI(); Aktivera avbrott
.
Avbryta koden
1) port 2 avbrott betjänas av gotinterrupt
Detta avbrott aktiveras av en positiv eller negativ kant på port 2.
Det gör ingenting förrän utlöses är falskt.
void gotinterrupt() {
om (! utlöste) {
utlöste = sant;
SBI(ADCSRA,ADSC); Starta ADC mätningar på avbrott
StartTime=Micros(); spela in starttid för intervall beräkning
}
}
2) adc avbryta trafikeras av ISR(ADC_vect)
Variabel bufcount lagrar positionen i bufferten, vars storlek är BUF_SIZE (= 1000)
Data lagras i platser bufa(0) till bufa(999)
När bufferten är full är flaggan writeit sant och adc är inaktiveras. (cbi(ADCSRA,ADEN);)
.
ADC avbrott rutin
Detta är nyckeln till programmet!
ISR(ADC_vect) {
BUFA [bufcount] = ADCH;
bufcount ++; Increment buffert counter
om (bufcount == BUF_SIZE) {
CBI(ADCSRA,ADEN); Inaktivera ADC
EndTime=Micros(); spela in sluttid för intervall beräkning
writeit = sant; flagga att det behövs en skriva
}
}