Autor Thema: Frequenzmessung CCP(Capture) und TIMER1  (Gelesen 3597 mal)

Offline CM_HT

  • Full Member
  • ***
  • Beiträge: 165
    • Profil anzeigen
Frequenzmessung CCP(Capture) und TIMER1
« am: Mai 13, 2008, 13:12:59 Nachmittag »
Frequenzmessung CCP(Capture) und TIMER1:
(18F4680)
Hallo,

Ich errechne die Frequenz über CCP und Timer 1. Steigende Flanke-> nimm die Zeit, nächste Flanke nimm wieder
die Zeit. Errechne mit overflow und Zeitspanne die Frequenz.

Der Frequenzbereich liegt bei ca. 12Hz bis 10kHz (40MHz Takt).

Im prinzip daßt das alles ganz gut, aber in 1 % der Berechnung fehlt mir ein overflow, weil er den verpaßt hat.
im Debug kann man dies schön nachrechnen.
Der Star- Wert liegt dabei immer in der Nähe von 65535, Quasi kurz vor dem OVF.

In der Interruptroutine, beide High Priority, frage ich auch beide ab.

Nun weis nich leider nicht, wie ich diesen Berechnungsfehler beseitigen kann.

Hat jemand eine Idee, wie man dies am besten lösen könnte?

Hier mal meine ISR:


void MyHighISR(void)                                                                       
{                                                                                           
                                       
                                                                                           
 if (PIR1bits.TMR1IF) // wenn timer1 Interrupt gesetzt / occurs               
 {                                                                                         
overf++; //inkrementiere die Overflow Variable                       
PIR1bits.TMR1IF =0; // Rücksetzen des Flags                                 
 }                                                                                         
                                                                                           
if (PIR1bits.CCP1IF) //Signalflanke am CCP1 Eingang (Frequenzimpuls)         
 {                                                                                         
               // ###### Start  Aufnahme der Werte
                                                                                           
Cap.lc = CCPR1H;                                                                       
Cap.lc<<=8;                                                                             
Cap.lc |= CCPR1L;                                                                       
                                                                                           
   if(!save_flag) // welcher Wert soll gespeichert werden?                 
   { // Speicherung der Startzeit                                   
                                                                                           
isrbuf.start_t = Cap.lc;//ReadCapture1();                                               
overf = 0;                                                                             
save_flag = 1;                                                                         
PIR1bits.TMR1IF =0;                                                                     
}                                                                                      
else // Speicherung der Stopzeit                                     
{                                                                                         
save_flag =0;                                                                           
isrbuf.stop_t = Cap.lc; //ReadCapture1();                                               
isrbuf.ovf+=overf;                                                                     
// Speicherung im ISR Buffer                                               
if (!cal_flag) // kein zurgiff auf Buffer von der Berechnung             
{                                                                                       
  calbuf=isrbuf; // Übergabe an Berechnungs Buffer                         
  cal_flag=1;                                                                           
  isrbuf.stop_t=0;                                                                     
  isrbuf.start_t=0;                                                                     
  isrbuf.ovf =0;                                                                       
}                                                                                    
                       
overf = 0;                                                                             
                             
}                                                                                         
PIR1bits.CCP1IF=0;                                                                 
 }                                                                                         
                                                                                         

 

Gruß

Claus                 

 


* Recent Topics