Bonjour,
Comme indiqué dans le titre, j'ai un soucis avec mon programme. J'ai vérifié une dizaine de fois et je ne vois toujours pas ou est mon problème.
Le programme est un chenillard un peut spécial pour mon hexacopter, il y a un bouton pour les modes du chenillard et un signal PWM pour faire varier la vitesse de défilement.
PWM mini => Ton = 1ms => vitesse défilement minimale
PWM max => Ton = 2ms => vitesse défilement maximale
Programme :
Petite photo pour montrer a quoi va servir tout celaCode:/******************************************************************************************************* * Fichier: leds.c * auteur: David Lejeune * date: 09/04/2013 * but : controler leds hexa par radio (pwm) ********************************************************************************************************/ #include <p18f4520.h> /******************************************************************************************************* * Configuration des bits */ #pragma config OSC = XT // oscillateur du type quartz #pragma config WDT = OFF // pas de watchdog timer #pragma config LVP = OFF // single-supply ICSP inacticf #pragma config BOREN = OFF // brown-out reset inactif /******************************************************************************************************* * declaration des variables */ unsigned char capture; unsigned char tampon; unsigned char mode; unsigned int temps; /******************************************************************************************************* * Configuration interruption de priorité basse */ void low_isr (void); #pragma code low_vector=0x18 void interrupt_at_low_vector(void) { _asm GOTO low_isr _endasm } /******************************************************************************************************* * Programme d'interruption de priorité basse */ #pragma code /* return to the default code section */ #pragma interruptlow low_isr void low_isr (void) { if(INTCON3bits.INT1IF) // verification si INT1(RB1) est la cause de l'IT { mode = mode + 1; //Mode suivant if(mode == 6) //Retour au mode 1 si dernier mode mode = 1; INTCON3bits.INT1IF = 0; // remise à '0' du flag INT1IF } else { // si pas INT1 (RB1) alors rien Nop(); } } /******************************************************************************************************* * Configuration interruption de priorité haute */ void high_isr (void); #pragma code high_vector=0x08 void interrupt_at_high_vector(void) { _asm GOTO high_isr _endasm } /******************************************************************************************************* * Programme d'interruption de priorité haute */ #pragma code /* return to the default code section */ #pragma interrupt high_isr void high_isr (void) { if(INTCONbits.INT0IF) // verification si INT0(RB0) est la cause de l'IT { if(capture == 1) //Si capture en cours { T0CONbits.TMR0ON = 0; //Arrêt comptage du timer0 tampon = TMR0L; //Récuperation valeur temps = TMR0H; temps = temps<<8; temps = temps | tampon; temps = temps - 1000; INTCON2bits.INTEDG0=1; //Interruption sur front montant capture = 0; //Indication capture terminée } else { T0CONbits.TMR0ON = 1; // Début comptage timer0 INTCON2bits.INTEDG0=0; //Interruption sur front descendant capture = 1; //Indication capture en cours } INTCONbits.INT0IF = 0; // remise à '0' du flag INT0IF } else { // si pas INT0 (RB0) alors rien Nop(); } } /******************************************************************************************************* * Programmme principal */ #pragma code void tempo(char delais,int temps) { int j=0; for( j=0 ; j<temps ; j++ ) { Delay100TCYx(delais); } } void main (void) { TRISC = 0xFF; //Port C en entrée TRISB = 0xFF; //Port B en entrée TRISA = 0x3F; //Port A en sortie ADCON1 = 0x0F; //0 entrées analogiques T0CON = 0b00011000; TMR0H = 0x00; TMR0L = 0x00; INTCONbits.TMR0IF = 0; RCONbits.IPEN = 1; //...diverses initialisations INTCONbits.INT0IF = 0; INTCON3bits.INT1IF = 0; INTCON2bits.INTEDG0 = 1; INTCON2bits.INTEDG1 = 0; INTCONbits.GIE = 1; INTCONbits.INT0IE = 1; INTCON3bits.INT1IE = 1; mode = 1; capture = 0; while (1) { if(mode == 1) // Mode 1 { PORTA = 0x03; tempo(20, temps); PORTA = 0x00; tempo(20, temps); PORTA = 0x03; tempo(20, temps); PORTA = 0x00; tempo(50, temps); PORTA = 0x3C; tempo(20, temps); PORTA = 0x00; tempo(20, temps); PORTA = 0x3C; tempo(20, temps); PORTA = 0x00; tempo(50, temps); } if(mode == 2) // Mode 2 { PORTA = 0x01; tempo(25, temps); PORTA = 0x02; tempo(25, temps); PORTA = 0x04; tempo(25, temps); PORTA = 0x08; tempo(25, temps); PORTA = 0x10; tempo(25, temps); PORTA = 0x20; tempo(25, temps); } if(mode == 3) // Mode 3 { PORTA = 0x20; tempo(25, temps); PORTA = 0x10; tempo(25, temps); PORTA = 0x08; tempo(25, temps); PORTA = 0x04; tempo(25, temps); PORTA = 0x02; tempo(25, temps); PORTA = 0x01; tempo(25, temps); } if(mode == 4) // Mode 4 { PORTA = 0x02; tempo(25, temps); PORTA = 0x04; tempo(25, temps); PORTA = 0x08; tempo(25, temps); PORTA = 0x10; tempo(25, temps); PORTA = 0x20; tempo(25, temps); PORTA = 0x01; tempo(25, temps); PORTA = 0x20; tempo(25, temps); PORTA = 0x10; tempo(25, temps); PORTA = 0x08; tempo(25, temps); PORTA = 0x04; tempo(25, temps); } if(mode == 5) // Mode 5 { PORTA = 0x03; tempo(25, temps); PORTA = 0x24; tempo(25, temps); PORTA = 0x18; tempo(25, temps); } } }
-----