Está en la página 1de 11

Universidad Politécnica Salesiana-Sede Cuenca.

Universidad Politécnica Salesiana


PRÁCTICA #2
Contador_Cronometro_Reloj
Oscar Fernando Sari Uguña – osariu@est.ups.edu.ec
Luis Enrique López Maldonado – llopezm@est.ups.edu.ec
Sistemas Micro procesados.
Ing. Ítalo Mogrovejo.
24/06 2019

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

Puerto Serie Síncrono Maestro (MSSP)


Soporta los modos SPI e I2C. [1]

Fig. 2 mikroC. [2]

Cristal de cuarzo.

Son componentes electrónicos utilizados en circuitos


osciladores. Estos oscilan a una frecuencia estable. Por lo que
tienen una gran utilidad principalmente en la Electrónica
Digital y radiofrecuencia. [3]

Fig. 1 Datasheet del PIC 16F877A. [1]


Fig. 3 Cuarzo de 20 MHz. [3]
MIKRO C
IV. MATERIALES
Este software se le denomina Entorno de desarrollo integrado - Fuente de alimentación 5v
(Integrated Developement Environment - IDE) e incluye todas - Protoboard
las herramientas necesarias para desarrollar los proyectos - Cable multipar
(editor, depurador etc.). Por extensión, IDE es a veces llamado - Diodos leds
compilador. En esta sección le enseñaremos lo básico que debe - 17 resistencias de 220 Ω.
saber para empezar a desarrollar su primer proyecto en mikroC - 5 pulsantes
utilizando el IDE del compilador mikroC PRO for PIC. Aparte - DIP-SWITCH (4 entradas).
de todas las características comunes de cualquier IDE, mikroC
PRO for PIC contiene las informaciones de arquitectura de los - Pic 16F877A
microcontroladores PIC (registros, módulos de memoria, - Cuarzo de 4 MHz.
funcionamiento de circuitos particulares etc.) para compilar y - Capacitores de 32pF 2.2 nF
generar un archivo legible por un microcontrolador PIC. Interrupcines de Timer
Además, incluye las herramientas específicas para programar
TIMER0
los microcontroladores PIC. El proceso de crear y ejecutar un
proyecto contiene los siguientes pasos: El timer0 PIC es un temporizador contador de 8 bits, el
registro TMR0 es el temporizador contador timer0 en si, es
1. Crear un proyecto (nombre de proyecto, configuración donde se guardan los valores del timer0 PIC, cuando es
de proyecto, dependencias entre archivos) utilizado como temporizador sus valores aumentaran de uno
2. Editar un programa en uno entre 0 y 255 con cada 4 ciclos de reloj, no olvidar que
3. Compilar el programa y corrección de errores cada ciclo de instrucción del microcontrolador PIC es
4. Depurar (ejecutar el programa paso a paso para realizado en 4 ciclos de reloj, por ejemplo si el oscilador con
asegurarse de que se ejecutan las operaciones el que está funcionando el microcontrolador PIC es de 4MHz,
deseadas). entonces el registro TMR0 aumentará una unidad en cada 1us,
5. Programar un microcontrolador (cargar el archivo. hex si el registro TMR0 se incrementa en 100 unidades habrán
generado por el compilador en el microcontrolador transcurrido 100us;
utilizando el programador PICflash). [2] TIMER1
PRE-ESCALADOR DEL TEMPORIZADOR TIMER1
El temporizador Timer1 tiene un escalador completamente
separado que permite dividir la frecuencia de entrada de reloj
por 1,2,4 o 8. No es posible leer el pre-escalador o escribir en
él directamente. De todas formas, el contador del pre-
Universidad Politécnica Salesiana-Sede Cuenca. 3

escalador se pone a 0 automáticamente después de escribir en CONTADOR (SW7=0, SW6=1):


los registros TMR1H o TMR1L. 1.El contador utiliza la interrupción externa para producir los
OSCILADOR DEL TEMPORIZADOR TIMER1 conteos y adicionalmente se debe utilizar una entrada en
SW4….inicialmente se puede probar su funcionamiento
Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar
seleccionando SW4=0 ascendente o SW4=1 descendente
los pulsos que vienen de los dispositivos periféricos, pero
y el pulsante en RB0, pero luego se debe implementar el
también tienen una función adicional. Como se puede ver en la
circuito externo necesario para producir los conteos según la
siguiente figura, se configuran simultáneamente como entrada
dirección de detección de mínimo 3 infrarrojos.
(pin RC1) y salida (pin RC0) del oscilador de cuarzo LP (Low
Power - de bajo consumo) adicional. 2. Para el contador se tiene los siguientes indicadores visuales
leds LED_CN_UP en RC3 y LED_CN_DOWN en RC2.
3. Si se presiona PB3 entonces, borra el contador.
V. DESARROLLO Y
RESULTADOS. 4. El contador debe visualizar en los displays desde -99999
hasta 99999 (si se llega al máximo o mínimo, el contador no
DESCRIPCIÓN DE FUNCIONAMIENTO GENERAL:
cuenta, tampoco precarga y necesariamente se debe resetear-
El sistema embebido dispone de: 6 displays de ánodo o borrar el contador).
cátodo común (se puede utilizar displays empaquetados).
5. El contador debe permitir la precarga de un valor fijo, para
Estos displays deben conectarse en: RD7:RD0 DATOS y RE0,
lo cual se puede ayudar de los otros pulsantes, así mismo los
RA5, RA3:RA0 para HABILITACIÓN (común) de los
displays deberían titilar para indicar se está en modo precarga
displays. 2 interruptores SW7-SW6 para la selección de:
de datos…adicional reconfigurar los puertos de forma que
00=Displays apagados, 01=Contador, 10=Cronómetro,
permita con un led LED_LOAD indicar la carga de datos
11=Reloj. 1 interruptor SW5 para seleccionar 0=Reloj,
1=Alarma 1 interruptor SW4 para apoyo-selección-circuito DESCRIPCIÓN DE FUNCIONAMIENTO DEL
del contador conjuntamente con 1 pulsante PB0 que debe ser CRONÓMETRO (SW7=1, SW6=0):
atendido por interrupción, de la siguiente manera: 1. El cronómetro debe ser implementado con una base de
SW4=0=Ascendente, SW4=1=Descendente 1 pulsante PB3 tiempo de 10ms utilizando el Timer 2, interrupción y
que sirve para seleccionar horas o minutos (cuando se está configuración respectiva (puede ser necesario el pre y
igualando el reloj o alarma) o regresar a estado de postcaler).
visualización normal de reloj. 2 pulsantes PB2 y PB1 para
2. Si se presiona por primera vez PB1, el cronómetro
subir o bajar respectivamente las horas o minutos
inicia su conteo, si se presiona por segunda vez: registra
seleccionados por PB3, por otro lado estos 2 pulsantes en
el tiempo actual, si se presiona por tercera vez, vuelve a
modo cronómetro sirven para iniciar, detener visualización
contar normalmente, si se presiona por cuarta vez, vuelve
que llamaremos registrar marca o simplemente registrar,
a registrar la marca y así sucesivamente.
detener cronómetro o simplemente detener, borrar cronómetro.
3. Si se presiona PB2 por primera vez, detiene el
DESCRIPCIÓN DE FUNCIONAMIENTO DEL RELOJ
cronómetro…en este caso si se presionara PB1, el
(SW7=1, SW6=1): 1. El reloj debe ser implementado con una
cronómetro continúa su conteo y visualización desde el
base de tiempo utilizando un cuarzo de 32.768KHz externo a
valor detenido, pero si se presiona PB2 por segunda vez,
las entradas del Timer 1 e interrupción.
entonces borra (pone a 0) el cronómetro.
2. Se debe poder subir o bajar horas y/o minutos para la
4. Para el cronómetro se tiene el indicador LED_CR en
igualación respectiva de la hora o alarma, para esto se utiliza
RE2.
SW5, PB3, PB2, PB1
Código de programación.
3. Si SW5=0…Esto es funcionamiento del reloj, si se desea
igualar, se debe presionar PB3 una vez para seleccionar horas, Pseudocodigo
en este caso se enciende el LED_HO en RC7, si se presiona /*-------------------------------------------------------------------------
PB3 por segunda vez, se selecciona minutos y se enciende el ---*/
LED_MI en RC6, si se presiona PB3 por tercera vez, se
vuelve a modo normal de visualización de la /* UNIVERSIDAD POLITECNICA SALESIANA
hora………además debe titilar las horas o minutos según se */
haya escogido para igualar. /* CARRERA DE INGENIERIA ELECTRONICA
4. Si SW5=1…Esto es funcionamiento de alarma, similar al */
reloj, en cuanto a igualación, por otro lado, cuando sea la hora /*
registrada en la alarma, esta debe activar el BUZZER en RA4 /* Practica02.c
y un relé en RE1 por 1 minuto, comandados a través de
optotransistores. /* */
5. SW5, también enciende los leds LED_RE para el reloj en /* Autor: Luis Lopez - Sari Oscar
RC5 o LED_AL para la alarma en RC4. /* Creacion: */
DESCRIPCIÓN DE FUNCIONAMIENTO DEL /* Descripcion: */
Universidad Politécnica Salesiana-Sede Cuenca. 4

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

unsigned char RE_UNI=0; //variable que contiene las ====================


unidades de los segundos del reloj 3 PROTOTIPO DE FUNCIONES
unsigned char RE_DEC=0; //variable que contiene las ============================================
decenas de los segundos del reloj ====================*/
unsigned char RE_CEN=0; //variable que contiene las void gConfigPic16F877A(void);
unidades de los minutos del reloj
void interrupt(void);
unsigned char RE_UNIM=0; //variable que contiene las
decenas de los minutos del reloj void gSubInt(void);
unsigned char RE_DECM=0; //variable que contiene las void gSubTmr0(void);
unidades de las horas del reloj void gSubTmr1(void);
unsigned char RE_CENM=0; //variable que contiene las void gSubTmr2(void);
decenas de las horas del reloj
void gManejoPB2_T2(void);
void gManejoPB1_T1(void);
unsigned char AL_UNI=0; //variable que contiene las
void gContUpDown(void);
unidades de los segundos de la alarma
void gIgualar(void);
unsigned char AL_DEC=0; //variable que contiene las
decenas de los segundos del la alarma
unsigned char AL_CEN=0; //variable que contiene las /*===========================================
unidades de los minutos del la alarma 4 DEFINICIÓN DE SUBRUTINAS UTILIZADAS EN LAS
unsigned char AL_UNIM=0; //variable que contiene las SUB'S INTERRUPT Y/O INTERUPT_LOW
decenas de los minutos del la alarma =======================================*/
unsigned char AL_DECM=0; //variable que contiene las /*-------------------------------------------------------------------------
unidades de las horas del la alarma -----
unsigned char AL_CENM=0; //variable que contiene las 4.1. Subrutina de la interrupción externa
decenas de las horas del la alarma
---------------------------------------------------------------------------
---*/
unsigned char CR_RG_UNI=0; //variable que contiene las void gSubInt(void){
centósimas de segundo del cronómetro
}
unsigned char CR_RG_DEC=0; //variable que contiene las
/*-------------------------------------------------------------------------
dócimas de segundo del cronómetro
-----
unsigned char CR_RG_CEN=0; //variable que contiene las
4.2. Subrutina de la interrupción de TIMER0
unidades de los segundos del cronómetro
---------------------------------------------------------------------------
unsigned char CR_RG_UNIM=0; //variable que contiene las
---*/
unidades de los segundos del cronómetro
void gSubTmr0(void){
unsigned char CR_RG_DECM=0; //variable que contiene las
unidades de los minutos del cronómetro static unsigned char CNT_MUX=0;
unsigned char CR_RG_CENM=0; //variable que contiene las static unsigned char PTR=0;
decenas de los minutos del cronómetro CNT_MUX++;
switch(CNT_MUX) {
unsigned char gVectorDatos[]={0x3F, 0x06, 0x5B, 0x4F, case 1:
0x66, 0x6D,
HAB_CEN_M=0;
0x7D, 0x07, 0x7F, 0x67, 0x00,
0x40};//catodo comun HAB_DEC_M=0;

unsigned char PB3_RE=0; //Variable que registra seleccion HAB_UNI_M=0;


de horas, minutos para igualar HAB_CEN=0;
unsigned char PB2_CR=0; //Variable que ayuda con el HAB_DEC=0;
control de paro y reset del cronometro HAB_UNI=1; //habilita el display de las unidades
unsigned char PB1_CR=0; //Variable que ayuda con el PTR=UNI; //carga el óndice del vector de datos con
control de marca y conteo del cronometro UNI
/*=========================================== break;
Universidad Politécnica Salesiana-Sede Cuenca. 6

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

PEIE_bit=1; //habilitación de interrupciones de perifóricos }


enmascarables if(SW7 && SW6) { //RELOJ
GIE_bit=1; //habilitación global de interrupciones LED_OP_CON=0; //led contador apagado
} LED_OP_CRO=0; //led cronómetro apagado
/*=========================================== LED_OP_REL=1; //led reloj encendido
7 DEFINICIÓN DE LA SUB MAIN (PROGRAMA if(!SW5){
PRINCIPAL)
UNI=RE_UNI;
=======================================*/
DEC=RE_DEC;
int main(void) { //Ejecucion total
CEN=RE_CEN;
gConfigPic16F877A();
UNI_M=RE_UNIM;
while(1){
DEC_M=RE_DECM;
if(!SW7 && !SW7){ // Display apagados
CEN_M=RE_CENM;
UNI=0x0A;
}
DEC=0x0A;
else{
CEN=0x0A;
UNI=AL_UNI;
UNI_M=0x0A;
DEC=AL_DEC;
DEC_M=0x0A;
CEN=AL_CEN;
CEN_M=0x0A;
UNI_M=AL_UNIM;
LED_OP_REL=0;
DEC_M=AL_DECM;
LED_OP_CON=0;
CEN_M=AL_CENM;
LED_OP_CRO=0;
}
}
if(!SW7 && SW6) { //CONTADOR
}
UNI=0;
DEC=1;
}
CEN=3;
return 0;
UNI_M=11;
}
DEC_M=5;
CEN_M=8;

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

La programación de la secuencia de luces es una práctica que


se puede desarrollar en el campo industrial, ya que controla el
funcionamiento de cada uno de los leds mediante un tiempo
establecido en la programación, con un sistema de Reset y un
interruptor de paro general, este sistema de control también se
puede hacer en un campo que trabaja con potencias mucho
mayores.
En esta practica podemos concluir que dentro de la
programación se necesita saber sobre lo básico de lo que es el
lenguaje de programación en miKroC sobre lo que es la
activación y desactivación de pines, también sobre las
subrutinas, crear una plantilla la cual nos permita seguir un
orden lógico de programación.

VII. RECOMENDACIONES

Conectar todas las alimentaciones del pic.


Conectar lo mas cercano posible el cuarzo con el pic.
Para el desarrollo de practicas en un PIC lo recomendable es
primero leer el datashett del pic para el cual vamos a programar
para saber sobre que pines se va a programar, por ejemplo saber
cuales se pueden programar como entradas o cuales como
salidas también que tipo o de que valor se necesita el oscilador
al igual que sus condensadores.

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

También podría gustarte