Witam,
Jak w temacie zaznaczam, że jestem początkujący w C a moje pytanie związane jest z próbą rogryzienia kodu w C a przy okazji zrozumienia do końca funkcji Compare. Znalazłem taki kodzik:
chodzi w nim o sprawdzenie czasu trwania impulsu wysokiego podanego na wejście ICP1.
i mam w zasadzie 2 pytania:
odnośnie linijki:
1. czy dobrze rozumiem, że taki zapis (uint32_t)falling to poprostu rzutowanie typów, ponieważ na początku zmienna falling zadeklarowana była jako 16-to bitowa?
2. nie rozumiem za bardzo tego sposobu obliczania czasu - bo np czy czas impulsu nie jest po prostu równy zmiennej counts ???, która jest zerowana z momencie narastającego zbocza i inkrementowana do momentu wykrycia zbocza opadającego (timer1 działa przecież bez preskalera) - po co więc w tym przypadku jeszcze ta różnica falling-rising ? (jakoś już się zakręciłem)
Jak w temacie zaznaczam, że jestem początkujący w C a moje pytanie związane jest z próbą rogryzienia kodu w C a przy okazji zrozumienia do końca funkcji Compare. Znalazłem taki kodzik:
#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\iom8.h>
#define ICP PINB0
//define ovrflow counter
uint16_t ov_counter;
//define times for start and end of signal
uint16_t rising, falling;
//define overall counts
uint32_t counts;
//overflow counter interrupts service routine
ISR(TIMER1_OVF_vect){
ov_counter++;
}
//Timer1 capture interrupt service subroutine
ISR(TIMER1_CAPT_vect){
/*This subroutine checks was it start of pulse (rising edge)
or was it end (fallingedge)and performs required operations*/
if (ICP) //if high level
{
//save start time (zapamiętaj czas startu)
rising=ICR1;
//set to trigger on falling edge
// ustaw wyzwalanie zboczem opadającym
TCCR1B=TCCR1B&0xBF;
//reset overflow counter (resetruj ov_counter)
ov_counter=0;
}
else
{
//save falling time
// zapamiętaj czas końca impulsu)
falling=ICR1;
//rising edge triggers next
// ustaw wyzwalanie zboczem rosnącym
TCCR1B=TCCR1B|0x40;
counts=(uint32_t)falling-(uint32_t)rising+(uint32_t)ov_counter;
/*you can convert coutns to seconds and send to LCD*/
}
}
int main(void) {
//enable overflow and input capture interrupts
TIMSK=0x24;
/*Noise canceller, without prescaler, rising edge*/
// Timer1 bez preskalera, zbocze rosnące, eliminacja zakłóceń
TCCR1B=0xC1;
sei();
for (;;) {
/* loop forever timer does the job*/
}
}chodzi w nim o sprawdzenie czasu trwania impulsu wysokiego podanego na wejście ICP1.
i mam w zasadzie 2 pytania:
odnośnie linijki:
Cytat:counts=(uint32_t)falling-(uint32_t)rising+(uint32_t)ov_counter;
1. czy dobrze rozumiem, że taki zapis (uint32_t)falling to poprostu rzutowanie typów, ponieważ na początku zmienna falling zadeklarowana była jako 16-to bitowa?
2. nie rozumiem za bardzo tego sposobu obliczania czasu - bo np czy czas impulsu nie jest po prostu równy zmiennej counts ???, która jest zerowana z momencie narastającego zbocza i inkrementowana do momentu wykrycia zbocza opadającego (timer1 działa przecież bez preskalera) - po co więc w tym przypadku jeszcze ta różnica falling-rising ? (jakoś już się zakręciłem)