Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Práctica de laboratorio Nº 4
Programación en Lenguaje C del microcontrolador PIC
18F4550 en el entorno MPLAB X
Interrupciones. Temporizadores.
Autor/es:
Grupo Nº
Nº de carnet Nombre y Apellido Calificación
Agosto 2019
Índice ........................................................................................................................................ 2
1. Introducción ..................................................................................................................... 2
2. Objetivos .......................................................................................................................... 3
3. Actividades Previas .......................................................................................................... 3
4. Dispositivos Requeridos ................................................................................................... 4
5. Procedimiento................................................................................................................... 5
6. Resultados obtenidos ........................................................................................................ 7
7. Conclusiones .................................................................................................................... 7
8. Bibliografía....................................................................................................................... 7
1. Introducción
Los PIC de la familia 18F disponen de 17 o 18 fuentes de interrupción, según el modelo, ordenadas
en dos prioridades, que se denominan alta y baja. Cada prioridad tiene su propio vector de
interrupción, siendo el de alta el 0008h y el de baja el 0018h. Los eventos de interrupción de alta
prioridad podrán interrumpir las posibles interrupciones de baja prioridad en progreso. Al
producirse una interrupción, la dirección de retorno se guardará en la pila y el PC se cargará con
el vector correspondiente. Destacan en el PIC18F4550 los Registros INTCON, PIE e IPR.
Hay un tipo de interrupción muy utilizado que es la interrupción externa. Se produce en cualquiera
de los 3 pines dedicados (INT0, INT1, INT2) en el puerto B cuando se da una de las condiciones
de disparo (Flanco de Subida, Flanco de Bajada, Cambio de Estado, Nivel Alto o Nivel Bajo).
Por otro lado, los modelos de la familia PIC18Fxx20 disponen de 5 temporizadores, denominados
TMR0, TMR1, TMR2, TMR3 y TMR4, dos de ellos de 8 bits y tres de 16. El PIC18F4550 tiene
solo 4 temporizadores, del 0 al 3. En la presente guía abordaremos el Timer0, siendo el uso de los
otros, análogo al uso de este.
El TMR0 puede funcionar como temporizador o como contador de eventos en modo de 8 o 16 bits.
Los registros para llevar el contaje son TMR0H:TMR0L y su registro de control T0CON. Este
último registro es el encargado de controlar todos los aspectos de funcionamiento del módulo como
son su encendido/apagado, funcionamiento en 8/16 bits, selección del reloj interno/externo, flanco
del pulso en reloj externo y selección del prescaler.
2. Objetivos
Generar interrupciones por señales externas y programar retardos de tiempo por medio de
Timers como recursos para la realización de aplicaciones sensibles al tiempo en sistemas
embebidos.
3. Actividades Previas
Montar en una breadboard el circuito que se muestra en la figura siguiente. No olvide que
además debe incluir la circuitería necesaria para usar el bootloader USB. Lea las
secciones correspondientes a los puertos de entrada y salida en la hoja de datos del
PIC18F4550. Adicionalmente se recomienda la lectura de las paginas 259-265 y 288-295
del libro de texto “Micrcontroladores PIC. Diseño práctico de aplicaciones 2da Parte”.
Preguntas de control
1. Verdadero o falso: ¿El timer0 solo puede ser usado como Timer de 16 bits?
2. ¿Qué valor se debe cargar en TMR0H y TMR0L para generar un retardo de 2 ms?
1 Breadboard
1 PIC18F4550
1 Cristal de 20MHz
2 Capacitores de 22 pF
1 Capacitor de 470 nF
1 Resistor de 4.7 kOhm
3 Resistores de 330 Ohm
3 LED de 5mm
2 Push button
1 Cable USB Tipo A con su otro extremo acondicionado para breadboard
Pantalla LCD 16x2
Osciloscopio
Ahora cree un nuevo archivo fuente y pegue el código que está en el recuadro. No olvide
realizar la configuración del parámetro codeoffset en las opciones del Linker.
#include "bootloaderCHF.h"
#include "16x2_LCD_4bit_File.h"
#include <stdio.h>
#define LED LATC0
volatile char i;
char conteo[5];
void ExternalInterruptInit(void);
void Timer1_delay();
void main(void) {
TRISC0=0; /* Make PORTC.0 as output*/
LED=0;
T1CON=0xB0; /*configura el timer1 para funcionar con presscaler 8 */
LCD_Init();
ExternalInterruptInit(); /* Initialize External Interrupt*/
LCD_String_xy(1,1,"Pulsaciones");
while(1){
sprintf(conteo,"%3d",i); //convierte i a un string decimal almcenado
// en el arreglo conteo
LCD_String_xy(2,0,conteo); //imprime la cuenta
}
}
void ExternalInterruptInit()
{
TRISBbits.TRISB0=1; /* Make INT0 pin as an input pin*/
Añada un segundo botón en el pin INT1 que aumente la cuenta de decena en decena. Dentro
de la ISR asegúrese de verificar el origen de la interrupción para saber en qué cantidad
aumentar la cuenta.
Para generar una periodo especifico es necesario seguir las siguientes ecuaciones.
𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟
𝑃𝑒𝑟𝑖𝑜𝑑𝑜𝑇𝑖𝑚𝑒𝑟 =
𝐹𝑜𝑠𝑐/4
El prescaler se selecciona configurando los bits correspondientes del registro T0CON. A
menudo más de un valor del prescaler funciona para la frecuencia deseada, pero en general, a
mayor la frecuencia deseada, menor debe ser el prescaler.
𝐷𝑒𝑙𝑎𝑦𝐷𝑒𝑠𝑒𝑎𝑑𝑜
𝐶𝑢𝑒𝑛𝑡𝑎 =
𝑃𝑒𝑟𝑖𝑜𝑑𝑜𝑇𝑖𝑚𝑒𝑟
Si el valor obtenido es fraccionario y menor que 16000, puede probarse con un valor de
prescaler menor. Por último, el valor que se debe cargar en el registro de conteo del timer
TMR0 viene dado por:
𝑇𝑀𝑅0 = 65536 − 𝐶𝑢𝑒𝑛𝑡𝑎
Como ejemplo trataremos de generar una señal cuadrada de 5 Hz, cuyo periodo es de 200 ms,
es decir, 100 ms por cada estado. Utilizado un prescaler de 256 se obtiene un PeriodoTimer =
1/46875 y una Cuenta de 4687.5, lo que sugiere el uso de un prescaler de menor valor, que
puede ser 128. De esta manera, repitiendo el ejercicio se obtiene una nueva cuenta de 9375.
Por lo tanto, el valor que debe cargarse en el timer es 56161. Así o muestra el código fuente.
#include "bootloaderCHF.h"
void Timer0_start(void);
void main()
{
//OSCCON=0x72; /* Configure oscillator frequency to 8MHz */
TRISC &= 0xFE; /* Set bits 0 and 1 as output */
LATC |= 0x01; /* send high on pins RC0 and RC1 */
Timer0_start();
while(1);
}
void __interrupt(high_priority) Timer0_ISR()
{
TMR0 = 56161;
LATCbits.LATC0 = ~LATCbits.LATC0;
TMR0IF=0; /* Make Timer1 Overflow Flag to '0' */
}
void Timer0_start(void)
{
GIE=1; /* Enable Global Interrupt */
PEIE=1; /* Enable Peripheral Interrupt */
TMR0IE=1; /* Enable Timer0 Overflow Interrupt */
TMR0IF=0;
T0CON=0x06; /* Enable 16-bit TMR1 Register,No pre-scale,use internal clock,Timer OFF */
TMR0=56161; /* Load Count for generating delay of 100ms */
TMR0ON=1; /* Turn-On Timer0 */
}
6. Resultados obtenidos
7. Conclusiones
Los alumnos redactarán sus conclusiones, referidas a las tareas abordadas y los resultados
obtenidos. Estas conclusiones incluirán la evaluación realizada por el equipo de trabajo
respecto de la solución alcanzada, destacando sus ventajas y limitaciones.
8. Bibliografía
Los alumnos incluirán toda la bibliografía consultada para la realización del práctico y
estudio de los temas relacionados. La misma deberá incluir una referencia completa del
material utilizado (Título, autor, año, editorial, capítulos de interés, si es un sitio web o material
accedido desde uno, la URL completa).