Aller au contenu


Photo
- - - - -

DSPic 33FJ256GP710


  • Veuillez vous connecter pour répondre
18 réponses à ce sujet

#1 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 26 octobre 2012 - 08:44

Bonjour à tous,

Je viens vers vous à nouveau (prolifique en question ces temps-ci) 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 --> Ok
Infos sur le matériel utilisé :
1x Carte explorer 16 avec un DSPic33FJ256GP710
IDE : Mplab 8.76 avec compilateur C30

Maintenant 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'oeils avisés :kez_05:

J'ai repris les codes pour la gestion de l'affichage donner en exemple avec le DSPic, voir fichiers en annexe : lcd.c/h et delay.c/h

Pour le moment 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,... d'après la doc c'est possible
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 :kez_11:

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

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

Amicalement le cht'y Philou

Fichier(s) joint(s)

  • Fichier joint  codes.zip   6,48 Ko   158 téléchargement(s)

Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#2 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 27 octobre 2012 - 08:40

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 ??? :dash2:

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 /1
	CLKDIVbits.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 :yahoo:

Amicalement le cht'y Philou
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#3 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 12 novembre 2012 - 11:44

Bonsoir à tous,

je viens encore vous embêter... 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 et des fusibles n'as pas posé de problèmes (enfin on verra plus tard si la led clignote :lazy: :bomb: )

Bref 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 la valeur (tension) que nous avons sur la pin... Premièrement avez-vous compris la même chose ? deuxièment : si je fais allumer ou éteindre ma la led j'utilise quel registre ?

Je dois dire que j'ai pas bien compris la différence :help:
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
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#4 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 12 novembre 2012 - 11:48

Bonsoir à tous,

je viens encore vous embêter... 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 et des fusibles n'as pas posé de problèmes (enfin on verra plus tard si la led clignote :lazy: :bomb: )

Bref 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 la valeur (tension) que nous avons sur la pin... Premièrement avez-vous compris la même chose ? deuxièment : si je fais allumer ou éteindre ma la led j'utilise quel registre ?

Je dois dire que j'ai pas bien compris la différence :help:
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


Hello !
Je passe en coup de vent, juste pour dire que pour écrire sur le port, il faut utiliser le registre LATx ! Jamais PORTx.
Je repasserai surement d'ici deux jour pour compléter ma réponse et lire tout le topic !

jā ne !

Mon site internet : http://ferdinandpiette.com/


#5 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 14 novembre 2012 - 10:44

Merci Mister Black,

Je vais utiliser le registre LATx pour écrire sur mes sorties... j'attends avec impatience ton explication... en tout un grand merci pour ta réponse...

Amicalement le cht'y Philou
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#6 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 14 novembre 2012 - 01:17

Salut,

Pour l'écriture :
Alors, en général, avec les PIC, il faut utiliser LATx pour écrire sur un port car il peut y avoir des bugs avec PORTx si tu essayes d'écrire deux fois successivement sur le même port (à cause des délai du à l'électronique). Avec LATx, tu n'as pas ces problèmes.
J'ai appris ça en utilisant les PIC18 il y a plusieurs années, mais je suppose que c'est une bonne habitude à prendre pour tous les pics. Par contre, je n'arrive pas à retrouver l'information dans ta datasheet... D'après le schéma de principe, on dirait que lorsque tu écrit dans PORTx, ça va directement écrire dans le LATx...

Au niveau de la lecture, avec le latch, tu lis directement au niveau du driver du port (la valeur commandée). Alors qu'avec le port, tu fais ta mesure sur le port lui-même (la valeur directement au niveau de la pin de sortie).
Ainsi, tu peux avoir des problèmes lorsque tu fixes la valeur d'une pin et que tu lis tout de suite après la valeur avec port : le driver n'aura pas le temps d'écrire le port et tu liras une valeur erronée.



Voila,
++
Black Templar

Mon site internet : http://ferdinandpiette.com/


#7 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 21 novembre 2012 - 12:01

Bonsoir à tous,

c'est encore moi... bon là je plante vraiment... j'ai écris mon code (que vous trouverez en annexe), ou j'ai la configuration du timer1, l'interruption lié à ce timer + le main... ca compile :crazy: Mais quand je veux passez en mode debuuger avec le ICD3, pas de cligontement, aucune interruption ne fait (en fait y a rien qui passe dans le routine d'interruption)

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

Fichier(s) joint(s)

  • Fichier joint  main.c.txt   4,32 Ko   133 téléchargement(s)

Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#8 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 24 novembre 2012 - 02:20

c'est encore moi... bon là je plante vraiment... j'ai écris mon code (que vous trouverez en annexe), ou j'ai la configuration du timer1, l'interruption lié à ce timer + le main... ca compile Image IPB Mais quand je veux passez en mode debuuger avec le ICD3, pas de cligontement, aucune interruption ne fait (en fait y a rien qui passe dans le routine d'interruption)


Salut !

Je n'ai pas compilé le code (pas encore tout réinstallé), mais j'ai comparé avec un programme à moi qui trainait. ça à l'air correcte ...

Voila le bout de code que j'ai. Dans mes souvenir, ça marchait parfaitement (avec le timer 32bits en tout cas. Pour le timer1 sur 16 bits, ça devait aussi marché, mais je ne m'en rappelle pas à 100%) :
(Par contre, j'utilisais la clock interne)

Essaye de rajouter un IFS0bits.T1IF = 0; pour réinitialiser l'interruption du timer1 dans ta fonction d'initialisation.

#include "p33FJ128GP802.h"

/*--------------------------------------------------------------------------*
 * Configuration bits                                               		*
 *--------------------------------------------------------------------------*/
#if __dsPIC33F__
	_FGS 	(GSS_OFF)
	_FOSC	(POSCMD_NONE & IOL1WAY_OFF )
	_FOSCSEL (FNOSC_FRC)
	_FWDT	(FWDTEN_OFF & WDTPRE_PR32 & WDTPOST_PS1)
#else
	#error "In main.c file: Define architecture types before compiling !!!"
#endif

/*--------------------------------------------------------------------------*
 * Function prototypes                                                  	*
 *--------------------------------------------------------------------------*/
void config_timer1();
void config_timer_32bits();


/*--------------------------------------------------------------------------*
 * Initialisation function                                                        	*
 *--------------------------------------------------------------------------*/
void init()
{
	//1 : input; 0 : output
	TRISA = 0b1111111111111111;
	TRISB = 0b1110000000000000;
	LATB = 0;//0b1010101010101011;
	LATBbits.LATB5 = 1;
	LATBbits.LATB6 = 0;
	
	config_timer_32bits();
}

/*--------------------------------------------------------------------------*
 * Main function                                                        	*
 *--------------------------------------------------------------------------*/
int main(void)
{	
	/* --- Init phase --- */
	init();	

	/* --- Main loop --- */
	while(1)
	{
		
	}
	
	return 0;
}

/*--------------------------------------------------------------------------*
 * Timer 1 interupt                                                 		*
 *--------------------------------------------------------------------------*/
void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt( void )
{
	LATBbits.LATB5 = LATBbits.LATB5 ^ 1;       
	IFS0bits.T1IF = 0;	// Remise à 0 du flag d'interuption
}

/*--------------------------------------------------------------------------*
 * 32 bits timer 2 and 3 interupt                                   		*
 *--------------------------------------------------------------------------*/
void __attribute__((__interrupt__, no_auto_psv)) _T3Interrupt( void )
{ 
	LATBbits.LATB6 = LATBbits.LATB6 ^ 1;		
	IFS0bits.T3IF = 0;	// Remise à 0 du flag d'interuption
}


/*--------------------------------------------------------------------------*
 * Timer 1 configuration function                                   		*
 *--------------------------------------------------------------------------*/
void config_timer1()
{
	T1CONbits.TCKPS = 0b00;		// Clock divided by 	11:256		10:64		01:8		00:1
	T1CONbits.TSIDL = 0;		// ??? 1: arrete le timer quand on passe en veille ???
	T1CONbits.TGATE = 0;		// ??? 0: désactive quoi ??? Qu'est-ce que T1CS ???
	T1CONbits.TSYNC = 0;		// 1: synchronyse external clock if  TCS=1
	T1CONbits.TCS = 0;			// 1: external clock use		0: internal clock use

	PR1 = 65535;				// Période du timer (entre 0 et 65535)
	
	IEC0bits.T1IE = 1;			// Activation de l'interuption (1: interupt request enable)
	IPC0bits.T1IP = 7;			// Interuption de priorité maximale
	
	T1CONbits.TON = 1;			// 1: start		0: stop
}

/*--------------------------------------------------------------------------*
 * 32 bits timer 2 and 3 configuration function                     		*
 *--------------------------------------------------------------------------*/
void config_timer_32bits()
{	
	T2CONbits.T32 = 1;			// 1: 32 bits timer		0: 16 bits timer
	T2CONbits.TCKPS = 0b00;		// Clock divided by 	11:256		10:64		01:8		00:1
	T2CONbits.TSIDL = 0;		// ??? 1: arrete le timer quand on passe en veille ???
	T2CONbits.TGATE = 0;		// ??? 0: désactive quoi ??? Qu'est-ce que T1CS ???
	T2CONbits.TCS = 0;			// 1: external clock use		0: internal clock use
	
	PR3 = 16;					// Période du timer poids forts (entre 0 et 65535)
	PR2 = 65535;				// Période du timer poids faibles (entre 0 et 65535)
	
	IEC0bits.T3IE = 1;			// Activation de l'interuption (1: interupt request enable)
	IPC2bits.T3IP = 7;			// Interuption de priorité maximale
	
	T2CONbits.TON = 1;			// 1: start		0: stop
}

Si ça peut t'aider ...
++
Black Templar

Mon site internet : http://ferdinandpiette.com/


#9 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 17 décembre 2012 - 11:40

Bonsoir à tous,

Merci Black pour ton code, je ne l'ai malheureusement pas vraiment encore regardé pour le moment,... :nono:

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

j'ai testé le code démo, celui-ci fonctionnait... 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 une clock externe, et j'ai bien sur choisi la clock externe + j'ai "oublié" des codes en assembleurs qu'il faut rajouter dans la partie de la configuration de l'oscillateur

voici la configuartion juste pour le timer1
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
}

et pour la partie oscillateur
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); 	//
}

avec ceci j'ai bien ma led qui clignote.... oufff enfin... en tout cas merci à tous de m'avoir lu et à Master Black pour m'avoir apporter son aide...

PS : je vous mets mon code en entier dans les annexes, prochaine étapes avec l'une des touches, bouton poussoir, c'est de déplacer la le cignotement sur les leds suivantes...

A tout bientôt

Fichier(s) joint(s)

  • Fichier joint  main.c.txt   5,9 Ko   121 téléchargement(s)

Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#10 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 05 juin 2013 - 10:17

Bonsoir à vous,

Ca faisait longtemps, mais j'espère revenir un peu plus souvent sur le site :crigon_04: ...

Je recommence à nouveau avec le DSPic33FJ256... J'ai repris la ou je m'étais arrêter donc j'ai réussi à faire déplacer mon clignotement à l'aide d'un bouton poussoir cela fonctionne, je me suis amuser à ré-implémenter un script d'anti-rebond au niveau des touches, cela fonctionne... 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, et je n'arrive pas à comprendre ce que je fais de faux puisque j'ai l'impression de bien configurer le timer, de plus le script sur l'oscillateur n'a pas bougé :kez_13:

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 /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); 	//
}


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 = 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
}


Mais le problème, c'est que 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

Fichier(s) joint(s)

  • Fichier joint  main2.txt   9,19 Ko   91 téléchargement(s)

Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#11 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 26 juillet 2013 - 08:59

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 :Koshechka_08: :

Grace à un autre forum, la personne m'a aiguillé sur mon erreur :close_tema: :dvgmax_01: --> c'est au niveau du timer, le problème c'est que je prenais ca dans le sens de décompter la timer, eh non... après mes calculs (qui étaient juste), il fallait simplement reprendre la valeur brut soit :

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


Voili Voilou

Amicalement - le cht'y Philou
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#12 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 04 octobre 2013 - 09:23

Bonsoir à tous,

Je viens à vous à nouveau pour vous exposer un petit, mais alors tout petit problème... 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é à l'ADC, mais lors de l'exécution, on ne passe jamais dans cette routine d'interruption.

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
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#13 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 31 janvier 2014 - 10:24

Hello à tous,


Je reviens vers vous après ce long moment de silence... suite à ma première interrogation ci-dessus, je me suis aperçu de l'importance dans quel ordre on place la configuration des registres, je vous mets ma nouvelle config.

void init_adc()
{
	//--- gestion des registres liés au ADC ---//
	//--- 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) 

	//--- 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
	
	//--- Choix du format pour le buffer --> bit 8 à 9 ---// 
	AD1CON1bits.FORM = 0; 			// format Unsigned Interger (0 - 1023 or 0 - 4095)
	
	//--- Choix de la source pour le temps d'échantillonage (clock) --> bit 5 à 7 ---// 
	AD1CON1bits.SSRC = 0x07; 			// 0b111 = 7 --> Counter interne Automatic Trigger

	//--- choix de l'échantillonage --> bit 3 --// 
	AD1CON1bits.SIMSAM = 0; 		// ici qu'un seul canal
	
	//--- mode d'échantillonage --> bit 2 ---// 
	AD1CON1bits.SAMP = 0;
	AD1CON1bits.ASAM = 1; 			// converstion après la dernière converstion  

	//--- 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 des canaux (simple - deux - multiple) --> 2 bits de 8 et 9 ---//	
	AD1CON2bits.CHPS = 0; 			// seulement un chanal = CH0
	  
	//--- Configuration de la vitesse de l'interruption après échnatillonnage --> bit 2 à 5 ---// 
	AD1CON2bits.SMPI = 0;			// genère une interrruption après échantillonnage  

	//--- Temps automatic d'échantillonage --> 5x bit de 8 à 12 ---//
	AD1CON3bits.SAMC = 0x03; 		// 3 TAD

	//--- 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

	//--- gestion de l'interruption ---// 
	//--- reset du flag d'interruption lié à l'AD ---// 
	IFS0bits.AD1IF = 0;				// remise à zéro 

	//--- priorité de l'interruption ---// 				
	IPC3bits.AD1IP = 0x07; 			// ici level le plus haut --> 7  	

	//--- activation de l'interruption ---// 
	IEC0bits.AD1IE = 1; 

	//--- activation du convertisseur ADC ---// 
	AD1CON1bits.ADON = 1; 			// convertisseur actif	 
}

Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#14 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 31 janvier 2014 - 10:44

bon maintenant je viens vraiment sur le sujet que je voulais poster :mr47_05:

En me remettant sur la programmation de la carte Explorer 16, je me suis aperçu que les concepteurs de la carte avait placé sur la même pin RA7, un switch S5 et une led D10 (voir la page 42 - 43 du datasheet - poste #2 pour les liens) ; et j'ai pu m'apercevoir que si je configurerai ma ligne en entrée (numérique), celle-ci est toujours active (donc je ne peux pas utiliser cette touche) ; donc ma question, y a-t-il un moyen "soft" de ne pas tenir compte de la petit chute de tension sur cette ligne qui est crée la diode :kez_13:

Merci d'avance pour tous vos retours

Amicalement - le cht'y Philou
Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#15 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 23 janvier 2015 - 11:21

Bonsoir à tous, 

 

Je reviens vers vous car je suis bien bloqué à nouveau :help: ,

je suis toujours entrain de m'amuser sur ma carte Explorer 16, ainsi qu'avec des leds et mes entrées / sorties. Là, je m'amuse à réaliser c'est un carrefour tricolore.

 

Mon problème est le suivant : J'ai une fonction d'antirebond (qui fonctionne déjà - testée sur d'autre programmes => donc je ne l'a remets pas en cause), celle-ci est mise à jour dans une interruption qui et relié au Timer1. Lorsque le Timer1 arriver à 500ms, l'interruption s'active, et c'est la qu'on active la lecture de la touche, et ainsi la lecture de l'antirebond.

Le problème, c'est quand dans ma boucle principale, quand je teste ma touche (qui est lue toute les 500ms), rien ne se passe :skull: ?!?!?!? Pourtant, si je mesure avec un multimètre la pin qui relié à switch, celle-ci passe bien à zéro.... la je suis un peu perdu, je ne comprend pas ce que je fais de faux   

 

je ne passe jamais le test ci-dessous : 

//--- test si la touche est pressée ---//
if(switch_presser(&pt_SWITCH_PIETON))
{
//--- remise à zéro du compteur ---//
CMPT_FEUX_PIETON = 0x00;
ACTIVE_CMD_CMPT = 0x01;  
 
//--- remise à zéro de l'info de la touche 
reset_info_touche_presser(&pt_SWITCH_PIETON);
}

Je vous mets tout le code en annexe si ca vous intéresse. 

 

En tout cas un grand merci de me lire. 

 

A tout bientôt

 

Amcialement le cht0'y Philou

 

Fichier(s) joint(s)


Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#16 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 959 messages
  • Gender:Male
  • Location:Anglet

Posté 25 janvier 2015 - 11:47

Question bête ... as tu vérifié que tu rentrais bien dans les interruptions généré par ton timer ? 

Grosso modo choisis une sortie qui est reliée   une led et configurée en sortie et ecrit un truc du genre  "sortie ~= sortie ; " dans ton interrption de sorte à voir ta led clignoter ... 

Déjà on éliminera la moitié des possibilités en fonction de ce que ça te donne ;) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#17 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 30 janvier 2015 - 08:37

Bonsoir à tous, 

 

Merci Mike pour l'infos c'est ce que j'ai fait... et j'ai bien ma sortie qui varie (plus exactement une led)... mais ma touche n'as pas d’interaction avec cette boucle d’interruption.  :blind: . je vais regarder encore et encore, mais d'idée pour le moment, la soirée portera pt-être conseil. 

 

Update du soir : chose marrante, comme j'utilise la carte Explorer, je me suis dit que j'allais utiliser l'une des touches implémentée sur la carte... la au miracle, ma fonction d'antirebond fonctionne et ce qui va avec aussi. 

 

Maintenant faut que je regarde pourquoi : la pin RD13 du port D (ça fonctionne) & la pin RB0 du port B (la ca fonctionne pas)... pour l'instant ce que je vois que c'est la PIN RB0 peut être aussi utilisee en analogique...

 

Mais la je bloque complètement quand meme, je vais me replonger dans la doc du DSP. 

 

Alors si vous voyez quelques choses dans la config, les pins, ou autres config, je vous serais très reconnaissant 


Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|

#18 philouxy

philouxy

    Membre

  • Membres
  • 50 messages
  • Gender:Male
  • Location:Riviera Vaudoise - Suisse

Posté 07 février 2015 - 12:28

Bonsoir à tous, 

 

J'ai pt-être une explication concernant la PIN RB0 qui n'est pas détectée par le DSP. J'ai remarqué en lisant le datasheet (voir p.14 et p.21) que apparemment cette PIN a aussi d'autre fonction qu'une I/O, elle fait aussi office d'entrée analogique, pas que ça appremment elle est aussi servie quand on fait de la programmation ou du debugging. Comme ici j'utilise l'ICD3 en mode debugging, je me dis que cette pin n'est pas prise en compte.

 

C'est une supposition !

 

Vous en pensez quoi ?

 

En tout cas, merci de me lire, et si vous avez des remarques ou suggestion, je me ferai un plaisir de les lires  :bye:

 

Amicalement - Le cht'y Philou

 

PS: 

645504pining.png

 


-------------------------------------

Amicalement le cht'y Philou

 

Fixme Members : fixme.ch
-------------------------------------


#19 philou-RX

philou-RX

    Habitué

  • Membres
  • PipPip
  • 261 messages
  • Gender:Male
  • Location:Riviera - Vaudoise

Posté 11 février 2015 - 11:52

Bonsoir tout le monde, 

 

ON m'a mis sur la piste concernant cette PIN RB0 sur le forum de microchip, car on peut quand meme la configurer en mode I/O pure. 

 

Si on regarde sur le datasheet du DSPic (voir poste #2), page 164... cela nous donne l'explication. 

 


 

Clearing any bit in the ADxPCFGH or ADxPCFGL

register configures the corresponding bit to be an
analog pin. This is also the Reset state of any I/O pin
that has an analog (ANx) function associated with it.

 

avec le code ci-dessous, cela me permet de définir la pin RB0 comme une I/O standart. 

AD1PCFGLbits.PCFG0 = 0x01; 

Je vous mets le code complet si ca vous intéresse !!!

 

Fichier(s) joint(s)


Amicalement PHILOU QUI a BU, BOIRA !!! VU euh non BU! alcoolique non, assoiffé OUI^^ :P :|




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users