Bonjour (ou bonsoir),
Je développe actuellement sur un Pic 18F4520 en C et je souhaiterais déclencher une interruption quand une trame se présente sur le port RC7.
Malheureusement, mon niveau de programmation en C (et sur Pic), ainsi que mon niveau en Anglais sont limités, et ne sais toujours pas comment utiliser la syntaxe malgré mes recherches. C'est la raison pour laquelle je fais appel à ceux qui voudrons bien m'aider sur le forum.
Voici déjà mon code :
/* !!! VERIFIER QUE LE FICHIER "FTOA.C" EST INCLUE AVEC LE PROGRAMME
PRINCIPAL !!! */
/* DIRECTIVES */
#include <p18f4520.h>
#include <stdlib.h>
#include <usart.h>
#include <adc.h>
#include <delays.h>
#define NB_VAL_MOY 50
#define RC7 PORTCbits.RC7
/* VARIABLES */
char str_n[30];
float valeur;
char valeur_char=0;
int valeur_int=0;
int moyenne=0;
static int tab[NB_VAL_MOY];
static char index=0;
/* FONCTION COMMANDE PC */
// C'est la fonction que je souhaite activer en interruption quand une trame se présente sur le port RC7
void CMD(void)
{
if(PIR1bits.RCIF)
{
getsUSART(valeur_char,2);
valeur_int = atoi(valeur_char);
PORTB=valeur_int;
}
}
/* FONCTION CAPTEUR DE PRESSION */
void Capteur(void)
{
while(BusyADC());
Delay100TCYx(50);
ConvertADC();
tab[index++]=ReadADC();
if(index>=NB_VAL_MOY)
{
char i;
for(i=0; i<NB_VAL_MOY; i++)
moyenne+=tab[i];
moyenne/=NB_VAL_MOY;
valeur=moyenne;
valeur=(valeur+8.520)/7.251;
ftoa(valeur, str_n, 2,'F');
putsUSART(str_n);
index=0;
}
}
/*============================= ===
===== PROGRAMME PRINCIPALE =====
============================== ==*/
void main (void)
{
TRISCbits.TRISC6=0; //TX Définit la sortie RS232
TRISCbits.TRISC7=1; //RX Définit l'entrée RS232
TRISB = 0;
PORTB = 0;
OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_BRGH_HIGH,25);
OpenADC( ADC_RIGHT_JUST & // Initialisation du CAN
ADC_4_TAD &
ADC_FOSC_32, ADC_CH1 & // CH1 pour l'entrée RA1
ADC_REF_VREFPLUS_VREFMINUS &
ADC_INT_ON, ADC_1ANA);
while(1)
{
Capteur();
if(PIR1bits.RCIF) // Si une trame est détectée sur RC7...
{
CMD(); // Actuellement, la fonction se trouve dans le void main void
}
}
}
Explication du code : En résumé, j'ai un capteur de pression qui délivre une plage de tension sur le CAN du pic.
Convertie en signal numérique, la tension est envoyée via RS232 au PC. Ce dernier me l'affiche dans une textbox (visual basic 2008) sous la forme "252 millibars", par exemple.
Le rôle du PC et de réguler une pression que j'ai définis et va donc envoyer une chaîne de caractère au Pic qui activera une pompe ou une valve de fuite en fonction de la pression affichée.
Par exemple : Si je décide qu'il faut maintenir une pression de 200millibars dans mon circuit pneumatique, et que le capteur m'indique une pression de 120millibars, le PC enverra la chaîne "01" au Pic et le port RB1 se mettra en état 1, et allumera la pompe (via un relais mécanique) pour augmenter la pression jusqu'à 200millibars comme demandé.
Le principe est le même pour allumer la valve de fuite quand il y a trop de pression dans le circuit pneumatique.
Le problème :Jusque là tout marche comme il faut. Le seul problème est que la fonction CMD(); (qui permet de récupérer les trames en provenance du PC) est inclue dans le programme principal "void main void" et me déclenche assez souvent la vanne de fuite ou la pompe sans que cela soit nécessaire, et empêche correctement la régulation.
C'est alors que j'ai pensé à activer CMD(); qu'après une interruption, c-à-d que quand le port RC7 reçoit une trame du PC, à n'importe quel moment, une interruption se fait et met en pause void main void et exécute CMD();.
Et c'est là où je ne puis continuer car j'ignore comment utiliser la syntaxe des interruptions et en choisissant le port RC7.
J'espère avoir été clair :s et vous remercie par avance de vos réponses.
Je ne pourrais répondre que demain matin, car ce soir je serais absent.
Merci bien.
-----