Nie moge sobie poradzic z pomiarem szerokosci impulsu podawanego na wejscie T1... program chodzi na 2 przerwaniach: jedno od INT0 (wyzwalane zboczem opadajacym, sygnal prostokatny podawany na polacznone wejscia INT0 i T1) drugie zegarowe 50ms generowane z T0; przerwanie od INT0 wyglada nastepujaco:
void it_int0 (void ) interrupt 0 using 2 // Przerwanie INT0 { impulsy=TL1; impulsy=impulsy+256*TH1; TL1=0; TH1=0; }
gdy zawartosc licznika wyswietlam przy kazdym wywolaniu tego przerwania wszystko dziala bez zarzutu natomiast gdy chce to robic co 200ms w przerwaniu od T0:
void it_t0 (void ) interrupt 1 using 1 // Przerwanie od czasomierza (generowane 20 razy na sekunde) { TL0=0xaf; //wartosc odpowiadanaja 50ms przy zegarze 12MHz TH0=0x3c; cz_sek++; impulsy2=impulsy2+(impulsy/4); //srednia z 4 kolejnych odczytow T1 if (cz_sek==4) // wyswietlanie co 4 cykle przerwania { imp(); // funkcja wyswietlajaca wynik pomiaru cz_sek=0; impulsy2=0; }
wszystko jest dobrze, gdy dlugosc impulsu nie przekracza 1.5ms (15000 impulsow przy zegarze 12MHz). powyzej tej wartosc wynik zaczyna plywac tym bardziej im dluzszy jest impuls - przy 15000 jest to ok 500, przy 35000 nawet 5000
ma ktos pomysl jak to rozwiazac? probowalem zmieniac priorytety obu przerwan i nic sie nie zmienia...
pozdrawiam Artur