ПредишенСледващото

Измерване на продължителността на импулса чрез TMR0

Господи, Обзалагам се, че една седмица на кода, не може да се измери.
Контролер 16F648A 20MHz
Проблем за измерване на продължителността на импулса (между водещите ръбове), с използване TMR0. TMR0 се таксува от вътрешния осцилатор.
Използвайте INT на водещия ръб.
делител 01:16
Тест времетраене на импулса от 400 микросекунди (т.е., 3.2 стъпка MS представлява 400 микросекунди и таймер 125 трябва да брои (7D)).
Проектиран алгоритъм:
1. да получават капани от INT, се уверете, че на INT, и нула, TMR0 препълване флаг TMR0, прехапа променливи бележки, които прекъсват "първия" излизането от прекъсване за да се позволи по-долу, и е за сметка на TMR0 прекъсват от следващия нарастване на фронта.

2. Вземете "второ" от прекъсване INT, се уверете, че на INT, TMR0 стойност пише на масива, премахване на марката на "първото прекъсване, производството не се позволява по-нататъшно прекъсване.

3. Продукция стойността TMR0 масив от LCD елементи на

4. таймер изтече, изчисти от таймера за преливник флаг, оставете INT и отидете на P1.

и 8 пъти по-дълго елементи масив няма да бъдат изпълнени с TMR0.

Проблемът е, че получената стойност TMR0 изключително различават помежду си, при продължителност на постоянен пулс.
Или TMR0 прелива в някакъв момент, но не трябва да бъде, или на контролера "proschelkivaet" втори фронт и отива на прекъсване на 3-ти, 4-ти и. отпред, а броят на таймера.
Въпреки, че не трябва да бъде, за прекъсване е изпълнено в рамките на 24 милисекунди.

Когато част от кода е счупен прекъсване:

той прекъсне манипулатор:

Бит операции в които не харесвам да се прекъсва, но аз не знам как по друг начин да улови две последователни предния ръб.

Prompt поклати проблема, операцията изглежда проста.

Подкрепете проекта - споделете линка, благодаря!