Well, I did not literally mean I m going to capture pulses.
I need to read an incoming square wave at 125kHz, at every 8us or less. The data read in the process is put in a buffer for further processing.
/******* Sketch to test Input Capture interrupt handling *********************************
functionality: measure length of pulses on the ICP pin with precision of 0.5 microseconds
Show the min and max pulse widths in microseconds on the serial port
**************************************************************************************************************/
#include <stdio.h> // for verbose debugging using sprintf
//#include "TimerOne.h"
#include "Timer.h"
#define icpPin 8 // ICP input pin on arduino
#define outPin 2 // output pin that will shadow the input, can be monitored with a scope
// some variables to help see that something is happening in the interrupt handlers
volatile unsigned int Value; // this stores the current ICR1 value
volatile unsigned int MinValue;
volatile unsigned int MaxValue;
volatile unsigned int Overflows;
volatile unsigned int PulseCount;
char buffer[800];
short i;
Timer t;
/* Overflow interrupt vector */
ISR(TIMER1_OVF_vect){ // here if no input pulse detected
Overflows++; // incriment overflow count
}
/* ICR interrupt vector */
ISR(TIMER1_CAPT_vect){
TCNT1 = 0; // reset the counter
if( bit_is_set(TCCR1B ,ICES1)){ // was rising edge detected ?
digitalWrite(outPin,HIGH ); // yes, set our output pin high to mirror the input
}
else { // falling edge was detected
Value = ICR1; // save the input capture value
digitalWrite(outPin,LOW ); // set our output pin low to mirror the input
PulseCount++;
if(Value < MinValue) // update min or max values as appropriate
MinValue = Value;
if (Value > MaxValue)
MaxValue = Value;
}
TCCR1B ^= _BV(ICES1); // toggle bit value to trigger on the other edge
}
ISR(TIMER0_COMPA_vect){
if(i<800){
buffer[i] = digitalRead(icpPin);
}i++;
}
int val = 0;
int ledPin = 11;
int analogPin = 3;
int pwmPin = 9;
void setup() {
Serial.begin(9600);
pinMode(outPin, OUTPUT); // declare the ledPin as an OUTPUT
pinMode(icpPin, INPUT); // ICP pin (digital pin 8 on arduino) as input
//Timer1.initialize(8);
//Timer1.pwm(9,512);
MinValue = 30000; // Initialise with extreme values
MaxValue = 0;
TCCR1A = 0 ; // this register set to 0!
TCCR1B =_BV(WGM13)|_BV(WGM12)|_BV(CS12)|_BV(CS10); //SET TO CTC MODE // NORMAL MODE!!, prescaler 8, rising edge ICP1 - this works
TCCR1B |= _BV(ICES1); // enable input capture
TIMSK1 = _BV(ICIE1); // enable input capture interrupt for timer 1
TIMSK1 |= _BV(TOIE1); // enable overflow interrupt to detect missing input pulses
Serial.print("Finished setup\r\n");
//t.start(8);
//t.pwm(9,512);
//t.pulse(9, 0.008, LOW);
t.oscillate(9,0.008,LOW);
//t.every(4, takeReading);
//t.oscillate(9,8, LOW);
//delayMicroseconds(8);
//t.oscillate(9,8, HIGH);
//delayMicroseconds(8);
//t.every(4000000, takeReading);
}
// this loop prints the number of pulses in the last second, showing min and max pulse widths
void loop() {
//char buffer[800];
// show the captured data, divide pulse widths by 2 to display time in microseconds
sprintf(buffer,"Got %d pulses: min=%d, max=%d (%d timer overflows)\r\n", PulseCount, MinValue / 2, MaxValue / 2, Overflows);
val = analogRead(pwmPin);
//analogWrite(ledPin, val/4);
//Serial.println(val);
Serial.print(buffer); // send the info to the serial port
/* reset variables ready for the next reading */
PulseCount = Overflows = 0; // reset counts
MinValue = 30000; // set values to extremes
MaxValue = 0;
delay(800); // wait 1 second for next update [/font]
}
/*
void takeReading(){
Serial.println(analogRead(9));
}*/
I am trying to work on top of this code to do the same. As of now I do not have 125khz source. I would need to generate on one of the pins(and I could not). Total failure!
A