Bonsoir à tous,
j'étudie en ce moment le comparateur du pic 16F628. Mon but est de détecter le dépassement d'un seuil de tension (feedback d'une conso de moteur) et de faire un traitement (arrêt moteur).
La comparaison se passe bien, car j'ai bien allumage des leds mises pour test aux sorties des comparateur. Mon problème, c'est qu'il n'y a pas génération de l'interruption. Lorsque je regarde le bit CMIF dans le registre PIR1, celui-ci ne passe jamais à 1, alors que la sortie du comparateur fonctionne bien. Pourtant dans mon programme, j'ai mis à "1" les bits GIE et PEIE du registre INTCON et le bit CMIE du registre PIE1.
Je précise que j'ai utilisé le simulateur "real pic simulator" pour les tests parce que je ne maitrise pas assez le debugger de Mplab et que je ne sais pas comment appliquer des valeurs analogiques aux entrées considérées. J'ai également charger le prog dans mon pic "pour voir" mais le résultat n'est pas meilleur.
Voici mon programme de test en C:
// programme commande servo
#include "int16CXX.h"
#pragma config = 0x3D38
#define UREF RA2 // doit être configuré en entrée
#define UMOT1 RA0 // doit être configuré en entrée
#define UMOT2 RA1 // doit être configuré en entrée
#define led RB4
#define cdemot1 RB1 //brancher une led pour test
#define cdemot2 RB2 //brancher une led pour test
#pragma origin 4;
// Traitement des interruptions
static interrupt mouvement()
{
int_save_registers;
if (CMIF)
{
//CMIF = 0; //réinit int flag comparateur pour libérer si l'autre moteur bloque
if (C1OUT==1){cdemot1 = 1; }
if (C2OUT==1) {cdemot2 = 1;}
}
INTF = 0; /// réinit interruption flag général
int_restore_registers;
}
void delay_ms( uns16 millisec)
// Delays a multiple of 1 milliseconds at 4 MHz
// using the TMR0 timer
{
char next = 0;
OPTION = 2; // prescaler divide TMR0 rate by 8
TMR0 = 2; // deduct 2*8 fixed instruction cycles delay
do {
next += 125;
clrwdt(); // needed only if watchdog is enabled
while (TMR0 != next) // 125 * 8 = 1000 (= 1 ms)
;
} while ( -- millisec != 0);
}
void main (void)
{
// initialisation du pic
GIE=0; // desactivation des interruptions pour init
CMCON = 0x06; //config comparateur 2comp (ra0ra1) 1ref(ra2) avec sorties
PORTA =0x00;
TRISA = 0b00000111; // RA0,1,2 en entrée et le reste en sortie
PORTB=0x00; //
TRISB =0x00; // port B en sortie
// execution programme principal
OPTION=0b01000000;
//// config comparateur ////
PIE1=0b01000000;
CMCON = 0x06; //config comparateur 2comp (ra0ra1) 1ref(ra2)
CMIF = 0; //init copmparator flag
CMIE = 1; //interruptions comparateur possibles registre PIE1
PEIE = 1; //interruptions périphériques possibles registre INTCON
GIE = 1; //interruptions générales activées registre INTCON
//// clignotement led pour verif fonctionnement
for (; {
led=1;
delay_ms(500);
led=0;
delay_ms(500); }
}
-----