//-----------------------------------------------------------------------------------//
// Nom du projet 		:	Coursera_Microcontroleur
// Nom du fichier 		:   main_3_4.c
// Date de création 	:   21.05.2014
// Date de modification : 	21.05.2014
// 
// Auteur 				: 	Philou (Ph. Bovey) 
//
// Description 			:   à l'aide de trois pins, on veut alimenter 6 leds les unes 
//							
//
//						CONA	-----------------------
//								|      |       |     |
//							   | |	  | |      |     |
//                              |      |       |     |
//						CONB	---------	  | |   | |	   
//                              |      |       |     |
//                             | |    | |      |     |
//                              |      |       |     |
//                      CONC    -----------------------
//
//
// Remarques			: 
// 	    chemin pour trouver le headerfile 
//		C:\Program Files\Microchip\MPLAB C30\support\dsPIC33F\h
//
//	    lien utile : 
//		http://en.wikipedia.org/wiki/Charlieplexing
//
//----------------------------------------------------------------------------------//
//--- librairie à inclure ---// 
#if defined(__dsPIC33F__)
#include "p33Fxxxx.h"
#endif

//--- autres librairires ---// 
#include "antirebond.h"

//--- Fusibles ---//	
_FOSCSEL(FNOSC_PRI); 								// utilisation du quartz de 8MHz externe 
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_XT); 	// pin OS2 garder pour l'horlohe 
													// oscillateur XT	
_FWDT(FWDTEN_OFF); 									// ne pas activer le watchdog

//--- definition ---//
#define SWITCH 		PORTDbits.RD6					// entrée digital

//--- definition de fonction à des définitions ---// 
#define LED1 		fct_led1()                  
#define LED2 		fct_led2()
#define LED3 		fct_led3()
#define LED4 		fct_led4()
#define LED5 		fct_led5()
#define LED6 		fct_led6()

//--- déclaration de variables de gloables ---// 
Etat_switch pt_switch_S3;  

//--- déclaration de prototypes ---// 
void init_oscillateur(void); 				// configuration oscillateur 
void init_in_out(void);						// configuration entree - sortie  
void init_timer1(void); 					// configuration Timer1   
void activ_leds(int cmpt);					// permet de faire allumer une led   

void fct_led1(void); 						// chaque fonction de led
void fct_led2(void);                        // correspond à nouvelles configuration 
void fct_led3(void);                        // des entrées - sorties    
void fct_led4(void);
void fct_led5(void);
void fct_led6(void);
   					
//--- programme principale ---//
int main(void)
{
	//--- déclaration de variables ---// 
	char compteur = 0; 

	//--- initialisation ---//
	init_oscillateur(); 				// oscillateur
	init_timer1(); 						// Timer 1 
	init_in_out(); 						// IN/OUT     
	
	//--- boucle sans fin ---//
	while(1)
	{
		if(switch_presser(&pt_switch_S3))
		{
			compteur++;
			activ_leds(compteur);  
			reset_info_touche_presser(&pt_switch_S3);
		}
		
		if(compteur > 6)
			compteur = 0;    
	}   
}

//----------------------------------------------------------------------------------//
//--- nom 				: init_in_out
//--- entrée - sortie 	: - / - 
//--- description 		: initialisation IN/OUT ANAL/NUM --> 
//--- remarque 			: doc = section 10 
//----------------------------------------------------------------------------------//
void init_in_out(void)
{	
	//--- configuration entrée analogique ---// 

	//--- configuration entrée numérique ---//
	TRISDbits.TRISD6 = 1; 						//--> SWI3 
 	
	//--- configuration sortie numérique ---//
	TRISFbits.TRISF6 = 0; 						// --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 0; 						// --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 0; 						// --> CONC --> PIN7 -> J9
}

//----------------------------------------------------------------------------------//
//--- nom 				: init_oscillateur
//--- entrée - sortie 	: - / - 
//--- description 		: configuration oscillateur | clock à choix  
//-- remarque 			: doc = section 7
//----------------------------------------------------------------------------------//
void init_oscillateur(void)
{
	//--- configuration de l'oscillateur interne à 8Mhz ---//
	// utilisation formules du datasheet du DSPic33FJ256GP710A --> page 146
	// quartz utilisé sur le carte = 8MHz = Fin
	// 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 	= 6;			// M = 8  

	__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); 	//
}

//----------------------------------------------------------------------------------//
//--- nom 				: init_timer1
//--- entrée - sortie 	: - / - 
//--- description 		: initialisation timer 1 pour avoir une horloge de 50ms
//--- remarque 			: doc = section 11 
//----------------------------------------------------------------------------------//
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 = 1562; 				// période du timer --> 50ms/32us = 1562.5 

	//--- 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; 	    	// désactiver le timer1 au démarrage
}

//----------------------------------------------------------------------------------//
//--- nom 				: _T1Interrupt
//--- entrée - sortie 	: - / - 
//--- description 		: interruption liée au  
//----------------------------------------------------------------------------------//
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt( void )
{
	//---  ---//
	IFS0bits.T1IF = 0; 			// remise à zéor du flag d'interruption
	
	//--- lecture de la touche S3 ---//
	antirebond(&pt_switch_S3, SWITCH);
 
	TMR1 = 0; 				// mise à jour du registre de comptage 
	T1CONbits.TON = 1;		// activer à nouveau le Timer */ 
}

//----------------------------------------------------------------------------------//
//--- nom 				: activ_leds
//--- entrée - sortie 	: - / - 
//--- description 		: selon la valeur reçu en entrée, cela va alimenter un   		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void activ_leds(int cmpt)
{
	switch (cmpt)
	{
		case 1 :
			LED1; 
		break;

		case 2 :
			LED2;  
		break;

		case 3 :
			LED3; 
		break;

		case 4 :
			LED4;  
		break;

		case 5 : 
			LED5; 
		break;

		case 6 :
			LED6;  
		break;  

		default: 
		break; 
	}
}



//----------------------------------------------------------------------------------//
//--- nom 				: fct_led1
//--- entrée - sortie 	: - / - 
//--- description 		: configuration de la LED1,sans que les autres LEDs soient 
//                        activées    		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void fct_led1(void)
{
	//--- Configuration entrée / sortie ---//  
	TRISFbits.TRISF6 = 0; 						// OUT --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 0; 						// OUT --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 1; 						// IN  --> CONC --> PIN7 -> J9

	//--- assignation des sorties ---//
	LATFbits.LATF6 = 1; 
	LATFbits.LATF7 = 0; 
}

//----------------------------------------------------------------------------------//
//--- nom 				: fct_led2
//--- entrée - sortie 	: - / - 
//--- description 		: configuration de la LED2,sans que les autres LEDs soient 
//                        activées    		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void fct_led2(void)
{
	//--- Configuration entrée / sortie ---//  
	TRISFbits.TRISF6 = 1; 						// IN  --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 0; 						// OUT --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 0; 						// OUT --> CONC --> PIN7 -> J9

	//--- assignation des sorties ---//
	LATFbits.LATF7 = 1; 
	LATFbits.LATF8 = 0; 
}


//----------------------------------------------------------------------------------//
//--- nom 				: fct_led3
//--- entrée - sortie 	: - / - 
//--- description 		: configuration de la LED3,sans que les autres LEDs soient 
//                        activées    		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void fct_led3(void)
{
	//--- Configuration entrée / sortie ---//  
	TRISFbits.TRISF6 = 0; 						// OUT --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 0; 						// OUT --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 1; 						// IN  --> CONC --> PIN7 -> J9

	//--- assignation des sorties ---//
	LATFbits.LATF6 = 0; 
	LATFbits.LATF7 = 1;
}


//----------------------------------------------------------------------------------//
//--- nom 				: fct_led4
//--- entrée - sortie 	: - / - 
//--- description 		: configuration de la LED4,sans que les autres LEDs soient 
//                        activées    		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void fct_led4(void)
{
	//--- Configuration entrée / sortie ---//  
	TRISFbits.TRISF6 = 1; 						// IN  --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 0; 						// OUT --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 0; 						// OUT --> CONC --> PIN7 -> J9

	//--- assignation des sorties ---//
	LATFbits.LATF7 = 0; 
	LATFbits.LATF8 = 1;
}


//----------------------------------------------------------------------------------//
//--- nom 				: fct_led5
//--- entrée - sortie 	: - / - 
//--- description 		: configuration de la LED5,sans que les autres LEDs soient 
//                        activées    		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void fct_led5(void)
{
	//--- Configuration entrée / sortie ---//  
	TRISFbits.TRISF6 = 0; 						// OUT --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 1; 						// IN  --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 0; 						// OUT --> CONC --> PIN7 -> J9

	//--- assignation des sorties ---//
	LATFbits.LATF6 = 0; 
	LATFbits.LATF8 = 1;
}


//----------------------------------------------------------------------------------//
//--- nom 				: fct_led6
//--- entrée - sortie 	: - / - 
//--- description 		: configuration de la LED6,sans que les autres LEDs soient 
//                        activées    		  
//--- remarque 			:   
//----------------------------------------------------------------------------------//
void fct_led6(void)
{
	//--- Configuration entrée / sortie ---//  
	TRISFbits.TRISF6 = 0; 						// OUT --> CONA --> PIN3 -> J9
	TRISFbits.TRISF7 = 1; 						// IN  --> CONB --> PIN5 -> J9
	TRISFbits.TRISF8 = 0; 						// OUT --> CONC --> PIN7 -> J9

	//--- assignation des sorties ---//
	LATFbits.LATF6 = 1; 
	LATFbits.LATF8 = 0;
}
