www.mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.