Está en la página 1de 7

Universidad Nacional de Ingeniería

Facultad de Electrotecnia y Computación


Departamento Sistemas Digitales y Telecomunicaciones
Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Carrera de Ingeniería Electrónica
Maquinas Computadoras I

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

Elaborado por: Br. Eliézer Méndez Página 1 de 7


Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Departamento Sistemas Digitales y Telecomunicaciones
Índice

Í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.

Elaborado por: Br. Eliézer Méndez Página 2 de 7


Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Departamento Sistemas Digitales y Telecomunicaciones

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?

Elaborado por: Br. Eliézer Méndez Página 3 de 7


Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Departamento Sistemas Digitales y Telecomunicaciones
4. Dispositivos Requeridos

 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

Elaborado por: Br. Eliézer Méndez Página 4 de 7


Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Departamento Sistemas Digitales y Telecomunicaciones
5. Procedimiento

5.1. Contador de pulsaciones


Cree un nuevo proyecto y en la carpeta donde lo guardo pegue los archivos
bootloaderCHF.h, 16x2_LCD_4bit_File.h y 16x2_LCD_4bit_File.c. No olvide añadirlos
al proyecto, para ello debe hacer clic derecho sobre el proyecto, clic en Add Existing Item… y
seleccione los tres archivos que deben estar en la carpeta del proyecto.

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*/

INTCON2=0x40; /* Set Interrupt on rising Edge*/


INTCONbits.INT0IF=0; /* Clear INT0IF flag*/
INTCONbits.INT0IE=1; /* Enable INT0 external interrupt*/
INTCONbits.GIE=1; /* Enable Global Interrupt*/
}
void __interrupt() ISR()
{
LED = ~(LED); /* Toggle LED on interrupt*/
Timer1_delay();
INTCONbits.INT0IF=0;
i++;
}
void Timer1_delay(void){
/* Enable 16-bit TMR1 register, 8 pre-scale, internal clock,timer OFF */
TMR1=0x15A0; /* Load count for generating delay of 40ms@48MHz */
TMR1ON = 1; /* Turn ON Timer1 */
while(TMR1IF == 0); /* Wait for Timer1 overflow interrupt flag */
TMR1ON = 0; /* Turn OFF timer */
TMR1IF = 0; /* Make Timer1 overflow flag to '0' */
}

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.

Elaborado por: Br. Eliézer Méndez Página 5 de 7


Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Departamento Sistemas Digitales y Telecomunicaciones

5.2. Generador de frecuencias


Ahora debe crear otro proyecto, siguiendo el mismo procedimiento que en el caso anterior,
sin embargo, no se utilizara la pantalla LCD. Este caso contempla la implementación de un
generador de onda cuadrada a través de interrupciones del timer0.

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 */
}

Elaborado por: Br. Eliézer Méndez Página 6 de 7


Universidad Nacional de Ingeniería
Facultad de Electrotecnia y Computación
Departamento Sistemas Digitales y Telecomunicaciones
Ahora implemente un generador de patrón binario de 8 bits serial a una frecuencia de 200 Hz
(el patrón se repite 200 veces por segundo) y por ende el timer debe generar una interrupción
16,000 veces por segundo.

6. Resultados obtenidos

En este punto el informe elaborado por los alumnos debe contener:

1. Descripción del problema a resolver por el grupo en cada actividad propuesta.


2. Código final del programa principal y de los diferentes módulos.
3. Si se exploraron soluciones alternativas, describa las mismas y efectúe las comparaciones
que se consideren necesarias.
4. Planteo de situaciones críticas que demuestren un correcto funcionamiento del programa
propuesto.
5. Dificultades encontradas y cómo se solucionaron.
6. Comentarios.

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).

Elaborado por: Br. Eliézer Méndez Página 7 de 7

También podría gustarte