Je suis toujours dans ma découverte des PIC.
Je me pose une question après avoir fait des tas d'essais car ça ne fonctionne pas.
D'après la DS, on ne peut pas configurer la capture pour générer une interruption sur les fronts descendants et les fronts montants, c'est l'un ou l'autre. Or moi je veux mesurer la période haute et basse des pulses. J'ai donc tenté de modifier le registre CCP1M à la volée dans le code de détection d'interruption pour faire une bascule entre les 2 modes, mais ça ne semble pas fonctionner... C'est possible ou pas ?
Je précise : la pin RA2 est à l'état haut en permanence, les impulsions la tire à zéro.
Merci et bon dimanche.
Résumé du code de la supposée bascule
Code : Tout sélectionner
if ( CCP1CONbits.CCP1M3 == 1 )
{
CCP1CONbits.CCP1M = 0b0100 ;
}
else
{
CCP1CONbits.CCP1M = 0b0101 ;
} Et le code au complet
Code : Tout sélectionner
#include <xc.h>
#include "E:\XC8_includes\PIC12F1840_UART\my_header.h"
#include "E:\XC8_includes\PIC12F1840_UART\PIC12F1840_UART.h"
unsigned long int _XTAL_FREQ = 32000000UL;
unsigned long int BAUDRATE = 19200;
#define LED_ROUGE RA5
#define PULSE RA2
#include <stdio.h>
#include <math.h>
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
volatile unsigned long ul_nb_debord_timer1 = 0;
volatile unsigned long ul_nb_debord_timer2 = 0;
volatile unsigned long ul_T1_debutbas = 0;
volatile unsigned long ul_T1_debuthaut = 0;
void __interrupt() isr(void)
{
if (TMR1IF) // si débordement de timer1
{
ul_nb_debord_timer1++;
// sprintf(str_uart,"Nb deb T1 = %lu\n\r",ul_nb_debord_timer1);
//UART_write_string(str_uart );
TMR1IF = 0; // raz du flag d'interruption
}
if (CCP1IF) // changement d'état sur RA2
{
unsigned long u_capture_T1;
u_capture_T1 = (uint16_t)(CCPR1H << 8) + CCPR1L;
u_capture_T1 += (ul_nb_debord_timer1 * 65536 ) ;/// ( (32000000/4) * 16 );
ul_nb_debord_timer1 = 0;
//0101 = Capture mode: every rising edge
//0100 = Capture mode: every falling edge
if ( CCP1CONbits.CCP1M3 == 0 )
{
// début front descendant
// calcul du temps haut précédent
LED_ROUGE = 1;
ul_T1_debutbas = u_capture_T1;
if (ul_T1_debuthaut == 0)
{
UART_write_string("Tps H n/a\n\r" );
}
else
{
u_capture_T1 = ul_T1_debuthaut - u_capture_T1;
ul_T1_debuthaut = 0;
sprintf(str_uart,"DES T1 = %lu\n\r",u_capture_T1);
UART_write_string(str_uart );
}
}
else
{
// début front montant
// calcul du temps bas précédent
u_capture_T1 = ul_T1_debutbas - u_capture_T1;
LED_ROUGE = 0;
ul_T1_debuthaut = u_capture_T1;
ul_T1_debutbas = 0;
sprintf(str_uart,"MONT T1 = %lu\n\r",u_capture_T1);
UART_write_string(str_uart );
}
if ( CCP1CONbits.CCP1M3 == 1 )
{
CCP1CONbits.CCP1M = 0b0100 ;
}
else
{
CCP1CONbits.CCP1M = 0b0101 ;
}
CCP1IF = 0; // raz flag
}
}
void main(void)
{
OSCCON = 0b11110000; // oscillateur interne à 32MHz
OPTION_REGbits.nWPUEN = 0; // pull-up internes modifiables au cas par cas
UART_init(); // Initialise l'UART
// RA5 LED rouge visu debug
TRISAbits.TRISA5 = 0;
WPUAbits.WPUA5=0; // pull-up off
LED_ROUGE = 0;
// RA2 pour réception des impulsions
TRISAbits.TRISA2 = 1; // RA2 en entrée
ANSELAbits.ANSA2 = 0; // RA2 numérique
WPUAbits.WPUA2=0; // pull-up off sur RA2
TMR1 = 0;
T1CONbits.TMR1CS = 0; // fosc / 4
// Choose the desired prescaler ratio (1:1)
// 1 et 1 : divise par 16
T1CKPS0 = 1;
T1CKPS1 = 1;
TMR1H = 0x00;
TMR1L = 0x00;
TMR1ON = 1;
//--[ Configure The CCP1 Module To Operate in Capture Mode ]--
//0101 = interruption sur front desc
//0100 = interruption sur front mont
CCP1CONbits.CCP1M = 0b0101;
// Enable CCP1 Interrupt
PIE1bits.CCP1IE = 1;
CCPR1H = 0x00;
CCPR1L = 0x00;
PEIE = 1;
GIE = 1;
while(1)
{
}
}

