Soucis de configuration pour DSPic33FJ256GP710

Postby bovix » Fri Oct 26, 2012 12:00 am

Bonjour à tous,

Je viens vers vous à nouveau (sorry pour toutes ces questions, le petit philou pas très fute fute :~) pour des soucis avec un DSPic et la carte Explorer 16 que je viens d’acquérir.

La carte fonctionne puisque le code démo fonctionne sur la carte, j'ai meme modifié juste l'affichage pour voir si tout était en ordre au niveau de la compilation --> Ok

Petites infos sur le matériel utilisé :
1x Carte explorer 16 avec un DSPic33FJ256GP710
IDE : Mplab 8.76 avec compilateur C30

Mon problème c'est que je ne suis pas sur de bien configurer mes différents fusibles, voir mes différents registres pour la partie oscillateur ; donc c'est pour cela que j'ai besoin d'un coup de main de gens experts en la matière... vous

Jai repris les codes fournis dans le code démo pour la gestion de l'affichage, voir fichiers en annexe : lcd.c/h et delay.c/h

Ce que j'aimerai faire c'est d'avoir une horloge (fréquence de cycle de 40Mhz) avec une horloge externe 8Mhz, en utilisant justement la PLL du PIC
En suivant la doc de chez microchip avec ces différentes sections, j'ai essayé de configurer mes registres pour l'oscillateur,... tout compile --> cool, mais quand j’implémente le code sur la carte c'est tout de suite moi cool...

Au lieu d'avoir un affichage instantané, je me retrouve avec une affichage qui affichage caractère par caractère à la minute et encore je suis gentil, donc je pense que je ne dois pas bien configurer mes registres.

Je vous mets en annexe, le tout est zipé :
Mon code (main) + code de l'affichage

+ dans un notre zip la doc de chez microchip

en tout cas je vous remercie déjà de me lire et si vous avez la moindre infos pour me dépatouiller c'est encore mieux que mieux... Par avance un grand MERCI

Amicalement le cht'y Philou'
Attachments
codes.zip
(6.48 KiB) Downloaded 89 times
doc-mircochip.zip
(5.59 MiB) Downloaded 94 times
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Sat Oct 27, 2012 12:00 am

Bonsoir à tous,

Je reviens vers vous peut-être pour une meilleure compréhension du problème.

Problème : comment bien configurer les fusibles et les registres liés à l'oscillateur du DSPic ???

Si dessous ma configuration des fusibles pour indiquer que j'aimerai travailler avec l'oscillateur externe qui est un quartz de 8MHz branché sur la carte Explorer 16, ainsi que d'activé la PLL du DSpic, et ne pas activer le watchdog

voici la doc en pdf pour la carte explorer 16 : PDF Carte Explorer 16
voici la doc du Dspic que j'utilise (DSPic 33FJ256GP710A) : PDF dspic 33FJ

Apparement j'ai écris la même chose que sur le code démo fourni avec la carte, mais bon si vous voyez un truc qui vous choque dites-le moi...

//----------------------------------------------------------------------------////--- Configuration des fusibles ---////----------------------------------------------------------------------------////--- Choix du type d'oscillateur ---//_FOSCSEL(FNOSC_PRIPLL); // choix oscillateur à quartz //--- Configuration de l'oscillateur ---// // Pas d'acivation au niveau contrôle du l'oscillateur // Ne pas activer la PIN OSC2 en mode IN/OUT // Choix de l'oscillateur XT --> < 20MHz _FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT); //--- Configuration du Watchdog ---//_FWDT(FWDTEN_OFF); 


Ensuite, je me suis attaqué la partie configuration des registres liés à l'oscillateur, c'est-là que je bloque plus, car je ne suis pas du tout sur si la configuration que j'applique, et celle que j'aimerai. En gros j'aimerai avoir une fréquence d'oscillation (interne au dspic de 40MHz, selon la doc c'est possible... :kez_13: )

je vous mets aussi le lien spécifique à la partie oscillateur : Oscillateur DSPic

void init_oscillateur(void){//--- 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 = 80Mhz --> Fcy = 40Mhz OSCCONbits.COSC = 0x03;// 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 = 0x00; // N1 = 2        CLKDIVbits.PLLPOST = 0x00; // N2 = 2 PLLFBDbits.PLLDIV = 0x28;// M = 40  }


La je patoge plus, je m'enfonce dans la semoule... donc vous avez la moindre suggestion, j'en serai ravis

Amicalement le cht'y Philou'
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Mon Nov 12, 2012 12:00 am

Bonsoir à tous,

je viens encore à vous... je me replonge sur le DSPic avec un programme simple on va dire : faire clignoter une led à l'aide d'un timer (timer1) qui doit me créer une interruption toutes les 500ms, je crois que la configuration de celui-ci et des fusibles n'ont pas posé de problèmes, enfin on verra plus tard si la led clignote

Ma question cette fois-ci est plus générale : dans le datasheet du composant (PDF_DSPIC 33Fxxx) page 163 - chapitre 11, on parle de la configuration des entrées - sorties avec les différents registres...

J'ai compris que le registre TRISx permet de définir soit les pins en entrée ou en sortie, ca c'est ok (1: entrée - 0: sortie), maintenant on a 2 registres PORTx et LATx. De ce que je comprends c'est que le registre LATx permet de lire ou d'écrire une valeur logique, tandis que le registre PORTx lui permet de lire ou écrire une valeur (tension) que nous avons sur la pin... Premièrement avez-vous compris la même chose ? deuxièment : si je veux allumer ou éteindre ma la led j'utilise quel registre ?

Je dois dire que j'ai pas bien compris la différence
Alors comme d'hab, si vous avez des suggestions, remarques, liens ou autres, je me ferai un plaisir de vous lire :wub:

Amicalement le cht'y Philou'
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Wed Nov 21, 2012 12:00 am

Bonjour à tous

c'est encore moi...
là je plante vraiment... j'ai écris mon code complet pour faire clignoter une led sous interruption (que vous trouverez en annexe), j'ai la configuration du timer1 pour une interruption toutes les 500ms et dans cette interruption lié à ce timer je fais mon changement d'état par rapport à la led... ca compile, super Mais quand je veux passez en mode debuuger avec le ICD3, pas de clignotement, il ny a pas de passage dans ma fonction d'interruption ne fait... Je peux pleurer là...

Je suis vraiment perdu, car j'ai regardé avec les codes exemples donnés par Microchip, je ne vois pas ce que j'ai fait de faut... alors je demande avis aux expert...

Amicalement le cht'y Philou'
Attachments
main.2.c
(4.32 KiB) Downloaded 100 times
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Tue Dec 18, 2012 12:00 am

Bonjour à tous,

Merci à tous pour le suivi de cette discussion...
c'est bon j'ai réussi à faire clignoter ma led (waaouhhh, pfff)

Bref, j'ai réussi à comprendre mon erreur, en m'inspirant d'un code fourni par Microchip (suite à une suggestion avec un membre d'un autre forum) --> voir le site de microchip, plus précisément le code CE143...

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en024679

jai testé le code démo, celui-ci fonctionnait (heureusement)...
j'ai mis un moment pour comparer la différence avec le mien (code), l'erreur que j'ai commise se trouvait dans la configuration du Timer1 avec le registre T1CON et le bit TCS, qui permet de sélectionner soit la clock interne, soit la clock externe, et j'ai bien sur choisi la clock externe + j'ai "oublié" des appels de routines en assembleur (bon j'ai pas tout compris) que j'ai rajouté dans la partie de la configuration de l'oscillateur

voici ci-dessous les debout de code que j'ai du modifier

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 = 49910;  // période du timer --> 500ms/32us --> 62535 - 15625 = 49910        //--- registres des configurations des interruptions liées au Timer1 ---//        IPC0bits.T1IP = 7;   // choix de la priorité --> ici la plus élevée 7 = 111        IFS0bits.T1IF = 0;   // remise à zéro de l'interruption         IEC0bits.T1IE = 1;  // activation de l'interruption lié au Timer1         T1CONbits.TON = 1;  // activer le timer1}


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 = 16Mhz --> Fcy = 8Mhz         //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 /1        //CLKDIVbits.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 clock        while(OSCCONbits.COSC != 0b011);        //}


La prochaine étapes, c'est à l'aide d'un bouton poussoir, de faire déplacer le clignotement sur la rangée de LEDs

A tout bientôt pour de nouveau problèmes

Amicalement philou

PS : je mets le code complet si ca peut aider
Attachments
main2.c.txt
(5.9 KiB) Downloaded 85 times
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Thu Jun 06, 2013 12:00 am

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
Attachments
main2.txt
(9.19 KiB) Downloaded 88 times
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby fablab » Tue Jun 11, 2013 12:00 am

salut bovix .

woufff il y a un mode fous sur ce fil de discution !!!
fablab
 
Posts: 179
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Tue Jun 25, 2013 12:00 am

Hello Fab,

ou oui, mais le fait de poser ma question, me permet de repenser différemment mon problème, donc des fois ca marche et j'arrive à résoudre seule mon soucis... et des fois ca bloque....

Mais si cela peut aider des personnes.... ben j'aurai apporté ma petit pierre à l'édifice Elektoriens

Amicalement le chty Philou'
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Wed Jul 31, 2013 12:00 am

Bonsoir à tous,

Je reviens sur mon problème (aie aie aie)...

Mais non c'est pas pour une nouvelle question, c'est pour une solution !!!

Grace à un autre forum, la personne m'a aiguillé sur mon erreur --> c'est au niveau du timer que le problème se trouvais.
La valeur calculée qui était juste (oui oui), je la soustrayais de la valeur globale du timer, eh non pas juste il faut donner la valeur brut ... :

PR1 = 781;    // période du timer --> 5ms/6.4us = 781.25 = 781 


Voili Voilou
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Postby bovix » Mon Oct 07, 2013 12:00 am

Bonsoir à tous,

Je viens à nouveau vers vous pour exposer un petit problème, mais qui me gâche grandement mon développement...
Toujours sur le DSPic de Microchip, je m'essaie à configurer les différents registres liés à l'ADC, et ainsi que la routine d'interruption lié à celui-ci, mais lors de l'exécution la routine d'interruption n'est jamais exécutée.

J'ai lu en partie la section 16 concernant l'ADC, sans utiliser le DMA (section ADC)

Voici ma configu concernant mes registres :
void init_adc(){//--- gestion des registres liés au ADC ---////--- mode d'échantillonage --> bit 2 ---// AD1CON1bits.SAMP = 0;AD1CON1bits.ASAM = 1; // converstion après la dernière converstion  //--- choix de l'échantillonage --> bit 3 --// AD1CON1bits.SIMSAM = 0; // ici qu'un seul canal //--- Choix de la source pour le temps d'échantillonage (clock) --> bit 5 à 7 ---// AD1CON1bits.SSRC = 0; // 0b111 = 7 --> Counter interne Automatic Trigger  //--- Choix du format pour le buffer --> bit 8 à 9 ---// AD1CON1bits.FORM = 0; // format Unsigned Interger (0 - 1023 or 0 - 4095) //--- Choix du type de convertion (12/10 bits) -->bit 10 du registre ---//AD1CON1bits.AD12B = 0; // convertisseur sur 10 bits --> 0 // convertisseur sur 12 bits --> 1//--- Configuration de la vitesse de l'interruption après échnatillonnage --> bit 2 à 5 ---// AD1CON2bits.SMPI = 0;// genère une interrruption après échantillonnage  //--- Choix des canaux (simple - deux - multiple) --> 2 bits de 8 et 9 ---//AD1CON2bits.CHPS = 0; // seulement un chanal = CH0//--- Choix de la référence des tension --> 3x bits de 13 à 15 ---//AD1CON2bits.VCFG = 0; // Vref + = AVdd = 5V ou 3V & Vref - = AVss = GNS  //--- choix de la vitesse de conversion selon la clock choisie --> 8x bits de 0 à 7---// AD1CON3bits.ADCS = 0x27;// 0b 0010 0111 = 0x27 = 39   // 1 / Fcy = Tcy   // ADCX + 1 = x // Tcy * x = Tad = 1us  // 40MHz --> 25ns => 25ns * 40 = 1us//--- Temps automatic d'échantillonage --> 5x bit de 8 à 12 ---//AD1CON3bits.SAMC = 0x03; // 3 TAD//--- Sélection du channal --> bits de 0 à 4 et bit 7---// AD1CHS0bits.CH0SA = 0x05; // selection de l'entrée analogique sur le chanel 0 (mesure)  AD1CHS0bits.CH0NA = 0; // selection de la référence Vref- (masse) //--- gestion de l'interruption ---// //--- reset du flag d'interruption lié à l'AD ---// IFS0bits.AD1IF = 0;// remise à zéro //--- priorité de l'interruption ---// IPC3bits.AD1IP = 7; // ici level le plus haut --> 7  //--- activation de l'interruption ---// IEC0bits.AD1IE = 1; //--- activation du convertisseur ADC ---// AD1CON1bits.ADON = 1; // convertisseur actif }


ainsi que ma petite fonction d'interruption :

void __attribute__((interrupt, no_auto_psv)) _ADC1Interrupt( void )//void __attribute__((__interrupt__)) _ADC1Interrupt( void ){//--- indication de l'interruption ---// info_interrupt_ADC = 1;//--- lecture du registre pour récuperer la valeur l'entrée analogique ---// valeur_adc = ADC1BUF0;// lecture du buffeur//--- reset du flag d'interruption ---// IFS0bits.AD1IF = 0;}


Alors si vous voyez un petit truc choquant, faîtes-moi signes
Bonne lectures les programmeurs
Amicalement le cht'y Philou'
bovix
 
Posts: 164
Joined: Fri Jan 17, 2014 4:42 pm

Next

Return to Explorer-16 (01 à 05-2007)

Who is online

Users browsing this forum: No registered users and 1 guest