Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Abstract—En esta práctica se dará a conocer el proceso del • Memoria ROM: 8Kb.
desarrollo de un programa para realizar un cronometro, asi como • Pines I/O: 33
también un contador y un relojel reloj con su respectivo alarma • Frecuencia: 20 MHz con cristal externo
y ajuste de horas y minutosun contador de -99999 a 99999. • Permite programación ICSP
I. INTRODUCCIÓN
Frecuencia de operación 0-20 MHz.
Oscilador interno de alta precisión.
En el siguiente documento se encuentra el desarrollo de una
secuencia de luces, el pic 16f877A es programado en el Calibrado de fábrica
software micro C y ahí es donde se da una secuencia de Rango de frecuencia de 8MHz a 31KHz
encendido de leds, al simular el circuito en proteus se verifica seleccionado por software.
el funcionamiento de la secuencia, y es ese diagrama que se Voltaje de la fuente de alimentación de 2.0V a
arma. Una vez que el pic ha sido grabado se podrá verificar 5.5V.
el funcionamiento físico de la práctica.
Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz)
II. OBJETIVOS 50nA (en modo de espera)
1. Realizar un programa de que nos permita visualizar Ahorro de energía en el Modo de suspensión
un reloj, cronometro y un contador. Brown-out Reset (BOR) con opción para controlar por software
2. Diseñar un circuito usando el pic 16f877A. 33 pines de entrada/salida memoria ROM de 8K con tecnología
3. Verificar el funcionamiento del circuito diseñado. FLASH
4. Realizar esquemas y diagramas de flujo para explicar El chip se puede re-programar hasta 100.000 veces
el funcionamiento del programa. Opción de programación serial en el circuito
El chip se puede programar incluso incorporado en el
III. MARCO TÉORICO dispositivo destino.
PIC 16F877A
256 bytes de memoria EEPROM
Es un microcontrolador de Microchip Technology fabricado en Los datos se pueden grabar más de 1.000.000 veces
tecnología CMOS, su consumo de potencia es muy bajo y 368 bytes de memoria RAM
además es completamente estático (esto quiere decir que el reloj Convertidor A/D:
puede detenerse y los datos de memoria no se pierden) capaz de 14 canales resolución de 10 bits 3 temporizadores/contadores
realizar diferentes actividades que requieran del procesamiento independientes
de datos digitales y del control y comunicación digital de Temporizador perro guardián
diferentes dispositivos. Módulo comparador analógico con
Dos comparadores analógicos
Características. Referencia de voltaje fija (0.6V)
Referencia de voltaje programable en el chip
Microcontrolador PIC 16F877A de 8 bits fabricado por Módulo PWM incorporado
Microchip. Módulo USART mejorado
Soporta las comunicaciones seriales RS-485, RS-232 y LIN2.0
• Memoria RAM: 368 x 8 bytes Auto detección de baudios
Universidad Politécnica Salesiana-Sede Cuenca. 2
Cristal de cuarzo.
/* En esta practica se aprende el funcionamiento basico asi sbit HAB_DEC_M at RA5_bit; //Pin de habilitacion de
como la configuracion de los pines que tenemos dentro del decenas de mil en RA5
PIC */ sbit HAB_CEN_M at RE2_bit; //Pin de habilitacion de
/* 1 Definicion de BITS-PINES (ALIAS) Y CONSTANTES centenas de mil en RE2
(SE SUELEN INCUIR LOS ARCHIVOS DE CABECERA /*===========================================
SON ARCHIVOS QUE CONTIENEN LAS LIBRERIAS DE ===================================
INSTRUCCIONES ) 2. DEFINICIÓN DE VARIABLES GLOBALES, TYPEDEF,
============================================ ESTRUCTURAS
=================== */ ============================================
sbit SW7 at RB7_bit; // SWITCH CONECTADO AL PIN ==================================*/
RB7 bit PUL_CON; //variable bandera para conteo
sbit SW6 at RB6_bit; // SWITCH CONECTADO AL PIN ascendente-descendente
RB6 unsigned char UNI=0; //variable que carga el dato a
sbit SW5 at RB5_bit; // SWITCH CONECTADO AL PIN visualizar en el display de unidades
RB5 unsigned char DEC=0; //variable que carga el dato a
sbit SW4 at RB4_bit; // SWITCH CONECTADO AL PIN visualizar en el display de unidades
RB4 unsigned char CEN=0; //variable que carga el dato a
sbit PB3 at RB3_bit; // PULSANTE COMECTADO AL PIN visualizar en el display de unidades
RB3 unsigned char UNI_M=0; //variable que carga el dato a
sbit PB2 at RB2_bit; // PULSANTE COMECTADO AL PIN visualizar en el display de unidades
RB2 unsigned char DEC_M=0; //variable que carga el dato a
sbit PB1 at RB1_bit; // PULSANTE COMECTADO AL PIN visualizar en el display de unidades
RB1 unsigned char CEN_M=0; //variable que carga el dato a
sbit PB0 at RB0_bit; // PULSANTE COMECTADO AL PIN visualizar en el display de unidades
RB0
sbit LED_OP_REL at RC7_bit; //led conectado al pin RC7 signed char CN_UNI=0; //variable que contiene las unidades
indica el funcionamiento del reloj/alarma del contador
sbit LED_OP_CRO at RC6_bit; //led conectado al pin RC6 signed char CN_DEC=0; //variable que contiene las decenas
indica el funcionamiento del cronometro del contador
sbit LED_OP_CON at RC5_bit; //led conectado al pin RC5 signed char CN_CEN=0; //variable que contiene las
indica el funcionamiento del contador centenas del contador
sbit LED_MO_REL at RC4_bit; //led conectado al pin RC4 signed char CN_UNIM=0; //variable que contiene las
indica seleccion modo configuracion reloj unidades de mil del contador
sbit LED_MO_ALA at RC3_bit; //led conectado al pin RC3 signed char CN_DECM=0; //variable que contiene las
indica seleccion modo configuracion alarma decenas de mil del contador
sbit LED_CN_LOAD at RC2_bit; //led conectado al pin signed char CN_SIGN=0; //variable que contiene EL SIGNO
RC2 indica carga de datos al contador
//sbit LED_CN_UP at RC1_bit; //led conectado al pin RC1
indica conteo ascendente unsigned char CR_UNI=0; //variable que contiene las
centósimas de segundo del cronómetro
//sbit LED_CN_DOWN at RC0_bit; //led conectado al pin
RC0 indica conteo descendente unsigned char CR_DEC=0; //variable que contiene las
dócimas de segundo del cronómetro
sbit BUZ_REL at RA4_bit; //pin de habilitación del
buzzer y relój unsigned char CR_CEN=0; //variable que contiene las
unidades de los segundos del cronómetro
sbit HAB_UNI at RA0_bit; //Pin de habilitacion de las
unidades en RA0 unsigned char CR_UNIM=0; //variable que contiene las
unidades de los segundos del cronómetro
sbit HAB_DEC at RA1_bit; //Pin de habilitacion de las
decenas en RA1 unsigned char CR_DECM=0; //variable que contiene las
unidades de los minutos del cronómetro
sbit HAB_CEN at RA2_bit; //Pin de habilitacion de las
centenas en RA2 unsigned char CR_CENM=0; //variable que contiene las
decenas de los minutos del cronómetro
sbit HAB_UNI_M at RA3_bit; //Pin de habilitacion de
unidades de mil en RA3
Universidad Politécnica Salesiana-Sede Cuenca. 5
case 2: HAB_UNI_M=0;
HAB_CEN_M=0; HAB_CEN=0;
HAB_DEC_M=0; HAB_DEC=0;
HAB_UNI_M=0; HAB_UNI=0;
HAB_CEN=0; CNT_MUX=0;
HAB_DEC=1; //habilita el display de las decenas PTR=CEN_M; //carga el óndice del vector de datos con
HAB_UNI=0; CEN_M
PTR=DEC; //carga el óndice del vector de datos con break;
DEC default:
break; CNT_MUX=0;
case 3: break;
HAB_CEN_M=0; }
HAB_DEC_M=0; PORTD=gVectorDatos[PTR]; //carga el código 7 segmentos
HAB_UNI_M=0; en los displays
HAB_CEN=1; //habilita el display de las centenas TMR0=0x27; //este valor permite obtener una base de
tiempo de 2.778ms
HAB_DEC=0;
}
HAB_UNI=0;
/*-------------------------------------------------------------------------
PTR=CEN; //carga el óndice del vector de datos con -----
CEN
4.3. Subrutina de la interrupción de TIMER1
break;
---------------------------------------------------------------------------
case 4: ---*/
HAB_CEN_M=0; void gSubTmr1(void){ //Reloj/Alarma
HAB_DEC_M=0; //selección de reloj
HAB_UNI_M=1; //habilita el display de las unidades de RE_UNI++; //segundos unidades
mil
if(RE_UNI>=10){
HAB_CEN=0;
RE_UNI=0;
HAB_DEC=0;
RE_DEC++; //segundos decenas
HAB_UNI=0;
if(RE_DEC>=6){
PTR=UNI_M; //carga el óndice del vector de datos con
UNI_M RE_DEC=0;
break; RE_CEN++; //minutos unidades
case 5: if(RE_CEN>=10){
HAB_CEN_M=0; RE_CEN=0;
HAB_DEC_M=1; //habilita el display de las decenas de RE_UNIM++; //minutos decenas
mil if(RE_UNIM>=6){
HAB_UNI_M=0; RE_UNIM=0;
HAB_CEN=0; RE_DECM++; //horas decenas
HAB_DEC=0; if(RE_DECM>=10 && RE_CENM<=1){
HAB_UNI=0; RE_DECM=0;
PTR=DEC_M; //carga el óndice del vector de datos con RE_CENM++; //horas centenas
DEC_M }
break; if(RE_DECM==4 && RE_CENM==2){
case 6: RE_DECM=0;
HAB_CEN_M=1; //habilita el display de las centenas de RE_CENM=0;
mil
}
HAB_DEC_M=0;
Universidad Politécnica Salesiana-Sede Cuenca. 7
} if(CR_CENM>=6){
} CR_CENM=0;
} }
} }
if (AL_CENM==RE_CENM){ //Alarma horas decenas }
if (AL_DECM==RE_DECM){ //Alarma horas }
unidades }
if (AL_UNIM==RE_UNIM){ //Alarma minutos }
decenas
TMR2=0x00; //valor inicial del Timer 2
if (AL_CEN==RE_CEN){ //Alarma minutos
unidades PR2=0xDE; //este valor permite obtener una base de
tiempo de 9.9904ms
BUZ_REL=1;
}
}
/*-------------------------------------------------------------------------
else{ -----
BUZ_REL=0; 4.5. Subrutina de Conteo
} ---------------------------------------------------------------------------
} ---*/
} void gContUpDown(void) {
}
TMR1H=0x80; //este valor permite obtener una base de }
tiempo de 1seg. /*-------------------------------------------------------------------------
TMR1L=0x00; //este valor permite obtener una base de -----
tiempo de 1seg. 4.5. Subrutina de la interrupción externa
} ---------------------------------------------------------------------------
/*------------------------------------------------------------------------- ---*/
----- void gIgualar(void){
4.4. Subrutina de la interrupción de TIMER2 PB3_RE++;
--------------------------------------------------------------------------- if(PB3_RE==1) { //IGUALAR HORAS
---*/
LED_OP_CON=1; //led contador apagado
void gSubTmr2(void){
LED_OP_CRO=0; //led cronómetro apagado
CR_UNI++;
LED_OP_REL=1; //led reloj encendido
if (CR_UNI>=10){
}
CR_DEC++;
if(PB3_RE==2) { //IGUALAR MINUTOS
CR_UNI=0;
PB3_RE=0;
if(CR_DEC>=10){
LED_OP_CON=0; //led contador apagado
CR_CEN++;
LED_OP_CRO=1; //led cronómetro apagado
CR_DEC=0;
LED_OP_REL=1; //led reloj encendido
if(CR_CEN>=10){
}
CR_UNIM++;
if(PB3_RE==3) { //POR EFECTO DE REBOTE PUEDE
CR_CEN=0; LLEGAR A PB3
if(CR_UNIM>=6){ PB3_RE=0;
CR_UNIM=0; LED_OP_CON=0; //led contador apagado
CR_DECM++; LED_OP_CRO=0; //led cronómetro encendido
if(CR_DECM>=10){ LED_OP_REL=1; //led reloj apagado
CR_DECM=0; }
CR_CENM++;
Universidad Politécnica Salesiana-Sede Cuenca. 8
} break;
/*------------------------------------------------------------------------- case 2:
----- CR_UNI=0;
4.6. Subrutina de manejo del PB1_CR CR_DEC=0;
--------------------------------------------------------------------------- CR_CEN=0;
---*/
CR_UNIM=0;
void gManejoPB1_T2(void){
CR_DECM=0;
switch(PB1_CR){
CR_CENM=0;
case 1:
PB2_CR=0;
TMR2ON_bit=1;
break;
UNI=CR_UNI;
case 3:
DEC=CR_DEC;
PB2_CR=0;
CEN=CR_CEN;
break;
UNI_M=CR_UNIM;
default:
DEC_M=CR_DECM;
break;
CEN_M=CR_CENM;
}
if(PB2_CR==1){
}
PB2_CR=0;
/*===========================================
}
5 DEFINICION DE LAS SUBRUTINAS DE LAS SUB'S
break; INTERRUPT Y/O INTERRUPT_LOW
case 2: =======================================*/
UNI=CR_RG_UNI; void interrupt(void) {
DEC=CR_RG_DEC; GIE_bit=0; //deshabilitación global de las interrupciones
CEN=CR_RG_CEN; if(INTE_bit && INTF_bit) {
UNI_M=CR_RG_UNIM; INTE_bit=0; //deshabilita la interrupción externa
DEC_M=CR_RG_DECM; gSubInt(); //llama a la subrutina gSubInt()
CEN_M=CR_RG_CENM; INTF_bit=0; //borra la bandera de la interrupción externa
PB1_CR=1; INTE_bit=1; //habilita la interrupción externa
break; }
case 3: if(TMR2IE_bit && TMR2IF_bit) {
PB1_CR=1; TMR2IE_bit=0; //deshabilita la interrupción del Timer 2
break; gSubTmr2(); //llama a la subrutina gSubTmr2()
default: TMR2IF_bit=0; //borra la bandera de interrupción del
break; Timer 2
} TMR2IE_bit=1; //habilita la interrupción del Timer 2
} }
/*------------------------------------------------------------------------- if(TMR1IE_bit && TMR1IF_bit) {
----- TMR1IE_bit=0; //deshabilita la interrupción del Timer 1
4.7. Subrutina de manejo del PB2_CR gSubTmr1(); //llama a la subrutina gSubTmr1()
--------------------------------------------------------------------------- TMR1IF_bit=0; //borra la bandera de interrupción del
---*/ Timer 1
void gManejoPB2_T2(void){ TMR1IE_bit=1; //habilita la interrupción del Timer 1
switch(PB2_CR){ }
case 1: if(TMR0IE_bit && TMR0IF_bit) {
TMR2ON_bit=0; TMR0IE_bit=0; //deshabilita la interrupción del Timer 0
Universidad Politécnica Salesiana-Sede Cuenca. 9
gSubTmr0(); //llama a la subrutina gSubTmr0() PS2_bit=1; //bit de configuración del prescaler 1:64
TMR0IF_bit=0; //borra la bandera de interrupción del PS1_bit=0; //bit de configuración del prescaler 1:64
Timer 0 PS0_bit=1; //bit de configuración del prescaler 1:64
TMR0IE_bit=1; //habilita la interrupción del Timer 0 PSA_bit=0; //asigna el prescaler al Timer 0
} TMR0=0x27; //este valor permite obtener una base de
GIE_bit=1; //habilitación global de las interrupciones tiempo de 2.778ms
} T0IF_bit=0; //borra la bandera de interrupción del Timer 0
/*=========================================== T0IE_bit=1; //habilita la interrupción del Timer 0
6 DEFINICION DE LAS SUBRUTINAS UTILIZADAS EN //Configuración del Timer 1
LAS SUB MAIN (PROGRAMA PRINCIPAL) TRISC0_bit=1; //configura el pin T1OSO para el reloj
=======================================*/ secundario de 32.768Khz
/*=========================================== TRISC1_bit=1; //configura el pin T1OSI para el reloj
6.1 SUBRUTINA QUE CONFIGURA LOS PUERTOS DEL secundario de 32.768Khz
MICRO CONTROLADOR TMR1CS_bit=1; //configura en modo oscilador secundario
=======================================*/ T1CKPS0_bit=0; //bit de configuración del prescaler 1:1
void gConfigPic16F877A(void) { T1CKPS1_bit=0; //bit de configuración del prescaler 1:1
//Configuración del Puerto A (debo tambión configurar el T1SYNC_bit=0; //habilita la sincronización del reloj externo
ADCON1 y CMCON) T1OSCEN_bit=1; //habilita el reloj externo de 32.768KHz
ADCON1=0x07; //esta combinación configura el puerto A TMR1H=0x80; //este valor permite obtener una base de
como digital tiempo de 1seg.
CMCON=0x07; //esta combinación deshabilita los TMR1L=0x00; //este valor permite obtener una base de
comparadores y configura el_ tiempo de 1seg.
//puerto A como digital TMR1IF_bit=0; //borra la bandera de interrupción del Timer
TRISA=0b00000000; 1
PORTA=0x00; TMR1IE_bit=1; //habilita la interrupción del Timer 1
//Configuración del Puerto B TMR1ON_bit=1; //enciende el Timer 1
TRISB=0b11111111; //Configuración del Timer 2
PORTB=0x00; T2CKPS0_bit=1; //bit de configuración del prescaler 1:16
NOT_RBPU_bit=0; //habilita las resistencias de pull-up del T2CKPS1_bit=1; //bit de configuración del prescaler 1:16
puerto B TOUTPS0_bit=1; //bit de configuración del postcaler 1:14
//Configuración del Puerto C TOUTPS1_bit=0; //bit de configuración del postcaler 1:14
TRISC=0b00000011; //RC1/T1OSI y RC0/T1OSO deben TOUTPS2_bit=1; //bit de configuración del postcaler 1:14
ser configurados como_
TOUTPS3_bit=1; //bit de configuración del postcaler 1:14
//entradas para el reloj secundario
TMR2=0x00; //valor inicial del Timer 2
PORTC=0x00;
PR2=0xDE; //este valor permite obtener una base de
//Configuración del Puerto D tiempo de 9.9904ms
TRISD=0b00000000; TMR2IF_bit=0; //borra la bandera de interrupción del Timer
PORTD=0x00; 2
//Configuración del Puerto E (debo tambión configurar el TMR2IE_bit=1; //habilita la interrupción del Timer 2
ADCON1, pero ya esta_ TMR2ON_bit=1; // Timer 2 en off
//configurado en el puerto A) //Configuración de la interrupción externa
TRISE=0b00000000; INTEDG_bit=0; //selección de interrupción externa por
PORTE=0x00; falling (flanco negativo)
//Configuración del Timer 0 INTF_bit=0; //borra la bandera de la interrupción externa
T0CS_bit=0; //configura en modo temporizador INTE_bit=1; //habilita la interrupción externa
T0SE_bit=0; //configuraróa conteos en transición rising //Configuración global de interrupciones
(positiva)
Universidad Politécnica Salesiana-Sede Cuenca. 10
Desarrollo de flujograma.
LED_OP_CON=1; //led contador encendido
Se ha desarrollado el flujograma del circuito tomando en
LED_OP_CRO=0; //led cronómetro apagado cuenta su principal funcionamiento.
LED_OP_REL=0; //led reloj apagado Diseño del circuito. (Proteus)
}
if(SW7 && !SW6) { //CRONOMETRO
UNI=CR_UNI;
DEC=CR_DEC;
CEN=CR_CEN;
UNI_M=CR_UNIM;
DEC_M=CR_DECM;
CEN_M=CR_CENM;
LED_OP_CON=0; //led contador apagado
LED_OP_CRO=1; //led cronómetro encendido
LED_OP_REL=0; //led reloj apagado
Fig 7. Diseño de la practica Proteus
Universidad Politécnica Salesiana-Sede Cuenca. 11
Análisis de resultados.
Se puede comprobar el normal funcionamiento del programa
dentro de la herramienta que nos permite realizar
simulaciones Proteus podemos ver que el programa realizado
para esta practica cumple con las funciones que se requerían
para la revisión de la misma.
VI. CONCLUSIONES
VII. RECOMENDACIONES
VIII. BIBLIOGRAFIA
Bibliografía
[1] R. Pacco, «UELECTR0,» UELECTRO, 27 08 2017. [En
línea]. Available: http://electroboyss.blogspot.com.
[Último acceso: 17 05 2019].
[2] R. RONES, «MIKROE,» MIKROE, 13 03 2018. [En
línea]. Available: https://www.mikroe.com. [Último
acceso: 17 05 2019].
[3] Sánchez Pérez, Luis, «ECURED,» ECURED, 20 07
2018. [En línea]. Available: https://www.ecured.cu.
[Último acceso: 17 05 2019].