Logo Studenta

Ejercicio_11_MACROS

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

// Ejercicio11 de puertos CON MACROS.
#include <stdio.h>
#include<stdlib.h>
#include "sim11.c" 
//#include<sys/io.h>
#define N 16
#define PUERTO1 0x300
#define PUERTO2 0x301
#define LeePort(Y) {\
	 Y[0]= inb(PUERTO1);\
	 Y[1]= inb(PUERTO2);\
	 }
 
#define PROMEDIO(V,TAM){ int i;\
 				 for(i=0;i<TAM; i++)\
 					if (V[i].Cont_Rad)\
 				 V[i].Prom_Rad = (float)V[i].Acu_Rad/V[i].Cont_Rad;\
 }
	
#define ORDEN(V,TAM){\
			 int i, j;\
			 struct INFO aux; \
				for(i=0; i<TAM-1; i++) \
					for(j=0; j<TAM-i-1; j++) \
					 if ( V[j].Prom_Rad < V[j+1].Prom_Rad ) \
								 { aux = V[j];\
							 V[j] = V[j+1]; \
								 V[j+1] = aux; \
								 }\
			 } 
#define IMPRIMIR(V,TAM){\
 				 int i;\
 			 	 printf("Particula \t Promedio\n");\
 				 for(i=0;i<TAM;i++)\
 				 {\
 				 printf("%9d \t ",V[i].Nro_Paticula);\
 				 if(V[i].Prom_Rad)\
		 printf("%8.2f\n",V[i].Prom_Rad);\
	 else\
		 printf("%8s\n","**SIN DATOS**");\
 }\
 }
 
 
 
struct CB
{
 unsigned int F:1;
 unsigned int S:1;
 unsigned int Rad:10;
 unsigned int Cod:4;
}; //Esa estructura es la de los dos bytes que se reciben por los puertos.
union Un
{
 struct CB dato;
 unsigned char byte[2]; //Se genera este vector de dos posiciones para guardar lo leído en los puertos.
};
struct INFO{
	 int Nro_Paticula;
	 int Acu_Rad;
	 int Cont_Rad;
	 float Prom_Rad;
 };
void INICIAR (struct INFO[], int); // se inicializa el vector de estructuras
//void PROMEDIO(struct INFO[],int); // calcula el promedio de radiacion 
//void IMPRIMIR(struct INFO[],int);
//Función para mostrar la información de los niveles de readiación.
int main()
{
 union Un U;
 struct INFO VI[16];
 int fin=0; 
 
 INICIAR(VI,N);
 
 ioperm(PUERTO1,2,1); //Se habilitan los puertos.
 while(!fin)
 {
 do{ // Se lee el byte 0
 //U.byte[0]=inb(PUERTO1);
 LeePort(U.byte)
 }while( U.dato.S==0);
 
 if(U.dato.F==1) //Si el bit de fin es igual a 1.
 fin=1;
 else
 { //Se lee el byte 1.
 //U.byte[1]=inb(PUERTO2);
	 // Se guarda el valor del nivel de radiación y se cuenta el dato.
	 VI[U.dato.Cod].Acu_Rad+=U.dato.Rad;
 VI[U.dato.Cod].Cont_Rad++;
 
 //Se espera que el bit S pase de 1 a 0 para no volver a leer el mismo dato que antes.
 do
 {
	 //U.byte[0]=inb(PUERTO1);
	 LeePort(U.byte)
	}while(U.dato.S==1); 
 }
 }
 //Se deshabilitan los puertos.
 ioperm(PUERTO1,2,0);
 
 // PROMEDIO(VI,N); // FUNCION se calcula el promedio de radiacion
 
 PROMEDIO(VI,N) // SE INVOCA A LA MACRO PROMEDIO
 
 ORDEN(VI,N) // SE INVOCA A LA MACRO ORDEN
 
 // IMPRIMIR(VI,N); // FUNCION que muestra los datos
 IMPRIMIR(VI,N) // SE INVOCA A LA MACRO IMPRIMIR
 
 
 //Fin del programa.
	printf("\n\n\n\t\t FIN DEL PROGRAMA.\n\n");
	system("pause"); // Esto no va en Linux.
	return 0;
}
///////////////////////////////////////////////////////////////
void INICIAR (struct INFO V[], int TAM)
{
 int i;
 for(i=0;i<TAM; i++)
 { 
 V[i].Nro_Paticula=i;
	V[i].Acu_Rad=0;
 V[i].Cont_Rad=0;
 V[i].Prom_Rad =0;
 }	
}
/////////////////////////////////////////////////////////////
/*void PROMEDIO (struct INFO V[], int TAM)
{
 int i;
 for(i=0;i<TAM; i++)
 if (V[i].Cont_Rad)
 V[i].Prom_Rad = (float)V[i].Acu_Rad/V[i].Cont_Rad;
}*/
//////////////////////////////////////////////////////////////
/*void IMPRIMIR (struct INFO V[], int TAM)
{
 int i;
 printf("Particula \t Promedio\n");
 
 for(i=0;i<TAM;i++)
 {
 	printf("%9d \t ",V[i].Nro_Paticula);
 	if(V[i].Prom_Rad)
		printf("%8.2f\n",V[i].Prom_Rad);
	else
		printf("%8s\n","**SIN DATOS**");
 }
}*/

Continuar navegando

Contenido elegido para ti