0% encontró este documento útil (0 votos)
43 vistas8 páginas

Librerías y manejo de interrupciones en PIC

Cargado por

max tr
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
43 vistas8 páginas

Librerías y manejo de interrupciones en PIC

Cargado por

max tr
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Facultad de Tecnología Electrónica y Telecomunicaciones

Laboratorio de microprocesadores I Paralelo A

Librerías propias y creadas por el usuario


1 Objetivo
 Efectuar de las librerías que posee el compilador.
 Elaborar librerías propias.
 Efectuar técnicas de manejo de display de 7 segmentos.

2 Base teórica
2.1 Manejo de interrupciones con PicC compiler.
El manejo de interrupciones en PicC compiler es bastante amigable ya que se disponen
de funciones que efectúan todo el trabajo de configuración, las funciones son:

void enable_interrupts(int32 interrupt): Habilita las interrupciones.

void disable_interrupts(int32 interrupt): Deshabilita las interrupciones.

void clear_interrupt(int32 interrupt): Borra la bandera de interrupción

int1 interrupt_active(int32 interrupt): Verifica si la bandera de interrupción esta activa

int1 interrupt_enabled(int32 interrupt): Verifica si una alguna interrupción está habilitada.

Las constantes que van como parámetro de estas funciones son (para pic18):

GLOBAL INT_EXT2
PERIPH INT_RB
INT_RTCC INT_AD
INT_TIMER0 INT_RDA
INT_TIMER1 INT_TBE
INT_TIMER2 INT_SSP
INT_TIMER3 INT_CCP1
INT_EXT_L2H INT_CCP2
INT_EXT_H2L INT_BUSCOL
INT_EXT INT_LOWVOLT
INT_EXT1_L2H INT_COMP
INT_EXT1_H2L INT_EEPROM
INT_EXT1 INT_OSCF
INT_EXT2_L2H INT_SPP
INT_EXT2_H2L INT_USB

Ejemplo

enable_interrupts(GLOBAL); //Habilita las interrupciones


enable_interrupts(INT_TIMER0);//Activa la interrupción del temporizador 0

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A
enable_interrupts(INT_TIMER1);//Activa la interrupción del temporizador 1

2.1.1 Rutina de servicio a la interrupción (ISR).


La rutina de servicio a la interrupción es un trozo de código que se ejecuta cuando la
interrupción se dispara. En PicC compiler, se usa una directiva que identifica a la interrupción
para luego colocar la rutina respetiva.

Ejemplo.

# INT_TIMER0//directiva que identifica a la interrupción del temporizador 0


Void isr_temporizador0()
{
… //Rutina
}
# INT_TIMER1//directiva que identifica a la interrupción del temporizador 1
Void isr_temporizador1()
{
… //Rutina
}

Nota 1. En PicC compiler no es necesario efectuar la verificación de las banderas de


interrupción en la dirección del vector de interrupción y tampoco borrar la bandera de
interrupción en cada rutina de atención a la interrupción ya que el compilador lo hace
internamente.

Nota 2. Si dos o más interrupciones se disparan al mismo tiempo, la forma de elegir cual
se ejecutará primero se puede hacer mediante la directiva #priority

2.2 Revisar en el libro de referencia o en internet los siguientes puntos.


 Como crear librerías en C
 Que función cumplen los archivos *.h y *.c en lenguaje C.
 Manejo de vectores o array en C.

3 Investigación
¿Qué son la prioridad en las interrupciones de pic 18?

¿Qué es una matriz de leds?

4 Desarrollo del laboratorio


Ejemplo 1

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A
Programa que efectúa tres tareas mediante el uso de interrupciones temporizadas. Las tareas
son: contador en LCD con intervalo de tiempo de 0.5s, parpadeo de led a un ritmo de 0.1s y
parpadeo de led a un ritmo de 0.3s.

Archivo *.h

#include <18F4550.h>
#device ADC=10
/*****************************************************************************/
#FUSES NOWDT //No Watch Dog Timer
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES PUT //Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV46 //Brownout reset at 4.6V
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWRT //Program memory not write protected
#FUSES NOEBTR //Memory not protected from table reads
/*****************************************************************************/
#use delay(clock=48MHz,crystal=20MHz)
/*****************************************************************************/
#define LCD_ENABLE_PIN PIN_E2
#define LCD_RS_PIN PIN_E0
#define LCD_RW_PIN PIN_E1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include <lcd.c>
/*****************************************************************************/
#define led1 pin_c0
#define led2 pin_a0
/*****************************************************************************/

Archivo *.c

#include "mainEjemplo1.h"
/*****************************************************************************/
#INT_TIMER0
void TIMER0_isr(void)
{
static unsigned int8 contador;

set_timer0(18661);
lcd_gotoxy(11, 1);
printf(lcd_putc, "%03u", contador++);
}
/*****************************************************************************/
#INT_TIMER1
void TIMER1_isr(void)
{
static unsigned int8 m;

set_timer1(1250);
if(++m == 7)
{
output_toggle(led1);
m = 0;
}
}
/*****************************************************************************/
#INT_TIMER3
void TIMER3_isr(void)

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A
{
static unsigned int8 n;

set_timer3(15536);
if(++n == 3)
{
output_toggle(led2);
n = 0;
}
}
/*****************************************************************************/
void main()
{
set_timer0(18661);//carga del temporizador 0 para una interrupcion cada 0.5s
set_timer1(1250); //carga del temporizador 0 para una interrupcion cada 0.3s
set_timer3(15536);//carga del temporizador 0 para una interrupcion cada 0.1s

setup_timer_0(T0_INTERNAL | T0_DIV_128);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); //x7
setup_timer_3(T3_INTERNAL | T3_DIV_BY_8); //x3

enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);

lcd_init();
lcd_putc("Contador:");

while(TRUE);
}
/*****************************************************************************/

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A
Ejemplo 2

Programa contador de 0 a 9999 mostrado en 4 displays de 7 segmentos cátodo común usando


decodificador BCD a 7 segmentos.

Archivo *.h

#include <18F4550.h>
#device ADC=10
/*****************************************************************************/
#FUSES NOWDT //No Watch Dog Timer
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES PUT //Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV46 //Brownout reset at 4.6V
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWRT //Program memory not write protected
#FUSES NOEBTR //Memory not protected from table reads
/*****************************************************************************/
#use delay(clock=48MHz,crystal=20MHz)
/*****************************************************************************/
char contadorTxt[6];
/*****************************************************************************/

Archivo *.c

#include "mainEjemplo2.h"
/*****************************************************************************/
#INT_TIMER3
void TIMER3_isr(void)
{
static unsigned int8 n;
unsigned int8 numero;
const char digitos[] = {0x0E,0x0D,0x0B,0x07}; //{1, 2, 4, 8};

set_timer3(5536);
numero = contadorTxt[n + 1];
numero &= 0x0f;
numero <<= 4;
output_d(numero | digitos[n++]);
n &= 0x03;
}
/*****************************************************************************/
void main()
{
unsigned int16 contador = 0;
//char contadorTxt[6];

set_timer3(5536);//carga del temporizador 0 para una interrupcion cada 5ms


setup_timer_3(T3_INTERNAL | T3_DIV_BY_1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);

while(TRUE)
{
if(contador > 9999) contador = 0;
sprintf(contadorTxt, "%05Lu", contador++);
delay_ms(200);
}
}
/*****************************************************************************/

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A

Ejemplo 3

Programa contador de 0 a 9999 mostrado en 4 displays de 7 segmentos cátodo común usando


decodificador por código.

Archivo *.h

#include <18F4550.h>
#device ADC=10
/*****************************************************************************/
#FUSES NOWDT //No Watch Dog Timer
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES PUT //Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV46 //Brownout reset at 4.6V
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOWRT //Program memory not write protected
#FUSES NOEBTR //Memory not protected from table reads
/*****************************************************************************/
#use delay(clock=48MHz,crystal=20MHz)
/*****************************************************************************/
char contadorTxt[6];
/*****************************************************************************/

Archivo *.c

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A
#include "mainEjemplo3.h"
/*****************************************************************************/
#INT_TIMER3
void TIMER3_isr(void)
{
static unsigned int8 n;
unsigned int8 numero;
const char display_cc[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
const char digitos[] = {0x0E,0x0D,0x0B,0x07}; //{1, 2, 4, 8};

set_timer3(5536);
numero = contadorTxt[n + 1];
numero &= 0x0f;
output_d(255);
output_b(display_cc[numero]);
output_d(digitos[n++]);
n &= 0x03;
}
/*****************************************************************************/
void main()
{
unsigned int16 contador = 0;
//char contadorTxt[6];

set_timer3(5536);//carga del temporizador 0 para una interrupcion cada 5ms


setup_timer_3(T3_INTERNAL | T3_DIV_BY_1);
enable_interrupts(INT_TIMER3);
enable_interrupts(GLOBAL);

while(TRUE)
{
if(contador > 9999) contador = 0;
sprintf(contadorTxt, "%05Lu", contador++);
delay_ms(200);
}
}
/*****************************************************************************/

Docente: Lic. Henry Alcón Choque


Facultad de Tecnología Electrónica y Telecomunicaciones
Laboratorio de microprocesadores I Paralelo A

Programa 1

Efectuar un programa que contador de pulsos generados por un pulsador que estará
conectado al pin 0 del puerto A, el conteo debe verse en cuatro displays de 7 segmentos
cátodo común.

Programa 2

Efectuar dos contadores independientes cada uno con un tiempo de incremento de 1s y


0.5s respectivamente. Ambos contadores serán de 00 a 99.

Docente: Lic. Henry Alcón Choque

También podría gustarte