Bonjour à tous,
J'essaie de mesurer la fréquence d'un signal en entrée d'un PIC18F24K22 à l'aide du mode capture.
Je travail sur MPLAB8.85 avec le compilateur C18.
En entrée, sur ma broche T1CKI (RC0), j'ai un signal de l'ordre de 10MHz, et je déclenche des interruptions grâce à un pulse chaque seconde sur la broche CCP1 (RC2).
Au final, lorsque j'ai essayé d'envoyer le résultat de mon compteur (Timer1) sur mon hyperterminal, j'ai découvert que le compteur envoyait sans arrêt la même valeur erronée, et que mon programme plantait toutes les 6-7 secondes.
Je crois que j'ai un problème de gestion d'horloge, ou d'overflow quelque part mais, j'avoue que ça me dépasse. Je ne trouve pas la source exacte de mon problème.
Si quelqu'un a déjà eu ce genre de problème, ou arrive à trouver mon (ou mes) erreur(s), je lui serais très reconnaissant.
Voici le code que j'ai utilisé :
Merci pour votre aideCode:#define USE_OR_MASKS #include <stdlib.h> #include <stdio.h> #include <p18f24k22.h> #include <usart.h> #include <timers.h> #include <capture.h> #include <EEP.h> #pragma config FOSC = INTIO7 // Internal oscillator block clock out on OSC2 for debug the clock speed #pragma config PLLCFG = OFF // Oscillator used directly #pragma config PWRTEN = ON // Power up timer enabled #pragma config BOREN = NOSLP // Brown-out reset enabled in hardware only #pragma config BORV = 250 // VBOR set to 2.50V nominal #pragma config LVP = OFF #pragma config WDTEN = NOSLP // WDT is disabled in sleep, otherwise enabled #pragma config WDTPS = 2048 // WD timer prescaler 1:2.048 #pragma config FCMEN = OFF // fail-safe clk monitor not enable #pragma config IESO = OFF // internal/external oscillator switch not enabled, so PORTA6 and PORTA7 can be used #pragma config MCLRE = EXTMCLR // MCLR pin enable bit #pragma config HFOFST = ON // HFINTOSC fast start-up enabled without waiting unsigned int nb_period = 0; unsigned int old = 0; unsigned char it_OK = 0; char begin[] = "BEGIN OF MAIN \r\n"; char text[] = "number of periods per second : "; #pragma interrupt it_PPS void it_PPS( void) { if(PIR1bits.CCP1IF) { nb_period = CCPR1 - old; old = CCPR1; it_OK = 1; } PIR1bits.CCP1IF = 0; } #pragma code interruption=0x8 void it_prioritaire( void) { _asm goto it_PPS _endasm } #pragma code void main( void) { // Oscillator configuration OSCCONbits.IRCF = 7; // default is 3 OSCCONbits.OSTS = 0; // Device is running from the internal oscillator OSCCONbits.HFIOFS = 1; // HFINTOSC frequency is stable OSCCONbits.SCS = 2; // System clock select internal oscillator block OSCCON2bits.PLLRDY = 0; // System clock comes from an oscillator, other than 4xPLL OSCCON2bits.PRISD = 1; // Primary Oscillator Drive circuit ON TRISCbits.TRISC2 = 1; // Configure RC2 (CCP1) as an input ANSELCbits.ANSC2 = 0; // RC2 defined as digital // Timer1 configuration TRISCbits.TRISC0 = 1; // Configure RC0 (clk_PIC) as an input T1CONbits.TMR1CS1 = 1; // clk source : external clock from T1CKI pin T1CONbits.TMR1CS0 = 0; T1CONbits.T1CKPS1 = 0; // 1:1 prescale value T1CONbits.T1CKPS0 = 0; T1CONbits.T1SOSCEN = 0; // secondary oscillator disabled T1CONbits.T1SYNC = 1; // external clk input not synchronized T1CONbits.TMR1ON = 1; // timer1 turned ON // Capture Mode configuration CCP1CONbits.CCP1M3 = 0; // Capture mode : every rising edge <3:0> = 0101 CCP1CONbits.CCP1M2 = 1; CCP1CONbits.CCP1M1 = 0; CCP1CONbits.CCP1M0 = 1; PIR1bits.CCP1IF = 0; // flag cleared PIE1bits.CCP1IE = 1; // enable CCP1 interrupts // USART Configuration SPBRG1 = 103; // 9600 baud @16MHz TXSTA = 0x24; // Config TX RCSTA = 0x90; // Config RX TRISCbits.TRISC7 = 1; // RS232_RX_10MHZ as input TRISCbits.TRISC6 = 0; // RS232_TX_10MHZ as output INTCON |= 0xC8; INTCON2 |= 0b10000001; RCONbits.IPEN = 1; INTCONbits.GIE = 1; while(!TXSTA1bits.TRMT); puts1USART((char*)begin); while(1) { if(it_OK) { while(!TXSTA1bits.TRMT); puts1USART((char*)text); nb = INT_to_ASCII_conversion(nb_period); // personnal function, which works correctly puts1USART(nb); it_OK = 0; } } }
Jean
-----