All pastes #477405 Raw Edit

Stuff

public c v1 · immutable
·published 2007-05-08 17:07 UTC
rendered paste body
#define ICD2_DEBUG//Déclarations de Variables//const char val_min[12] = {89, 98, 106, 115, 125, 136, 147, 159, 172, 184, 199}; // plages minimales//const char val_max[12] = {92, 101, 109, 119, 129, 139, 150, 162, 176, 189, 203}; // plages maximalesconst char val_min[12] = {87, 96, 104, 113, 123, 134, 142, 157, 170, 182, 197}; // plages minimalesconst char val_max[12] = {94, 103, 111, 121, 131, 141, 156, 164, 178, 191, 205}; // plages maximalesconst char val[12] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'R'}; // valeurs correspondantes a chaque plageschar tab[5]; // contenu des 5 valeur correpondant au code 5 tonschar adresse[5]; // contenu de l'adresse du relaichar enr_lec, voc_mil, test, mess1_mess2;void tempo(char ti); // fonction de "pause"char CAN(void); // renvoie la valeur du convertisseurchar lire_valeur(char i); // Permet de lire les 5 valeurs à suivre pour une fréquencechar verif_can(char can); // permet de vérifier si la valeur du CAN est bien comprise dans une des plagesvoid milleHcont(void); // permet de générer le 1000Hz continuvoid milleHdiscont(void); // permet de générer le 1000Hz dicontinuvoid ordon_tab(void); // permet de changer les R du code 5 tons en la valeur précédente dans le tableauvoid tempo(char ti) // fonction de "pause"{	INTCON.2 = 0;	TMR0 = ti;	while(INTCON.2 == 0);}char CAN(void) // renvoie la valeur du convertisseur sur AN1{	char ta, cnt;	ADCON1 = 0x00;	ta = TRISA;	TRISA = TRISA | 0x2F;	ADCON0 = 0x81 | (1 << 3);	cnt =0;	for (cnt=0;cnt<=220;cnt++);	ADCON0 = ADCON0 | 0x04;	while (ADCON0 & 0x04);	TRISA = ta;	ADCON1 = 0x07;	return ADRESH;}/**//*********************************************************************************** Cette fonction permet de faire les 5 mesures pour chaque codes du code 5 tons************************************************************************************ Entrées :*	i : indice du tableau auquel correspond le code 5 ton************************************************************************************ Sorties :*	Renvoie 1 si les 5 valeurs sont identiques et correspondent à une de plages, renvoie 0 autrement************************************************************************************Fonction Lire_Valeur*	Attendre 10ms*	A = Lire CAN et lancer la fonction verif_CAN (ci-dessous) pour vérifier cette valeur)*	Attendre 10ms*	B = Lire CAN et lancer la fonction verif_CAN (ci-dessous) pour vérifier cette valeur)*	Si (A = B)*		Attendre 10ms*		B = Lire CAN et lancer la fonction verif_CAN (ci-dessous) pour vérifier cette valeur)*		Si (A = B)*			Attendre 10ms*			B = Lire CAN et lancer la fonction verif_CAN (ci-dessous) pour vérifier cette valeur)*			Si (A=B)*				Attendre 10ms*				B = Lire CAN et lancer la fonction verif_CAN (ci-dessous) pour vérifier cette valeur)*				Si (A=B)*					Mettre A dans le tableau contenant les codes du code 5 tons*				Sinon Arrêter FinSi*			Sinon Arrêter FinSi*		Sinon Arrêter FinSi*	Sinon Arrêter FinSi*FinFonction***********************************************************************************/char lire_valeur(char i) // Permet de lire les 5 valeurs à suivre pour une fréquence{	char b, ret, can;	char tab2[5]; // Contenu des 5 mesures faites à la suite pour mesurer une fréquence.	PORTB = PORTB^0xFF;	//tempo(181); // tempo de 20ms	tempo(220);	can = CAN();	tab2[0] = verif_can(can);	b = val_min[0];	if ((can >= b))	{		PORTB = PORTB^0xFF;		tempo(220);		tab2[1] = verif_can(CAN());		if (tab2[0] == tab2[1])		{			PORTB = PORTB^0xFF;			tempo(220);			tab2[2] = verif_can(CAN());			if (tab2[0] == tab2[2])			{				PORTB = PORTB^0xFF;				tempo(220);				tab2[3] = verif_can(CAN());				if (tab2[0] == tab2[3])				{					PORTB = PORTB^0xFF;					tempo(220);					tab2[4] = verif_can(CAN());					if (tab2[0] == tab2[4])					{						PORTB = PORTB^0xFF;						tab[i] = tab2[0];						ret = 1;						tempo(100);					} else { ret = 0; }				} else { ret = 0; }			} else { ret = 0; }		} else { ret = 0; }	} else { ret = 0; }	return ret;}/*********************************************************************************** Cette fonction permet retourner la valeur correspondant à la plage de fréquence.************************************************************************************ Entrées :*	can : Correspond à la valeur mesurée par le CAN************************************************************************************ Sorties :*	Renvoie la valeur correspond au code 5 ton correspondant, ou 0 si aucun code ne correpond************************************************************************************Fonction verif_CAN*	i = 0*	ret = 0*	faire*	TantQue ret = 0 et i<10 // <10 car il n'y a que 11 valeurs possibles pour le code 5 tons*		Si can < val_min[i] ou can > val_max[i] // val_min et val_max correspondent a la plage de fréquence correpondant à chaque code*			on laisse ret à 0*		Sinon*			ret = val[i] // val correpond au tableau correspondant aux code 5 tons*		FinSi*		Incrémenter i*	FinTantQue*	Retourner ret*FinFonction***********************************************************************************/char verif_can(char can){	char i, ret, min, max;	i = 0;	ret = 0;	do	{		min = val_min[i];		max = val_max[i];		if ((can<min) || (can>max))		{			ret = 0;		} else {			ret = val[i];			}		i++;	} while ((ret==0) && (i<=10));	return ret;}void milleHcont(void) // permet de générer le 1000Hz continu{	char i;	TRISC = TRISC&0xFB;	for (i=0;i<=100;i++) // pour faire le 1000Hz continu pendant environ 5s	{		tempo(0);	}	TRISC = TRISC|0x04;}void milleHdiscont(void) // permet de générer le 1000Hz dicontinu{	char i;	for (i=0;i<=50;i++) // pour faire le 1000Hz discontinu pendant environ 5s	{		TRISC = TRISC&0xFB;		tempo(0);		TRISC = TRISC|0x04;		tempo(0);	}	TRISC = 0xFF;}/*********************************************************************************** Cette fonction permet de changer les R du code 5 tons par les valeurs précédente du tableau************************************************************************************Fonction ordon_tab*	Pour chaque valaur du tableau contenant le code 5 ton faire*		Si la valeur = R alors*			Remplacer le R par la valeur de la case précédente du tableau*		FinSi*	FinPour*FinFonction***********************************************************************************/void ordon_tab(void) // permet de changer les R du code 5 tons en la valeur précédente dans le tableau{	char i, a;	for (i=1;i<=4;i++)	{		if (tab[i] == 'R')		{			a = tab[i-1];			tab[i] = a;		}	}}/*********************************************************************************** Cette fonction permet de vérifier que le code 5 tons correspond bien au code du relais défini par l'utilisateur************************************************************************************ Sorties :*	Renvoie 1 si les codes mesurés sont identique à ceux défini par l'utilisateur, 0 sinon************************************************************************************Fonction verif_tab*	ret = 1*	Pour chaque valeur du tableau contenant le code 5 ton faire*		Si (la valeur de la case actuelle du tableau = le code du relais définie par l'ATR) et ret = 1*			ret = 1*		Sinon*			ret = 0*		FinSi*	FinPour*	Retourner ret*FinFonction***********************************************************************************/char verif_tab(void){	char i, ret, a, b;	ret = 1;	for (i=0;i<=4;i++)	{		a = tab[i];		b = adresse[i];		if ((ret == 1) && (a == b))		{			ret = 1;		} else {			ret = 0;		}	}	return ret;}/*********************************************************************************** Cette fonction permet de changer les R du code 5 tons par les valeurs précédente du tableau************************************************************************************ Entrées :*	i : correspond à la case correspondant *	adr : correspond à l'adresse lu sur le Switch************************************************************************************Fonction lire_adresse*	Selon adr*		0 : mettre adresse[i] à '0'*		1 : mettre adresse[i] à '1'*		2 : mettre adresse[i] à '2'*		3 : mettre adresse[i] à '3'*		4 : mettre adresse[i] à '4'*		5 : mettre adresse[i] à '5'*		6 : mettre adresse[i] à '6'*		7 : mettre adresse[i] à '7'*		8 : mettre adresse[i] à '8'*		9 : mettre adresse[i] à '9'*	FinSelon*FinFonction***********************************************************************************/void lire_adresse(char i,char adr){	switch (adr)	{		case 0: adresse[i] = '0';		case 1: adresse[i] = '1';		case 2: adresse[i] = '2';		case 3: adresse[i] = '3';		case 4: adresse[i] = '4';		case 5: adresse[i] = '5';		case 6: adresse[i] = '6';		case 7: adresse[i] = '7';		case 8: adresse[i] = '8';		case 9: adresse[i] = '9';	}}/*********************************************************************************** Cette fonction permet de lire les 2 premiers codes définies par l'utilisateur grace aux switchs************************************************************************************Fonction init*	Définir le CAN actif sur RA1*	Configurer la temporisation*	Mettre les bits 0 à 3 du PORTB en entrées et les bits 4 à 7 en sorties*	Mettre les bits 0,1,5,6,7 du PORTA en entrées et les bits 2,3,4 en sorties*	Mettre le PORTA à 0xFF*	Lire le 1er code de l'adresse du relais*	Lire le 2nd code de l'adresse du relais*FinFonction***********************************************************************************/void init(void){	char adr;	ADCON1 = 0x07; // défini sur quel bit on va faire la CAN	OPTION_REG = 0xC7; //défini la temporisation	TRISB = 0x0F; // bits 0 à 3 : entrées; bits 4 à 7 : sorties	TRISA = 0xE3; // bits 0,1,5,6,7 : entrées; bits 2,3,4 : sorties	PORTA = 0xFF;	// lecture du 1er chiffre de l'adresse du relais	PORTA.2 = 0;	adr = PORTA;	lire_adresse(0, adr);	PORTA.2 = 1;		// lecture du 2nd chiffre de l'adresse du relais	PORTA.3 = 0;	adr = PORTA;	PORTA.3 = 1;	lire_adresse(1, adr);}void main(void){	char in, A;	do	{		do 		{			A = verif_can(CAN());		} while (A == 0);		in = 0;		do		{			A = lire_valeur(in);			in++;			if (A == 0) { in = 0; }		} while ((in<=4) && (A !=0));		if (in == 5)		{			ordon_tab(); // permet de changer les R du code 5 tons en la valeur précédente dans le tableau			A = verif_tab(); // permet de vérifier si les valeurs du code 5 tons sont bien identique à l'adresse du relais		}	}	while(1);}