Logo Studenta

Ejemplo 2_Puertos_SIN_Sincronismo

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

/* Calcula promedio temperaturas de 16 recipientes. 
Los codigos de los recipientes van desde 0 a 3
LA INFORMACION TERMINA CUANDO EN EL BIT MENOS SIGNIFICATIVO VALE 1
SIN SINCRONISMO*/
#include<stdio.h>
#include<stdlib.h>
#include<sys/io.h> // biblioteca de linux
#include<unistd.h>
#define LPT1 0x378 // direcciones de los puertos
#define LPT2 0x379
/********************** CAMPO DE BITS **************************/
struct BITS {
	 unsigned int RECIP:4;
		 int temp :9;
	 unsigned int :2;
	 unsigned char F :1;
 
 };
/********************** UNION CAMPO DE BITS CON LECTURA DEL PUERTO ****/ 
union UN {
	 unsigned char byte[2];
	 struct BITS bit;
 };
/********************* DECLARACION DEL TIPO DE DATO *****************/	
struct DATOS{
	 int CONT;
	 int ACU;
	 float PROM;
 };
/********************* PROGRAMA PRINCIPAL ***********************/
int main ()
{ struct DATOS VEC[16]; 
 union UN U;
 int FIN=0, I;
 
	for (I=0; I < 4 ; I++) 
 {
 	 VEC[I].ACU =0;
 	 VEC[I].CONT =0;
 	 VEC[I].PROM = 0;
 } 
 
 ioperm(LPT1, 2, 1); //habilita los ports
 while(!FIN)
	{
	U.byte[1] = inb(LPT2); //leo puerto LPT2
	if(U.bit.F == 0)
	{
		U.byte[0]=inb(LPT1); //leo puerto LPT1
		VEC[U.bit.RECIP].ACU += U.bit.temp;
		VEC[U.bit.RECIP].CONT++;
	} //fin del if
	else
		FIN=1;
 } //fin del while
ioperm(LPT1, 2, 0); // deshabibito el puerto
for(I=0;I<16;I++)
	if(VEC[I].CONT != 0)
		VEC[I].PROM= (float)VEC[I].ACU / VEC[I].CONT;
for(I=0;I<16;I++)
	printf("\n Prom [%d] = %f", I, VEC[I].PROM);
return 0;
}

Continuar navegando