Dobry den. Potreboval bych poradit s capturingem vstupu PD4 ICR1 (Input Capture Register). Podle katalogu a informaci na netu jsem nastavil Timer1 a povolil preruseni pro capturing. Funguje to tak, ze kdyz prijde signal precte se hodnota timeru1 a nasledne se vymaze v obsluze preuseni. Tak mi to i "funguje". Problem je v tom, ze se vobcas precte nejaky nesmysl a to bud 654500 a neco okolo toho nebo treba 4, 10, 15 a podobne. Na vstup PD4 krmim 555 dle: http://mcu.cz/news.php?… Puvodne jsem si myslel ze ta 555 ma nekde nejaky zakmit proto jsem tam dal i 74LS14 aby byli ty hrany "cisty" ale zmena zadna. Ted si nevim rady. Prikladam i hruby vypis jak to mam udelane. Pouzivam knihovny Pascal Stang. Nejsem profik, ale vobcas neco sesmolim :-DDDD
incializace:
// for 11,0592MHz crystal
// 0 = STOP (Timer not counting)
// 1 = CLOCK tics= 11,0592MHz
// 2 = CLOCK/8 tics= 13,824MHz
// 3 = CLOCK/64 tics= 172,8kHz
// 4 = CLOCK/256 tics= 43200Hz
// 5 = CLOCK/1024 tics= 10800Hz
// 6 = External Clock on T(x) pin (falling edge)
// 7 = External Clock on T(x) pin (rising edge)
timer1SetPrescaler(TIMER_CLK_DIV1);
// timer1SetPrescaler(TIMER_CLK_DIV8);
timerAttach(TIMER1OVERFLOW_INT,serviceLocalTimer1);
timerAttach(TIMER1INPUTCAPTURE_INT, serviceLocalTimer1Capture);
sbi(TCCR1B,ICES1); // v TCCR1B urcuje zda reakce na vzestupnou nebo sestupnou hranu ICR1
cbi(TIMSK, OCIE1A); // Disable compare A
cbi(TIMSK, OCIE1B); // Disable compare B
sbi(TIMSK, TICIE1); // ENABLE Capture input PD4 Timer1 !!
sbi(TIMSK, TOIE1); // ENABLE Interupt pri preteceni TIMERU 1 !!
void serviceLocalTimer1Capture (void)
{
cbi(TIMSK, TICIE1); // DISABLE Capture input PD4 Timer1 !!
captureTime = ICR1;
TCNT1 = 0;
sbi(TIMSK, TICIE1); // ENABLE Capture input PD4 Timer1 !!
TCNT1 = 0;
}
void serviceLocalTimer1 (void)
{
// nepouzito
}
Jednou za "cas" zobrazuji captureTime na LCD displeji .... vetsinou zobrazuje stejnou hodnotu ale obcas je tam totalni nesmysl i nekolikrat po sobe captureTime je u16.
Dekuji za nejaky podnet