LAC L5G1 0811011 0620761
-
Upload
jonathan-pena -
Category
Documents
-
view
202 -
download
0
Transcript of LAC L5G1 0811011 0620761
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERIA ELECTRÓNICA
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS
LABORATORIO N° 5
TEMA:TIMER 8254
CODIGO APELLIDOS Y NOMBRES NOTA
06207610811011
Tuesta Rios Ulises Peña Caceres Jonathan
HORARIO PC FECHA
OBSERVACIONES
Mayo 2013
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERÍA ELCTRÓNICA
TEMPORIZADOR (TIMER)
Revisión de conceptos teóricos
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS 2
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERÍA ELCTRÓNICA
/**********************************************************************PROGRAMA QUE PRESENTA UN RELOJ DE TIEMPO REAL QUE SE VISUALIZA EN LAESQUINA SUPERIOR IZQUIERDA DE LA PANTALLA. SE UTILIZA EL TIMER 8254COMO BASE DE TIEMPO.**********************************************************************/#include <windows.h>#include <stdio.h>#include <conio.h> #include "winio.h"
int main( void ){ unsigned char nibble; int h, m, s, pin_out; int cuenta, veinteava=0; bool bResult;
// Call InitializeWinIo to initialize the WinIo library. bResult = InitializeWinIo(); if( ! bResult) { printf("Error during initialization of WinIo.\n"); return 1; } printf( "Hora, minutos y segundos actuales?" ); scanf( "%d%d%d", &h, &m, &s); /* Programacion del timer */ cuenta = 59659; /*Cuenta para 20 Hz*/ _outp( 0x43, 0XB6 ); /*Envío de la palabra de control*/ nibble = cuenta; _outp( 0x42, nibble ); /*Envío de la parte baja de la cuenta*/ nibble = cuenta >> 8; _outp( 0x42, nibble ); /*Envío de la parte alta de la cuenta*/ nibble = _inp( 0x61 ) | 0x01; _outp( 0x61, nibble ); /*Se habilita sólo el gate del contador 2*/ /* Fin programación del timer */ do { do { _outp( 0x43, 0xE8 ); /*Read Back=11101000 (latchear Status)*/ pin_out = _inp( 0x42 ) >> 7; /*se filtra bit 7 del STATUS*/ } while( pin_out == 0 );
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS 3
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERÍA ELCTRÓNICA
do { _outp( 0x43,0xE8); /*Read Back=11101000 (latchear Status)*/ pin_out = _inp( 0x42 ) >> 7; /*se filtra bit 7 del STATUS*/ } while( pin_out == 1 );
veinteava++; /*Cada 20 cambios (0 a 1) del pin out se incrementa s en 1.*/
if( veinteava == 20 ) { veinteava = 0; s++; } if( s == 60 ) { s = 0; m++; } if( m == 60 ) { m = 0; h++; } if( h == 24 ) { h = 0; } printf( "\r%02d:%02d:%02d", h, m, s ); } while( !kbhit() );
nibble = _inp( 0x61 ) & 0xFE; _outp( 0x61, nibble ); /*Se deshabilita el gate del contador 2*/
// When you're done using WinIo, call ShutdownWinIo ShutdownWinIo();
return 0;}
PRACTICA
Escribir un programa que implemente un pequeño piano con las teclas A, S, D, F, G, H, J, K para emitir una escala completa (de DO a DO). Cada nota se emitirá por un intervalo de 0.5 segundo luego de lo cual se dejará de emitir dicha nota. Si se presiona una segunda tecla antes que termine de emitirse el sonido de la anterior, se emitirá inmediatamente la nueva nota durante el tiempo que le corresponde (cancelando la anterior).
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#include <windows.h>#include <stdio.h>#include <conio.h> #include "winio.h"//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid ConfigT0( int Frec );void ConfigT2( int Frec );void PasoUnPeriodo( void );void ActivaT2( void );void DesactivaT2( void );void ActivaOndaT2aParlante( void );void DesactivaOndaT2aParlante( void );//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXint main( void ){ /* DO, RE, MI, FA, SOL, LA, SI, DO */ char Tecla[] = {'A','S','D','F','G','H','J','K'}; int Frec[] = {262,294,330,349,392,440,494,523}; int i; char c; int Cont = 0; bool bResult; // Call InitializeWinIo to initialize the WinIo library.
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS 4
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERÍA ELCTRÓNICA
bResult = InitializeWinIo(); if( ! bResult) { printf("Error during initialization of WinIo.\n"); return 1; }
ConfigT0( 41 ); /*41 Hz*/ DesactivaOndaT2aParlante(); /*Parlante no emite ningùn tono*/ ActivaT2(); /*T2 listo para trabajar*/
while(1) { if( kbhit() ) /* Establecer si el usuario usó el teclado... */ { c = getch(); /*... sólo en ese caso, se captura tecla. */ if( c == 27 ) /* Verificar si se presionó [ESC]... */ { break; /*... en cuyo caso se sale del lazo prinicpal. */ } for( i = 0; i < 8; i++ ) /* Comprobar si se presionó alguna tecla de piano */ { if( c == Tecla[i] ) break; } if( i != 8 ) { ConfigT2( Frec[i] ); /* Configurar tono según tecla presionada..*/ ActivaOndaT2aParlante();/*... activar parlante... */ Cont = 41; /*... 41 pulsos = 1 segundo */ } } if( Cont != 0 ) { PasoUnPeriodo(); /* Comprobar el paso de un pulso..*/ Cont--; if( Cont == 0 ) /*... y si se ha completado la cuenta... */ DesactivaOndaT2aParlante(); /*... apagar el parlante */ } } DesactivaOndaT2aParlante(); DesactivaT2(); // When you're done using WinIo, call ShutdownWinIo ShutdownWinIo(); return 0;}
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS 5
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERÍA ELCTRÓNICA
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid ConfigT0( int Frec ){
unsigned char byte;int frec;_outp(0X43, 0X36); frec = (1193182/Frec);byte = frec;_outp(0X40, byte); byte = frec>>8; _outp(0X40, byte);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid ConfigT2( int Frec ){
unsigned char byte;int frec;_outp(0X43, 0XB6); frec = (1193182/Frec);byte = frec;_outp(0X42, byte);byte = frec>>8;_outp(0X42, byte); byte = _inp(0X61)|0X01;_outp(0X61, byte);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid PasoUnPeriodo( void ){
int pin_out; do { _outp(0x43,0xE2); pin_out= _inp(0x40) >> 7; } while(pin_out == 0);
do { _outp(0x43,0xE2); pin_out= _inp(0x40) >> 7; } while(pin_out == 1);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid ActivaT2 ( void ){
unsigned char byte;byte = _inp(0X61)|0X01;
_outp(0X61, byte);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS 6
UNIVERSIDAD TECNOLÓGICA DEL PERÚFACULTAD DE INGENIERÍA ELCTRÓNICA
void DesactivaT2 ( void ){
unsigned char byte;byte = _inp(0X61)&0XFE;
_outp(0X61, byte);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid ActivaOndaT2aParlante( void ){
unsigned char byte;byte = _inp(0X61)|0X02;
_outp(0X61, byte);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXvoid DesactivaOndaT2aParlante( void ){
unsigned char byte;byte = _inp(0X61)&0XFD;
_outp(0X61, byte);
}//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
LABORATORIO DE ARQUITECTURA DE COMPUTADORAS 7