Forum: Mikrocontroller und Digitale Elektronik PIC18F4550 Frequenzzähler Timer Probleme


von Stefan (Gast)


Lesenswert?

Hallo,

ich programmiere auf dem PIC18F4550 einen Frequenzzähler mit dem C18 
Compiler.

Ich nutze den Timer1 um mir alle 250ms einen Interrupt zu erzeugen.
In diesen 250ms zähle ich die TTL-Pulse die an Pin RC0 an den Timer3 
gelangen. Wird der Interrupt von Timer1 ausgelöst, stoppt die ISR beide 
Timer, ließt den Timer3 aus und setzt ihn wieder auf null. Danach werden 
beide Timer wieder gestartet.

Die Erfassung ist nicht lückenlos, aber das stört mich erstmal nicht.
Ich lasse mir moementan den Inhalt des Zählers Timer3 zyklisch auf dem 
Diplay darstellen. Das Problem ist: Er zählt einfach nur hoch, läuft 
über und beginnt von vorne.

Vielleicht erkennt ja jemand meinen Fehler.

Hier einige C Schnippsel:

Initialisierung von Timer1 und Timer3:
//******  Timer1 Init
  TMR1H = 0x0B; /* Load timer1 higher byte */
  TMR1L = 0xDA; /* Load timer1 lower byte */
  T1CONbits.RD16=1;   //1=16bit 0=8bit
  T1CONbits.T1RUN=0;   // Clock from Timer1 Oscilattor
  T1CONbits.T1CKPS0=1;
  T1CONbits.T1CKPS1=1;    // (input clock prescaler select select) 8:1
  T1CONbits.T1SYNC=1;      //Timer1 external clock input syncronisation 
control bit(1 - der Syncronisator wird nicht benutzt)
  T1CONbits.TMR1CS = 0;    //Timer1 clock source select(1 - derTakt 
kommt vom Pin RC0 bzw. RC1) 0-> Takt ich clock/4
//TImer3 (zähler)
  T3CONbits.RD16=1;   //1=16bit 0=8bit
  T3CONbits.T3CCP2=0;   // Clock from Timer1 Oscilattor
  T3CONbits.T3CCP1=0;
  T3CONbits.T3CKPS1=1;    // (input clock prescaler select select) 8:1
  T3CONbits.T3CKPS0=1;
  T3CONbits.T3SYNC= 0;      //Timer1 external clock input syncronisation 
control bit(1 - der Syncronisator wird nicht benutzt)
  T3CONbits.TMR3CS = 1;    //Timer1 clock source select(1 - derTakt 
kommt vom Pin RC0 bzw. RC1) 0-> Takt ich clock/4
  T3CONbits.TMR3ON = 0;  //OFF

 //*****


Hier meine ISR:
void isr (void)
{

  INTCONbits.GIE = 0;
   if PIR1bits.TMR1IF==1)
    {
    T1CONbits.TMR1ON =  0;  //Timer1 Off
    T3CONbits.TMR3ON = 0;  //Timer3 Off
    FCOUNTL = TMR3L;    //Auslesen Timer3
    FCOUNTH = TMR3H;
    TMR3L = 0;        //Turückstzen Timer 3
    TMR3H = 0;
    TMR1H = 0x0E;       //Timer 1 auf 250ms setzen
      TMR1L = 0xDA;
    PORTAbits.RA4=~LATAbits.LATA4; //Test LED Toggeln
    PIR1bits.TMR1IF = 0;  // Timer 1 Interrupt Flag zurücksetzen
    FreqFlag=1;        // Main: Displayberechnung aktivieren


    }

  if (INTCON3bits.INT2IF == 1)
  {
      ButtonFlag = 1;
    INTCON3bits.INT2IE = 0;
      INTCON3bits.INT2IF = 0;       //Clear the interrupt flag
  }
  INTCONbits.GIE = 1;

}


//Und zuguterletzt meine Berechnung in der MAIN

  if (FreqFlag==1)
  {
  FreqFlag=0;
  FREQ= (int) (FCOUNTH);
  DISPLAY[0]=0;
  DISPLAY[1]=0;
  DISPLAY[2]=0;
  DISPLAY[3]=0;
  DISPLAY[4]=0;
  DISPLAY[5]=0;
  DISPLAY[6]=0;
  DISPLAY[7]=0;
  DISPLAY[8]=0;
  DISPLAY[9]=0;
  ultoa( FREQ, DISPLAY);
  Clear_LCD();

    for (count2 = 0; DISPLAY[count2]; count2++)
    LCD_Write_DATA(DISPLAY[count2]);

  T1CONbits.TMR1ON=  1;  //Timer1 ON
  T3CONbits.TMR3ON = 1;  //Timer3 ON
   PIE1bits.TMR1IE = 1; /* Enable timer1 interrupt */

  }


Die Main gibt mir nur den Inhalt von TMR3H am Display aus. Das 
Funktioniert
soweit. Ich habe aber kein schimmer wieso der Timer3 Inhalt immer weiter 
steigt wo ich ihn doch jedesmal in der ISR zurücksetzte.

Gruß Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.