Bonjour à tous,
J'ai une petite énigme pour vous, je suis en train de programmer un PIC 18F4550 en version DIL40 et ce dernier me fait une petite blague : je m'arrache les cheveux. Pour faire simple, l'objectif du code est de détecter un niveau haut sur une ou plusieurs des broches et d'acquitter la réception de ce niveau haut sur une unique broche A0. Mon code indique que le niveau reste haut sur A0 le temps ou le niveau haut est détecté sur l'autre broche mais, et c'est la qu'on rigole, le code ne fonctionne que pour le registre B, pour le registre C, le niveau haut est bien détecté mais la broche A0 reste dans son état haut bien après l'arrêt de la tension sur l'autre broche.
Voici le code :
Pragma config :
#pragma config FOSC = HS // Mode oscillateur
#pragma config MCLRE = ON //activer la pin de Reset
#pragma config LVP = OFF //Low Voltage Programming désactivé => RB5 I/O normale
#pragma config PBADEN = OFF //PORTB<4> and PORTB<1:0> Configured as Digital I/O Pins on Reset
#pragma config DEBUG = OFF //débug désactivé => RB6 et RB7 normal I/O
#pragma config FCMEN = OFF //Fail-Safe Clock désactivée
#pragma config IESO = OFF //Oscillator Switchover mode désactivé
#pragma config PWRT = OFF //Power-up Timer désactivé
#pragma config BOR = OFF //Reset dû a une tension trop basse désactivé
#pragma config BORV = 2 //Brown-out Reset Voltage
#pragma config WDT = OFF //Watchdog désactivé
#pragma config WDTPS = 1024 //prédiviseur du watchdog
#pragma config LPT1OSC = OFF //Low-Power Timer 1 Oscillator Disable ==> high power
#pragma config XINST = OFF //Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
#pragma config STVREN = ON //pas de reset du à la pile
#pragma config CP1 = OFF // block 1 not code-protected
#pragma config CPB = OFF // boot block not code-protected
#pragma config VREGEN = OFF //3,3v regulator enabled for the USB port
#pragma config PBADEN = OFF
#pragma config CCP2MX = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
Le main :
int main(int argc, char** argv) {
config();
/**/
for(;{
identification_commande ();
}
return (EXIT_SUCCESS);
}
Le contenu de la fonction config() :
TRISA = 0b00000000;
TRISB = 0b11100000;
TRISC = 0b11111111;
TRISD = 0b00000000;
TRISE = 0b0111;
/*Mise à zéro des ports à l'initialisation*/
PORTA = 0x00;
PORTB = 0b00010000; /*Le port 10 du // fonctionne en logique inversée*/
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
/*Désactivation des convertisseurs A/N*/
ADCON1=0x0F;
Et pour finir le contenu de la fonction identification_commande() :
PORTAbits.RA0 = 0; // Remplacer par PORTBbits.RB6 = 0;
if (PORTBbits.RB0 == 1 && PORTBbits.RB1 == 1){
/*On acquite la commande*/
PORTAbits.RA0 = 1; // remplacer par PORTBbits.RB6 = 1;
/*Lancement de la commande*/
// balance_a_imprimante();
} else {
PORTAbits.RA0 = 0; // remplacer par PORTBbits.RB6 = 0;
if (PORTBbits.RB0 == 1){
/*On acquite la commande*/
PORTAbits.RA0 = 1; // remplacer par PORTBbits.RB6 = 1;
/*Lancement de la commande*/
//fournir_enveloppe();
}else {
PORTAbits.RA0 = 0; // remplacer par PORTBbits.RB6 = 0;
if (PORTBbits.RB1 == 1){
/*On acquite la commande*/
PORTAbits.RA0 = 1; // remplacer par PORTBbits.RB6 = 1;
/*Lancement de la commande*/
// enveloppe_a_balance();
} else {
PORTAbits.RA0 = 0; // remplacer par PORTBbits.RB6 = 0;
if (PORTCbits.RC7 == 1){
/*On acquite la commande*/
PORTAbits.RA0 = 1; // remplacer par PORTBbits.RB6 = 1;
/*Lancement de la commande*/
// positionner_enveloppe();
} else {
PORTAbits.RA0 = 0; // remplacer par PORTBbits.RB6 = 0;
if (PORTBbits.RB2 == 1){
/*On acquite la commande*/
PORTAbits.RA0 = 1; // remplacer par PORTBbits.RB6 = 1;
/*Lancement de la commande*/
// rendre_enveloppe();
}
}
}
}
Pour illustrer mon propos, c'est dans le cas ou RC7 == 1 que ma broche RA0 reste au niveau haut trop longtemps. (La mention remplacer par RB6 vient juste du fait que j'ai collé la diode test sur RA0 comme un imbécile plutôt que sur RB6...)
Des idées ?
Merci pour votre aide dans tous les cas !
Greg
-----