je vous soumet quelque chose que je n'explique pas encore !
Je souhaite synchroniser un signal avec un timer pour pouvoir à termes modifier le rapport cyclique.
La synchronisation s'effectue sur le secteur soit un signal 230V/50Hz .
Après une mise en forme HARD du signal secteur, j'obtiens donc des impulsions toutes les 10ms (100hz).
Ces impulsions sont tirées au 3V3 pour une pull-up de 10k.
Elles viennent attaquées la broche RA3 de mon PIC .( DS en haut du post)
Cette broche RA3 ne peut être qu'une entrée. Elle est également la PIN MCLR du PIC, j'ai donc désactivé cette fonction bien entendu, sinon le PIC redémarrerait sans cesse !
J'ai donc configurée celle-ci pour recevoir une Interrupt-On-Change(IOC) sur un front montant.
Mon idée est la suivante:
A chaque front montant détecté par interruption, j'active une sortie (RA2) pour un temps donné .
Pour mes tests ce temps n'est pas variable.
Je l'ai fixé à 30 boucles de 100µS soit 3ms
Au bout de ces 3ms j’éteins ma sortie.
Voici ce que j'obtiens en sortie à l'oscilloscope
j'ai, aléatoirement, des pulses qui dure plus longtemps. que les 3ms attendu. Les pulses sont soient de 3.2ms ( grossomodo) soit de 4.5ms( grossomodo).
Comment expliquer les pulses de 4.5ms ?
Je vous mets partiellement le code pour vous simplifier la chose. y'a pas grand chose de plus si ce n'est la partie Radio UART.
Code : Tout sélectionner
//############################## VARIABLES ################################################
unsigned int i=0, Temps_ON;
bit Etat_Lampe;
bit direction_variation;
bit long_press;
//-------- Dans les intteruptions
volatile bit F_appui_bref;
volatile bit F_appui_long;
volatile char F_Attente_300ms;
unsigned int Compteur_100us = 0, Compteur_100ms = 0;
unsigned char Valeur;
//-------- UART
unsigned char tmp, Time_out, RSSI ;
//#################################################################################################
//----------------------- INTERRUPTION -----------------------------
void interrupt(){
//------------------ IOC ------------------------
if (IOCIF_bit)
{
IOCAF = 0; // RAZ des interruptions
TMR0 = 56; // je RAZ le timer a chaque activation
Compteur_100us = 0; //car on ne sait pas exactemetn quand il s'est arreté
TMR0IF_bit = 0 ;
Pulse = 1; // J'active la sortie
TMR0IE_bit = 1; // J'active la tempo pour le temps_ON
}
//------------------ TIMER 0 : 100µs ------------------------
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 56;
Compteur_100us++;
if (Compteur_100us >= Temps_ON-1)
{
Compteur_100us = 0;
Pulse = 0;
TMR0IE_bit = 0;
}
}
}
/*#################################################################################################
################################ MAIN #######################################
#################################################################################################*/
void main(){
ANSELA = 0b00000000; // Lecture analogique tout en OFF
TRISA.B1 = 1; // RA1 en entrée(BP)
TRISA.B0 = 0; // LED_orange en sortie
TRISA.B2 = 0; // Pulse en sortie
OPTION_REG.B7 = 0; // Active les pull up individuelles
WPUA = 0b00000010; // Active les pull up sur RA1 pour BP
RXDTSEL_bit = 1; // RX_UArt sur RA5
TXCKSEL_bit = 1; // TX_Uart sur RA4
// ----- OSCILLATEUR
OSCCON = 0b01110010; // réglage de l'Oscillateur à 8Mhz (P.53)
//------------ Initialisation UART ----------
UART1_Init(115200);
delay_ms(10);
TRISA.B0 = 0; // LED_orange en sortie
//------------ IOC ----------
IOCAP = 0b00001000; // front montant sur RA3
IOCIE_bit = 0 ; // Interrupt-on-Change Enable bit
//------------ TIMER 1 : 100uS ---------------
T1CON = 0x21;
TMR1IF_bit = 0;
TMR1H = 0x3C;
TMR1L = 0xB0;
TMR1IE_bit = 0;
//------------ TIMER 0 : 10mS ---------------
OPTION_REG = 0x08;
TMR0 = 56;
TMR0IE_bit = 0;
//------------ Interruption ----------
PEIE_bit = 1;
RCIE_bit = 1;
RCIF_bit = 0;
GIE_bit = 1;
Etat_Lampe = Off;
Pulse = 0 ;
Temps_ON = 30;
F_appui_bref = 0;
F_appui_long = 0;
/*#################################################################################################
################################ BOUCLE PRINCIPALE #######################################
#################################################################################################*/
while (1){
if ( F_appui_bref == 1)
{
F_appui_bref = 0;
Etat_Lampe = ~Etat_Lampe;
if (Etat_Lampe == On)
{
IOCIE_bit = 1;
}
else
{
IOCIE_bit = 0;
}
}
if ( BP_PIC == 0) asm reset;
}
}
Merci à tous

