Bonsoir à tous,
j'ai un problème avec un programme que j'essaie de faire pour un PIC 16F628. Je cherche à mesurer la durée d'une impulsion issue d'un récepteur RC de modèle réduit (entre 1 et 2ms). En simulant dans MPLAB, çà a l'air de fonctionner en simulant un signal correspondant au signal du récepteur mais dans la vraie vie, çà ne marche pas. Auriez-vous une idée, SVP?
Le but est de décoder plusieurs voies (ici, le code n'en lit qu'une) et de m'en servir pour effectuer différentes actions (allumage leds, déclenchement d'un autre pic,...). C'est pourquoi, je ne peux pas utiliser le module capture du 628.
pinfrein=RB4, impulsfrein= état de l'impulsion à mesurer (haut ou bas), LED1= RA0
Voici le programme:
#include "INT16CXX.H"
#pragma config = 0x3D18 ////////si watchdog, 8=>C 3D18
#pragma origin 4
///////////// definition alias //////////////
//#define LED1 RA0
////////////////////////////////////////////
#define LED1 RA0
#define LED2 RA1
#define LED3 RA2
#define LED4 RA3
#define pinfrein RB4
#define pincodes RB5
#define pincligno RB6
#define pinphares RB7
////////// variables //////////////////////////
char impuls;
char impulsfrein;
int dureefrein;
char sv_PORTB;
char sv_FSR;
////////////////////////////////////////////////
///////////// interruptions ////////////////////
////////////////////////////////////////////////
static interrupt traitement()
{
int_save_registers;
if (RBIF)
{
//////////////// Mesure de la durée de l'impulsion //////////////////////////
/////////////////////////////////////////////////////////////////////////////
if (pinfrein==1 && impulsfrein==0) //RA0, etat précédent bas => front montant
{
TMR0=0;
impulsfrein=1;
}
if (pinfrein==0 && impulsfrein==1) //RA0, etat précédent haut => front descendant
{
dureefrein=TMR0; // mise en mémoire de la durée de l'impulsion pour traitement
impulsfrein=0;
}
RBIF=0;
}
int_restore_registers;
}
///////////////////////////////////////////////////
////////// Programme principal ////////////////////
///////////////////////////////////////////////////
void main (void)
{
OPTION=0b10000010; /// PRESCALER SUR 8
TRISA=0; /// PORT A EN SORTIE
TRISB=0XF0; /// B0-B3 EN SORTIE, B4-B7 EN ENTREE
PORTA=0;
PORTB=0;
RBIE=1;
RBIF=0;
GIE=1;
PEIE=1;
for(; /// ce n'est pas un smiley !!!!
{
if (dureefrein<120)
{ LED1=1;}
if (dureefrein>120)
{ LED1=0;}
}
}
Merci
A+
-----