Últimos Tutoriales
Chat
Licencia
| Recursos del PIC -Uso del TMR0 como temporizador |
| Escrito por biblioman |
|
En esta práctica vamos a ver cómo utilizar el Timer0 con el compilador CCS.
Pero antes vamos a ver un poco de teoría:
![]()
RA4/TOCKI: cuando el temporizador trabaje como contador, los pulsos externos los recibirá a través de esta patilla.
Banco de registros específicos (SFR) del PIC 16f84A:
![]()
Como podemos ver solo están marcados de un color diferente los que están implicados en el funcionamiento del TMR0, vamos a ver la función que tienen:
![]()
Pero el PIC también permite que se produzca una interrupción por desbordamiento del TMR0. Cuando se produce una interrupción el programa abandona temporalmente lo que estaba haciendo para atender la subrutina de interrupción, pero antes guarda en una región especial de la memoria llamada pila la dirección de la siguiente instrucción de programa, para que cuando acabe la subrutina de interrupción pueda seguir ejecutando el programa por donde se había quedado.
Pues bien vamos a ver lo que significa cada uno de los bits que están implicados en la interrupción por el TMR0:
Bueno como veis hay varias variables que podemos utilizar a nuestro antojo para utilizar este recurso del PIC, la fórmula que las relaciona es la siguiente:
![]() Y para ver como funciona todo esto con el compilador CCS vamos hacer el siguiente ejemplo: Se trata de usar el Timer0 para generar una interrupción cada 32 ms utilizando el reloj interno del microcontrolador. La función de interrupción se utilizará para hacer parpadear un Led en la patilla RB7 del PIC. Para ello vamos a utilizar en el circuito un cristal de cuarzo de 4 MHz. Si nos fijamos en la formula anterior tenemos Interrupt_TMR0= 32 ms que es el valor que nos da el ejemplo, también tenemos F.Oscilador = 4 MHz y nos quedan dos valores para tener resueltas todas las variables de la ecuación el valor TMR0 que ya hemos dicho que se puede sobrescribir su valor en cualquier momento durante la ejecución del programa y el Prescaler, pues le damos el valor que queramos al Prescaler por ejemplo 256 y calculamos en la fórmula el valor que tenemos que escribir en el registro TMR0 para obtener los 32 ms: ![]()
Si despejamos el valor del TMR0 nos sale un valor de 131 que en hexadecimal es 0x83.
![]() En ella podemos ver que a la izquierda podemos seleccionar los diferentes recursos que tienen los PIC y a la derecha tenemos dos pestañas: en Options configuramos el recurso seleccionado y en la pestaña Code visualizamos el código que nos genera el asistente para ese recurso, para el ejemplo que estamos haciendo en General, lo dejamos tal y como se muestra en la figura de arriba. Si ahora hacemos clic en la pestaña code vemos el código generado por el asistente para esta opción.
![]() Inserted into .h file: no pertenece al código que se va a compilar, simplemente es una nota informativa que nos está diciendo que el código que hay mas abajo se va a insertar en el archivo de cabecera con extensión .h.
#FUSES NOWDT, XT, NOPROTECT: fuses cuya tradución literaria equivaldría a "fusibles" es una directiva que establece unas configuraciones para el PIC que son necesarias a la hora de grabar el programa en el, se pueden incluir aquí o configurarlas en el programa de grabación que utilicemos, se guardan en la memoria de programa y según la versión de PIC que utilicemos tendremos mas o menos opciones, las que aquí aparecen tienen el significado siguiente: NOWDT --> No se va a utilizar el Wachtdog. XT --> Se va a utilizar un cristal de cuarzo para la base de tiempos del reloj del PIC. NOPUT -->( Power Up Timer), cuando se configura como PUT al alimentar el circuito el Microcontrolador espera un tiempo determinado para que se estabilicen las tensiones antes de ejecutar el programa. NOPROTECT --> El código grabado en el PIC no está protegido. Hay que decir que cuando creamos un proyecto por medio del Wizard, este nos genera tres archivos, que son los que se muestran en la figura de abajo: ![]() Uno con extensión .c que es donde estará el grueso de nuestra aplicación, otro con extensión .h que es donde estarán los archivos de cabecera y otro con extensión .pjt que es el proyecto en si y que nos sirve para abrir y editarlo con el IDE del compilador Cuando compilemos y generemos nuestra aplicación aparecerán mas archivos pero estos que hemos mencionado aquí son los que necesitamos para editar nuestro código fuente.
![]() En las opciones de este recurso desmarcamos la casilla Not used del Wachtdog por que no lo vamos a utilizar, en el Timer 0 en Source seleccionamos Internal ya que vamos a utilizar los pulsos de reloj del microcontrolador y en Resolution marcamos 256 us, que es el preescaler que habíamos decidido utilizar. Vemos que las opciones del Timer 1 y el Timer 2 están deshabilitadas, ya que PIC 16f84A solo tiene el temporizador timer 0.
![]()
La primera línea como antes nos dice donde se va a insertar el código, en este caso en el archivo .C y dentro de la función principal main(). La siguiente línea es una llamada a la función setup_timer_0( parametro1|parametro2|…), que ya está declarada y definida dentro de las librerías del compilador y es utilizada para configurar el registro OPTION del PIC, como vemos acepta parámetros, con el primero RTCC_INTERNAL, le estamos diciendo que vamos a utilizar el reloj interno, lo que viene después aunque en la figura no se vea muy bien es una barra vertical “|” y es el símbolo que hay que utilizar para separar los diferentes parámetros que utilicemos, el segundo parámetro que nos ha puesto es RTCC_DIV_1);); y como veis aparece doble el cierre del paréntesis y el punto y coma, ¡¡error del asistente!!, lo que realmente tenemos que poner es esto: RTCC_DIV_256, ya que este segundo argumento le pasa a la función el valor del preescaler y queremos que sea 256. Bueno esto lo que me ha generado a mí, lo mismo a vosotros os va bien. Vemos que no podemos corregir el código aquí, lo haremos después en los archivos fuente que nos genera.
Por ultimo nos queda configurar el registro INTCON, para ello seleccionamos Interrups y en Options marcamos la casilla Timer0 overflow (usando como nombre de la interrupción TIMER0).
El código generado será el siguiente:
![]()
Como vemos la rutina de interrupción va antes de la función main y consta de la directiva del preprocesador #int_TIMER0, con esta directiva el programa sabe a que dirección de programa debe de ir cuando se dispare esta interrupción (podemos tener otras), y de la función de interrupción propiamente dicha, donde tenemos que incluir nuestro código, veámoslo aquí debajo de una forma más clara:
Void TIMER0_isr(void)
![]()
Archivo .C principal:
![]()
Pues bien este es el esqueleto de nuestra aplicación y sin escribir una línea de código. Ahora sobre esta plantilla tenemos que escribir nuestro código para hacer nuestra aplicación funcional.
En el archivo principal TMR0.C añadiremos también las sigientes líneas marcadas en negrita:
![]()
Hemos agregado una sonda de tensión y para poder ver los valores que toma en el tiempo incluimos una grafica en simulación digital. Si ampliamos la gráfica veremos que cada intervalo tiene una duración de 32 ms. Como siempre el DSN y el código fuente os lo podéis bajar desde la sección Descargas –> Apuntes -> Electrónica -> Microcontroladores -> Ejemplos prácticos programación PIC en C.
![]()
Bueno yo creo que mas mascado no puede estar, para aquellos que no conozcan el lenguaje C y les suene a chino lo que es una función y lo de pasar parámetros a una función. “No problem” en el curso de teoría se verá detenidamente.
¿Qué te ha parecido este articulo?. Comentalo please.
|
| Última actualización el Martes, 12 de Mayo de 2009 21:30 |





















