//clipping indicator variables //boolean clipping = 0; //data storage variables byte newData = 0; byte prevData = 0; //freq variables unsigned int timer = 0;//counts period of wave unsigned int period; int frequency; void setup(){ Serial.begin(9600); //pinMode(13,OUTPUT);//led indicator pin //pinMode(12,OUTPUT);//output pin // pinMode(11,OUTPUT); pinMode(10,OUTPUT); pinMode(9,OUTPUT); pinMode(8,OUTPUT); pinMode(7,OUTPUT); pinMode(6,OUTPUT); cli();//disable interrupts //set up continuous sampling of analog pin 0 //clear ADCSRA and ADCSRB registers ADCSRA = 0; ADCSRB = 0; ADMUX |= (1 << REFS0); //set reference voltage ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz ADCSRA |= (1 << ADATE); //enabble auto trigger ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete ADCSRA |= (1 << ADEN); //enable ADC ADCSRA |= (1 << ADSC); //start ADC measurements sei();//enable interrupts } ISR(ADC_vect) {//when new ADC value ready prevData = newData;//store previous value newData = ADCH;//get value from A0 if (prevData < 127 && newData >=127){//if increasing and crossing midpoint period = timer;//get period timer = 0;//reset timer frequency = 38462/period; delay(10); } /*if (newData == 0 || newData == 1023){//if clipping PORTB |= B00100000;//set pin 13 high- turn on clipping indicator led clipping = 1;//currently clipping }*/ timer++;//increment timer at rate of 38.5kHz } void loop(){ /*if (clipping){//if currently clipping PORTB &= B11011111;//turn off clippng indicator led clipping = 0; }*/ //frequency = 38462/period;//timer rate/period //print results /*if(frequency>=1 and frequency<=200){ digitalWrite (12,HIGH); delay(190); digitalWrite (12,LOW); } if(frequency>=201 and frequency<=450){ digitalWrite (11,HIGH); delay(190); digitalWrite (11,LOW); } if(frequency>=450 and frequency<=710){ digitalWrite (10,HIGH); delay(190); digitalWrite (10,LOW); } */ if(frequency>=1 and frequency<=800){ digitalWrite (10,HIGH); delay(190); digitalWrite (10,LOW); } if(frequency>=800 and frequency<=1200){ digitalWrite (9,HIGH); delay(190); digitalWrite (9,LOW); } if(frequency>=1201 and frequency<=1800){ digitalWrite (8,HIGH); delay(190); digitalWrite (8,LOW); } if(frequency>=1801 and frequency<=3000){ digitalWrite (7,HIGH); delay(190); digitalWrite (7,LOW); } if(frequency>=3001 and frequency<=10000){ digitalWrite (6,HIGH); delay(190); digitalWrite (6,LOW); } Serial.print(frequency); Serial.println(" hz"); delay(10); }