/*------------------------------------------------------------------- ** ** Soluciones del examen de Programación de Sistemas y Dispositivos ** Curso 2015-16, Convocatoria de Junio, 21 de junio de 2016 ** **-----------------------------------------------------------------*/ /*------------------------------------------------------------------- ** Ejercicio 1 **-----------------------------------------------------------------*/ #include #include #include #include #include void isr_tick( void ) __attribute__ ((interrupt ("IRQ"))); volatile boolean flag; void main( void ) { sys_init(); uart0_init(); rtc_init(); flag = FALSE; rtc_open( isr_tick, 127 ); while( 1 ) if( flag ) { uart0_puts( "Ha transcurrido una hora.\n" ); flag = FALSE; } } void isr_tick( void ) { static uint16 numSecs = 0; if( ++numSecs == 3600 ) { numSecs = 0; flag = TRUE; } I_ISPC = BIT_TICK; } /*------------------------------------------------------------------- ** Ejercicio 2 **-----------------------------------------------------------------*/ #include #define QM 8 ufix16 circumference( ufix16 radius ) { const ufix16 doublePi = TOFIX( ufix16, 2*3.141592654, QM ); return FMUL( doublePi, radius, QM ); } /*------------------------------------------------------------------- ** Ejercicio 3 **-----------------------------------------------------------------*/ #include #include #include void uart0_portDump( uint32 portConfAddr ) { uint32 pConf; uint8 i; switch( portConfAddr ) { case (uint32)&PCONA: uart0_puts( "CONFIGURACION DEL PUERTO A\n" ); pConf = PCONA; for( i=0; i<10; i++ ) { uart0_puts( "Pin " ); uart0_putint( i ); switch( pConf & 0x1 ) { case 0: uart0_puts( ": salida\n" ); break; default: uart0_puts( ": interno\n" ); break; } pConf >>= 1; } break; case (uint32)&PCONB: break; case (uint32)&PCONC: uart0_puts( "CONFIGURACION DEL PUERTO C\n" ); pConf = PCONC; for( i=0; i<16; i++ ) { uart0_puts( "Pin " ); uart0_putint( i ); switch( pConf & 0x3 ) { case 0: uart0_puts( ": entrada\n" ); break; case 1: uart0_puts( ": salida\n" ); break; default: uart0_puts( ": interno\n" ); break; } pConf >>= 2; } break; case (uint32)&PCOND: break; case (uint32)&PCONE: break; case (uint32)&PCONF: break; case (uint32)&PCONG: break; default: uart0_puts( "Direccion de puerto erronea\n" ); break; } }