Descarga la aplicación para disfrutar aún más
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**"); } }*/
Compartir