Bonjour,
Je sollicite (encore) l'aide de connaisseurs en programmation de ucontrôleurs. Alors voilà, mon problème est le suivant. Je programme un dsPIC33FJ256GP710A monté sur une carte explorer 16 pour un stage. Mon algorithme est quasiment finalisé, avec ADC, UART, affichage LCD, mais surtout timers 3, 4 et 7.
Et le problème vient de ces derniers. En effet, je veux qu'ils tournent à 10 kHz. Mais en fonction des calculs qui s'y trouvent, leur fréquence tend à diminuer et je dois alors la réajuster en diminuant la période dans le registre associé. Mais cela ne paraît pas très correct étant donnant qu'après cela la formule donnée dans la datasheet pour déterminer la période du timer en fonction du prédiviseur et du temps de cycle du MCU n'est plus correcte. Je contourne le problème mais je ne le comprend pas. Selon moi ça doit venir des timers car à priori quand je faisais les mêmes calculs dans le main, cadencés par un flag mis à 1 par le timer, je n'avais plus ce problème et les calculs se faisaient correctement à 10kHz.
Pour info je vérifie les fréquences avec des LAT=~LAT. Si j'enlève un LAT=~LAT d'un timer je constate que la fréquence de l'autre timer augmente (à priori celle des deux timers mais je ne peux plus vérifier cela sur le premier timer sans LAT=~LAT). C'est comme si je lui demandais trop de calculs mais pourtant j'ai optimisé et pour une fréquence de 10 kHz ça ne me paraît pas très lourd. Je vous laisse le code du timer 3, dans lequel je fais un pseudo-calcul RMS, qui est sûrement plus "lourd" que l'algorithme du timer 4 dans lequel je fais seulement des comparaisons "if". Ce "calcul" RMS comporte une soustraction, une addition, une multiplication et le décalage d'un tableau de 28 cases, tout cela sur des "long". Ce n'est donc vraiment pas lourd en calcul selon moi. Je vous laisse aussi la fonction d'initialisation du timer 3 et celle de l'oscillateur. En revanche, je ne pourrai pas montrer certaines parties du programmes pour des raisons de confidentialité !
De plus, mon collègues stagiaire a eu des problèmes similaires même avec un dspic différent de celui que j'utilise, mais avec une structure très proche notamment dans la configuration des timer et de l'oscillateur.
J'espère avoir été assez clair, sinon n'hésitez pas ! Merci d'avance de votre aide
Alexis
Code:void init_osci(void) { //--- configuration of internal oscillator at 40Mhz ---// // DSPic33FJ256GP710A datasheet --> page 146 // Fcy = Fosc / 2 ; Fosc = Fin(M/(N1 N2)) // Fin = 8Mhz --> Fosc = 80Mhz --> Fcy = 40Mhz CLKDIVbits.PLLPRE = 0; // N1 = 2 CLKDIVbits.PLLPOST = 0; // N2 = 2 PLLFBDbits.PLLDIV = 38; // M = 40 __builtin_write_OSCCONH(0x03); // assembly code __builtin_write_OSCCONL(0x01); // clock commutation while(OSCCONbits.COSC != 0b011); while(OSCCONbits.LOCK!= 1) {}; // Wait for PLL to lock } void __attribute__((interrupt,no_auto_psv)) _T3Interrupt( void ) { IFS0bits.T3IF = 0; // remise à zéor du flag d'interruption AD1CON1 = 0x84E4; /* Force bits 4-7 for automatic sampling */ t_counter++; if (t_counter>=10000) {t_total++; t_counter=0;} t_trip++; _LATA1=~_LATA1; RMS(); TMR3 = 0; T3CONbits.TON = 1; // activer à nouveau le Timer } void init_timer3(void) { T3CONbits.TON = 0; // desactivate timer 3 during configuration T3CONbits.TCS = 0; T3CONbits.TCKPS =0 ; TMR3 = 0; PR3 = 3332; //--- registres des configurations des interruptions liées au Timer3 ---// _T3IP = 5; // interrupt priority _T3IF = 0; // initialize flag _T3IE = 1; // enable interruption T3CONbits.TON = 1; // activate timer3 }
-----