Logo Studenta

Sim_Conversor

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

/** @file Sim_Conversor.c
 *
 * @date 10 de septiembre de 2018
 * @version 1.0
 *
 * @author Vazquez Saraullo, Federico Alejandro.
 *
 * @brief Simulador para el ejercicio de aplicación de puertos con ADC. Este
 *			código simula a un ADC conectado a un puerto paralelo.
 */
/** \addtogroup Simulador de puerto paralelo con ADC
 * @{
 */
/*==================[Variables globales]=====================================*/
int WR_VAR_GLO=0, RD_VAR_GLO=1, INTR_VAR_GLO=1; //Indican los estados de los bits.
int HABILITACION_PUERTOS=1; //Indica la habilitación (1) o no (0) de los 3 registros.
/*==================[Implementación de funciones internas]==================*/
// Funciones auxiliares.
unsigned char RegistroControl()
{	
	/* Cuerpo de la función*/
	// Se arma el byte que se devuelve.
	return (0xA8+(RD_VAR_GLO<<1)+(WR_VAR_GLO)); // Se devuelve 1010 10XX. Los 1 y 0 son para darse cuenta despúes si se aplicaron bien las máscaras para leer el registro de control.	
}
unsigned char RegistroEstado()
{
	/* Cuerpo de la función*/
	// Se pasa a INTR de 1 a 0 si se relizó la conversión y no se intentó leer.
	if( INTR_VAR_GLO==1 && WR_VAR_GLO==1 && RD_VAR_GLO==1)
		INTR_VAR_GLO=0;
	
	// Se arma el byte que se devuelve.
	return (INTR_VAR_GLO<<3);
}
unsigned char RegistroDato()
{
 /* Declaraciones locales */
	static int temp=0;
	
	/* Cuerpo de la función*/
	if(INTR_VAR_GLO==0 && RD_VAR_GLO==0)
	{
		temp++; //Va incrementando en 0.25 ºC
		INTR_VAR_GLO=1; // Se pasa a INTR de 0 a 1 porque realizó la lectura (i.e.: RD pasó de 1 a 0).
	}
	
	if(temp>=256)
		temp=0;
	
	return temp;
}
// Funciones principales.
int ioperm(int a, int b, int c)
{
	//No hace nada. Se supone que se habilitan bien los puertos.
	//Incorporar habilitación de puertos.
}
unsigned char inb(int port)
{
 /* Declaraciones locales */
	unsigned char byte;
	/* Cuerpo de la función*/
	if(HABILITACION_PUERTOS==0)
		printf("\n\nERROR. Los puertos no están correctamente habilitados.\n\n");
	else
	{
		switch(port)
		{
			case 0x3BE: byte=RegistroControl(); //Se lee el WR y el RD.
						break;
						
			case 0x3BD: byte=RegistroEstado(); //Se analiza el bit INTR.
						break;
			
			case 0x3BC: byte=RegistroDato(); //Se lee el dato de temperatura.
		}	
	}	
	return byte;
}
//Inicicialmente WR=0 y RD=1
void outb(int port, char dato)
{	
	/* Cuerpo de la función*/
	if(HABILITACION_PUERTOS==0)
		printf("\n\nERROR. Los puertos no están correctamente habilitados.\n\n");
	else
	{
		if(port==0x3BE)
		{
			if((dato&0xFC)!=0xA8) //Se analiza si se aplicaron bien las máscaras.
				printf("\n\nERROR usando el registro de control. Se estan modificando bits que no se deben.\n\n");
			else	
			{
				//Se analiza el bit WR.
				if( (dato&0x01) && (WR_VAR_GLO==0) ) 
					WR_VAR_GLO=1;
				if( (!(dato&0x01)) && (WR_VAR_GLO==1) )
					WR_VAR_GLO=0;
				
				
				//Se analiza el bit RD.
				if( (dato&0x02) && (RD_VAR_GLO==0) ) 
					RD_VAR_GLO=1;
				if( (!(dato&0x02)) && (RD_VAR_GLO==1) )
					RD_VAR_GLO=0;
			}
		}
	}
}

Continuar navegando

Materiales relacionados

sim12

User badge image

medicenslam

8 pag.
simulacion

SIN SIGLA

User badge image

Sol mar Colmenarez

sim10

User badge image

medicenslam