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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.