Salut!
J'ai réalisé un petit programme en C sous MPLAB avec le compilateur MCC18. En gros, ça envoie les valeurs sur 8 bits représentant l'état des potentiomètres via I2C. Enfin... Cela devrait. En simulation sous ISIS, aucun problème, c'est le monde des Bisounours. Par contre dans la vraie vie, c'est autre chose! Mon programme démarre, rentre une seule et unique fois dans la routine d'interruption, et continue son chemin (autrement dit ne fait plus rien, voir programme).
Si quelqu'un a un une idée sur ce qu'il y a, je suis preneur. Merci!Code:#include <p18F4553.h> #pragma config PLLDIV = 5 #pragma config FOSC = HS #define ADRESSE_SLAVE 0b01001110 typedef enum {POTENTIOMETRES, CMD_SERIE} mode; mode mode_actuel = POTENTIOMETRES; void interruptions_hautes(void); void interruptions_basses(void); char duties[4] = {0x00, 0x33, 0x99, 0xFF}; char etat_I2C = 1, etat_ADC = 0; void main(void) { // Déclaration et initialisation des variables char i; // Configuration des interruptions RCONbits.IPEN = 1; // Priorités activées INTCONbits.GIEH = 1; // Interruptions hautes activées INTCONbits.GIEL = 1; // Interruptions basses activées // Initialisation du SSP pour I2C TRISBbits.TRISB0 = 1; TRISBbits.TRISB1 = 1; SSPCON1bits.SSPEN = 1; SSPCON1bits.SSPM3 = 1; // Mode maître SSPCON1bits.SSPM2 = 0; SSPCON1bits.SSPM1 = 0; SSPCON1bits.SSPM0 = 0; SSPADD = 0x31; // Baud rate : 100kHz IPR1bits.SSPIP = 0; // MSSP génère des interruptions non prioritaires PIE1bits.SSPIE = 1; // Interruptions MSSP activées SSPCON2bits.SEN = 1; // Initialisation de l'ADC ADCON1 = 0b00001011; // Références VDD VSS, AD3 - AD0 analogiques, autres digital TRISA |= 0b00001111; // Pins analogiques en entrée ADCON2 = 0b00111101; // Tacq = 20 Tad / Conversion clock = Tosc/16 ADCON0bits.ADON = 1; // Démarrage de l'ADC ADCON0 = 0b00000011; // Lancement première conversion while(1) { } } #pragma code low_vector=0x18 void low_interrupt(void) { _asm GOTO interruptions_basses _endasm } #pragma code high_vector=0x08 void high_interrupt(void) { _asm GOTO interruptions_hautes _endasm } #pragma code #pragma interrupt interruptions_hautes void interruptions_hautes(void) { } #pragma interruptlow interruptions_basses void interruptions_basses(void) { if(PIR1bits.SSPIF == 1) { switch(etat_I2C) { case 0: SSPCON2bits.SEN = 1; break; case 1: SSPBUF = ADRESSE_SLAVE; break; case 2: SSPBUF = duties[0]; break; case 3: SSPBUF = duties[1]; break; case 4: SSPBUF = duties[2]; break; case 5: SSPBUF = duties[3]; break; case 6: SSPCON2bits.PEN = 1; break; default: etat_I2C = 6; break; } if(etat_I2C != 6) etat_I2C++; else etat_I2C = 0; PIR1bits.SSPIF = 0; // Flag à effacer par soft } if(PIR1bits.ADIF == 1 && mode_actuel == POTENTIOMETRES) { switch(etat_ADC) { case 0: duties[0] = ADRESH; ADCON0 = 0b00000111; break; case 1: duties[1] = ADRESH; ADCON0 = 0b00001011; break; case 2: duties[2] = ADRESH; ADCON0 = 0b00001111; break; case 3: duties[3] = ADRESH; ADCON0 = 0b00000011; break; default: etat_ADC = 0; break; } if(etat_ADC == 3) etat_ADC = 0; else etat_ADC++; PIR1bits.ADIF = 0; } }
-----