Măsurarea lățimii impulsului utilizând forumul tmr0 - micro-chip

Măsurarea lățimii impulsului cu TMR0

Domnilor, am bătut codul timp de o săptămână, nu o pot măsura.
Controler 16F648A 20MHz
Sarcina este de a măsura lățimea pulsului (între marginile în creștere) folosind TMR0. TMR0 este incriminat de la generatorul intern.






Eu folosesc întrerupe INT pe marginea de vârf.
Prezentator 1:16
Durata impulsului de testare este de 400 μs (adică treapta de numărare este de 3,2 μs, iar timp de 400 μs cronometrul trebuie să numere 125 (7D)).
Algoritmul conceput:
1. pentru a primi capcane de la INT, asigurați-vă că INT, și zero afară de pavilion TMR0 preaplin TMR0, bit note variabile care întrerup „prima“ ieșire de la întrerupere, pentru a permite următoarele, și se plătește la TMR0 întrerupe de la următorul front crescător.

2. Ia-o „a doua“ de întrerupere INT, asigurați-vă că INT, valoarea TMR0 scrie matrice, îndepărtați marca de „prima întrerupere, ieșirea nu permite întreruperea în continuare.







3. Afișați valoarea TMR0 din elementul matrice pe ecranul LCD

4. resetați cronometrul, resetați semnalul de depășire a temporizatorului, activați întreruperea INT și treceți la n1.

și de 8 ori până când elementele matricei sunt umplute cu valori TMR0.

Problema este că valorile obținute de TMR0 sunt extrem de diferite între ele, durata pulsului fiind constantă.
Fie TMR0 se deplasează într-un anumit punct, deși nu ar trebui, sau controlerul "jonglează" a doua față și se întrerupe pe 3, 4 și. frontală și contorul de timp.
Deși acest lucru nu ar trebui să fie, întreruperea este procesată în 24 μs.

O bucată de cod în care rupem întreruperea:

manipulatorul de întrerupere însuși:

Nu-mi plac operațiunile de biți în întreruperi, dar nu știu cum altundeva să prind două fronturi frontale consecutive.

Prompt sa scuturat în ce problemă, operațiune simplă.







Trimiteți-le prietenilor: