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
/** @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; } } } }
Compartir