Bonjour,
J'utilise en ce moment dans un projet un pic18f4520 sur MPlab X.
Dans le programme, j'utilise les 3 interruptions du pic ainsi que 2 timers, le 0 et le 2.
Pour le moment j'ai désactivé le timer0 et je baisse uniquement les flags pour chaque interruptions ( pas encore testé)
Donc pour le moment je cherche juste à faire un timer de 4ms.
Le probleme est que lorsque je fait tourner le programme, le flag ne se baisse pas.
voici mon code
Impossible de trouver d'où peux venir le probleme... Il y aurait il un rapport avec la fréquence ? j'utilise l'ocsillo interne + pll pour avoir 32 MHzCode:/* * File: newmain.c * Author: asus * * Created on 12 mai 2017, 09:30 */ #include <xc.h> #include <stdlib.h> #include <stdio.h> #include <pic18f4520.h> #pragma config OSC = INTIO67 #pragma config WDT = OFF #define _XTAL_FREQ 32000000 void main (void) { OSCCON|=0x70; // oscillo intern à 8 Mhz OSCTUNE=0x4F; // Utilisaion de la PLL ->*4 = 32Mhz //Init PORTA TRISA=0x0B; //Init PORTE TRISE=TRISE&0xF8; PORTE=0x00; //Init PORTD TRISD=0x00; PORTD=0x00; LATE=0x00; TRISA=0x00; PORTA=0x0A; //Initialistation timer0 INTCON|=0x20; INTCON&=0x3B; INTCON2|=0xFB; T0CON=0x03; TMR0H=0xC2; TMR0L=0xF6; T0CONbits.TMR0ON=0; INTCONbits.TMR0IF=0; //Initialistation timer2 T2CON=(T2CON&0xFB)|0x7A; TMR2=156; PIR1&=0xFD; PIE1|=0x02; IPR1&=0xFD; //Initialistation interruption0 INTCON&=0x2D; //Initialistation interruption1 INTCON&=0x3F; //inutile car déjà dans int0 INTCON3|=0x40; INTCON3&=0xF6; //Initialistation interruption2 INTCON&=0x3F; // inutile car déjà dans int0 INTCON3|=0x80; INTCON3&=0xED; INTCON2=(INTCON2|0x40)&0xCF; // front des interruptions //INTCON3&=0xE7; // eteindre interrupt du capteur pour le moment //Deverouillage INTCON|=0x10; INTCON3|=0x18; RCON|=0x80; INTCON|=0xC0; T2CON|=0x04; while(1) { } } /********************************************************************************/ /* Mise en place des routines d'interruptions hautes et basses */ /****************************************************²****************************/ void interrupt tc_int(void) // High priority interrupt { if(INTCON3&0x01) // si flag du A { INTCON3&=0xFE; // je baisse le flag } if(INTCON3&0x02) // Meme fonctionnement que pour A { INTCON3&=0xFD; } if(INTCON&0x02) // Flag d'interruption sur retournement du sablier { INTCON&=0xFD; // on baisse le flag } } void interrupt low_priority LowIsr(void) //Low priority interrupt { if(PIR1&0x02) // si flag sur interruption de 20ms { PIR1bits.TMR2IF=0; // on rebaisse le flag TMR2=156; } if(INTCON&=0x20) // flag signalant que le % de luminosité de la ligne modulé est atteint. { INTCON&=0xDF; // Baisse du flag } }
Merci pour votre aide
-----