Bonjour à vous,
Ca faisait longtemps que ma connexion a Elektor ne faisait plus, mais en me remettant gentillement à la programmation... c'est tout naturellement que je reviens vers vous....
Je recommence à nouveau avec le DSPic33FJ256... J'ai repris la ou je m'étais arrêter :
- faire déplacer un clignotement de l'aide à l'aide d'un bouton poussoir (OK)
- ré-implémenter un script d'anti-rebond au niveau des touches, (OK)...
--> mais alors qu'est-ce qui cloche ???
C'est au niveau du Timer que j'ai configuré, j'aimerais avoir une interruption toutes les 5ms, donc j'ai fait mes différents calculs selon les configurations de l'oscillateur et du Timer1, et la je me retrouve avec le clignotement du programme précédent (clignotement de ma led qui ne change pas), et je n'arrive pas à comprendre ce que je fais de faux, surtout que le scripte de ll'oscillateur n'a pas bougé
Je désire avoir une clock interne de 8Mhz pour cela j'ai opéré comme suis : --> voir le code ci-dessous !!!
//----------------------------------------------------------------------------------////--- nom : init_osci//--- entrée - sortie : - / - //--- description : configure l'oscillateur du DSP pour utiliser l'horloge // à 8MHz//----------------------------------------------------------------------------------//init_osci(){//--- configuration de l'oscillateur interne à 40Mhz ---//// utilisation fomrules du datasheet du DSPic33FJ256GP710A --> page 146// Fcy = Fosc / 2 ; Fosc = Fin(M/(N1 N2))// Fin = 8Mhz --> Fosc = 40Mhz --> Fcy = 40Mhz OSCCONbits.COSC = 3;// sélection de l'oscillateur XT OSCCONbits.CLKLOCK= 0;// l'horloge et la PLL peuvent être modifié CLKDIVbits.ROI= 0; // pas d'effet si il y a interruption CLKDIVbits.DOZE= 0; // pas de réduction sur l'horloge Fcy /1CLKDIVbits.DOZEN= 0; CLKDIVbits.PLLPRE = 0; // N1 = 2 CLKDIVbits.PLLPOST = 0; // N2 = 2 PLLFBDbits.PLLDIV = 38;// M = 40 __builtin_write_OSCCONH(0x03); // fonction appelant du code assembleur // configuration du registre NOSC (OSCCON) --> // 011 = Primary Oscillator with PLL (XTPLL, HSPLL, ECPLL)__builtin_write_OSCCONL(0x01);// Active la commutation de la clockwhile(OSCCONbits.COSC != 0b011); //} ensuite j'ai configuré le Timer 1 comme suis, pour les calculs de l'interrupteur voir mes commentaires : --> voir le code ci-dessous
//----------------------------------------------------------------------------------////--- nom : init_timer1//--- entrée - sortie : - / - //--- description : initilaiser le timer 1 pour avoir une horloge de 100ms //----------------------------------------------------------------------------------//void init_timer1(void){//--- registre de configuration du Timer1 ---//T1CONbits.TON = 0; // désactiver le timer pour la configuration T1CONbits.TCS = 0; // clock interne T1CONbits.TSYNC = 0; // synchroniser la clock externe T1CONbits.TCKPS = 3; // prédivseur régler à 256 --> 8Mhz/256 = 31250Hz --> 32us TMR1 = 0; // mise à zéro du registre lié au timer PR1 = 62379; // période du timer --> 5ms/32us --> 62535 - 156 = 62379 //--- registres des configurations des interruptions liées au Timer1 ---//IPC0bits.T1IP = 7; // choix de la priorité --> ici la plus élevée 7 = 111IFS0bits.T1IF = 0; // remise à zéro de l'interruption IEC0bits.T1IE = 1; // activation de l'interruption lié au Timer1 T1CONbits.TON = 1; // activer le timer1} Normalement je devrais avoir aussi un clignotement rapide puisque je le traite dans ma boucle d'interruption la gestion du clignotement des leds, mais celui-ci se fait à la meme vitesse que le programme d'avant... beuh tout triste...
Je ne comprends pas... est-ce le mode debbuggeur que j'utilise ou le code que j'implémente...
si vous avez des idées, c'est bien volontiers... je vous mets le code complet de mon main
Un tout grand merci d'encore me lire après cette si grande interruption...
Amicalement le cht'y Philou