Ciao
stavo provando la funzione Input Capture del timer 1 di Arduino 1 per leggere un'onda quadra che gli metto in ingresso al pin ICP1.
Io devo andare a leggere il valore che mi viene salvato nel registro ICR1.
I valori che prendo da questo registro sono sul fronte di salita e poi di discesa ed infine faccio la differenza per vedere quanto dura un mezzo periodo.
Quello che non ho capito è come interpretare i valori che leggo dal registro ICR1 da un apetto temporale.
Per essere più chiaro:
Se invio un'onda, da F = 115 200 Hz e T = 8,68 us, prescaler impostato a 1 quindi uso i 16 mhz dell'arduino uno, il valore di time_diff che leggo oscilla da 2 a 3. Ma li devo considerare microsecondi, nano o cosa ??
Grazie
volatile unsigned char current_edge = 0;
volatile uint16_t starting_cnt;
volatile uint16_t ending_cnt;
uint16_t time_diff;
ISR(TIMER1_CAPT_vect) {
if(current_edge == 0) {
// Save timestamp
starting_cnt = ICR1;
//Serial.println("starting_cnt");
//Serial.println(starting_cnt);
//Switch to rising edge
TCCR1B |= (1 << ICES1);
current_edge = 1;
}
else if(current_edge == 1) {
//Save timestamp
ending_cnt = ICR1;
//Serial.println("ending_cnt");
//Serial.println(ending_cnt);
//Switch to falling edge
TCCR1B &= ~(1 << ICES1);
current_edge = 2;
}
TIFR1 |= (1 << ICF1);
}
void setup() {
Serial.begin(9600);
pinMode(8, INPUT);
/*** Timer 1 overflow ***/
// DDRB |= 1 << 5;
//
// PORTB &= ~ (1 << 5);
//
// TCCR1A = 0x0;
//
// TCCR1B = (1 << CS11) | (1 << CS10); // Prescaler a 64
//
// TIMSK1 |= 1 << TOIE1; // Abilito l'interrupt Overflow
//
// sei();
/*** Timer 1 PWM ***/
// TCCR1B = (1 << CS11); // Prescaler a 8
//
// TCCR1A = (1 << WGM10) | (1 << WGM11); // Scelgo il tipo di onda PWM
//
// TCCR1A |= (1 << COM1A1); // Scelgo il pin di uscita
//
// OCR1A = 127 ; // Duty cycle al 50 %
/*** Timer 1 Input Capture ***/
TCCR1A = 0;
TCCR1B |= (1 << CS10); // Prescaleer a 1
TIMSK1 |= (1 << ICIE1); // Abilito l'input capture interrupt
// Non settando il bit ICES1 di TCCR1B esso avrà valore 0 e quindi
// la lettura dell'impulso avverrà sul FALLING
sei(); // abilito i glob interrupt
}
void loop() {
tone(4, 1000);
if(current_edge == 2) {
if(starting_cnt < ending_cnt) {
time_diff = ending_cnt - starting_cnt;
Serial.println("time_diff");
Serial.println(time_diff);
}
else {
//wrap around
//(0xffff + A) - B, done without requiring signed
time_diff = starting_cnt - ending_cnt;
time_diff = 0xffff - time_diff;
//Serial.println("PLUTO");
}
current_edge = 0;
}
}