Translate

viernes, 19 de diciembre de 2008

Añadiendo librerías

El siguiente paso es añadir librerías a nuestro primer programa, como había comentado la sentencia for  del ejemplo "hola mundo" sirve para crear una pausa entre poner el PORTB a cero y poner PORTB a 1, la pausa sera lo que tarda i en recorrer 500; sin embargo no manejamos con exactitud el lapso que tarda en hacer eso.

Para poder llevar una pausa mas real, podemos hacer uso de las librerías de C18, las librerías se encuentran en el directorio de instalación del compilador y en le subdirectorio h.  Para saber de cuales librerías disponemos basta con revisar el PDF llamado MPLAB C18 C COMPILER LIBRARIES  ubicado en la subcarpeta doc  del directorio de instalación.

Para nuestro programa vamos a usar la librería delays.h  la cual posee las siguientes funciones:

Delay1TCY                       Demora 1 ciclo.
Delay10TCYx                  Demora en multiplos de 10 ciclos.
Delay100TCYx               Demora en multiplos de 100 ciclos.
Delay1KTCYx                 Demora en multiplos de 1000 ciclos.
Delay10KTCYx              Demora en multiplos de 10000 ciclos.

Exceptuando Delay1TCY, las demás funciones necesitan un argumento de tamaño byte para poder generar la pausa. En general un ciclo esta dado por 4 instrucciones del reloj, de tal forma que para sacar una pausa en términos de segundos se necesita usar la formula:

 No de ciclos = ( Pausa deseada * FOSC) / 4

Donde No de ciclos  es le argumento que necesitamos para las funciones,  Pausa deseada  es el tiempo que queremos que demore la función, FOSC  es el acrónimo a Frecuency Oscilator que esta dada por el cristal que usemos, final mente 4 son los ciclos por instrucción.

De esta manera al programa de hola mundo agreguemos un pausa de medio segundo entre los cambios de estado del PORTB.

Pausa deseada = 0.5 segundos

FOSC = 20 MHz

  No de ciclos = ( 0.5 * 20,000,000 ) / 4

 No de ciclos =  2, 500,000

Ya que los argumentos de las funciones no deben sobrepasar un byte (255) el valor máximo que podemos meter para nuestra pausa es 250 así que 250 * 10,000 = 2,500,000. De esta forma la función que nos permitirá obtener una pausa de medio segundo será Delay10KTCYx. Solo tenemos que modificar el código anterior para obtener un  blink  en todo el PORTB cada medio segundo. 

Y aquí la simulación del programa

Optimizando

Se dice optimizar cuando se trata de hacer las mismas cosas, con los menores recursos posibles, para nuestro caso sería con el menor código posible. El código anterior lo podemos optimizar de la siguiente manera:

 

Como podemos ver en el código anterior eliminamos las sentencias:

   PORTB=0;

   Delay10KTCYx(250);

Y cambiamos la sentencia:

  PORTB=255;  por la sentencia

  PORTB ^= 255;

Recordemos que el operador XOR (^) regresa 1 si los bits son complementarios de lo contrario regresa cero y al hacer 255 xor 255 regresara cero, así podemos invertir el estado de 255 a 0 en una sola linea. y el resultado final será el mismo.

No hay comentarios:

Publicar un comentario