Sunteți pe pagina 1din 13

DEPARTAMENTO DE ELÉCTRICA Y ELECTRÓNICA

MICROCONTROLADORES

LABORATORIO No. 4

TERCER PARCIAL

NRC. 4468

TUTOR: Dr. PABLO RAMOS

NOMBRE: VILLAVICENCIO FREDDY

FECHA: 2019-06-23

SANGOLQUÍ-ECUADOR

1
Tema: Aplicación del lenguaje ensamblador

1. Objetivos
a. Objetivo General
Aplicar el concepto de contadores, temporizadores e interrupciones externas para poder
controlar distintos dispositivos por medio del PIC16F877A.
b. Objetivos Específicos
 Desarrollar el correspondiente código en lenguaje Ensamblador que cumpla los
requerimientos solicitados.
 Realizar el correspondiente diagrama de flujo y obtener los cálculos matemáticos
correspondientes.
 Implementar el circuito diseñado en el protoboard y probar su funcionamiento.

2. Requerimientos
 Con un pulso se activa el relé y con otro pulso se desactiva el relé correspondiente.
 Con 2 pulsos seguidos se activa el relé y permanece en ese estado por 10s, después de ese
tiempo se desactiva automáticamente.
 Los 3 relés pueden deben funcionar al mismo tiempo o de manera independiente.

3. Marco Teórico
 Interrupción externa
La interrupción externa del PIC se produce cuando en un pin preparado especialmente para este fin
se produce algún evento, como por ejemplo ocurra algún cambio de estado en el pin como por ejemplo
pasar de un bajo (0) a un alto (1). La interrupción externa del PIC es útil para el manejo de pulsadores,
detectores de cruce por 0, y mucho más.
 Interrupción por cambio de estado en el puerto B
Interrupción por cambio de estado en el puerto B PIC, el microcontrolador PIC se puede programar
para que produzca una interrupción si alguno de los pines RB4, RB5, RB6 y RB7 del puerto B cambia
de estado, así se puede detener el programa principal con el cual este trabajando el microcontrolador
PIC, para indicarle al microcontrolador que se dedique a realizar otras tareas, al finalizar la
interrupción por cambio de estado en el puerto B PIC, se seguirá con el programa principal desde
donde fue interrumpido.
 Interrupción timer0
Interrupción timer0 del PIC, mediante la interrupción timer0 PIC se puede detener el programa
principal con el cual este trabajando el microcontrolador PIC, para indicarle al microcontrolador que
se dedique a realizar otras tareas, al finalizar la interrupción timer0 PIC, se seguirá con el programa
principal desde donde fue interrumpido.
 Timer0 como contador
Para el PIC16F877A el registro TMR0 del timer0 PIC está formado por 8 bits por lo que se puede
contar desde 0 hasta 255, al utilizar timer0 PIC como contador este no aumentará sus valores o su
cuenta con cada ciclo de instrucción, en este caso el timer0 estará conectado al pin T0CKI por donde
se le hará llegar una señal, la cual al cambiar de estado hará que el timer0 PIC se incremente en una
2
unidad, estos incrementos en su cuenta pueden ser por cada flanco de subida o cada por flanco de
bajada de la señal, el flanco a utilizar se elige por programa, por ejemplo su se elige el flanco de
subida quiere decir que cada vez que la señal que llega al pin T0CKI pase de un bajo a un alto o de 0
a 1, el registro TMR0 aumentará en una unidad, de esta manera se le puede utilizar como contador,
cuando la señal pase de un alto a un bajo o de 1 a 0 el registro TMR0 no aumentará su valor o no se
incrementará.
 Timer1 como contador
Para el PIC16F877A el registro TMR1 del timer1 PIC está formado por 16 bits por lo que se puede
contar desde 0 hasta 65535, al utilizar timer1 PIC como contador este no aumentará sus valores o su
cuenta con cada ciclo de instrucción, en este caso el timer1 estará conectado al pin T1CKI por donde
se le hará llegar una señal, la cual al cambiar de estado de un bajo a un alto, esto es por flanco de
subida, hará que el timer1 PIC se incremente en una unidad, estos incrementos en su cuenta serán
siempre por cada flanco de subida, por ejemplo cada vez que la señal que llega al pin T1CKI pase de
un bajo a un alto o de 0 a 1, el registro TMR1 aumentará en una unidad, de esta manera se le puede
utilizar como contador, cuando la señal pase de un alto a un bajo o de 1 a 0 el registro TMR1 no
aumentará su valor o no se incrementará.
 Timer1 como temporizador.
Se verá en este caso el uso del temporizador contador pic timer1 como temporizador, normalmente
el registro TMR1 del timer1 PIC irá aumentando su valor en una unidad con cada ciclo de instrucción
del microcontrolador PIC, y para estos microcontroladores a cada ciclo de instrucción le toma 4
ciclos del oscilador que se esté utilizando, si se usa por ejemplo un cristal de Fosc=4Mhz para el que
cada ciclo del oscilador será de 0,25us, entonces cada ciclo de instrucción tardará 4 veces este valor,
es decir 4*(0,25us) lo que viene a ser 1us, a esto se le llama ciclo máquina TCM=4/Fosc, entonces el
registro TMR1 aumentará en una unidad en cada microsegundo cuando el oscilador es de 4Mhz.
Como el registro TMR1 es de 16 bits este aumentará desde 0 o desde algún valor que se le ponga
como valor inicial hasta un máximo de 65535.

4. Materiales
 PIC 16F877A
 Resistencias varias
 Cristal de 4MHz
 Capacitores varios
 4 Pulsadores
 4 Diodos 1N4004
 3 Transistores NPN - 2N2222A
 3 Relés de 5VDC
 3 CI 555
 Leds varios
 Quemador PicKit2
 Computador instalado MPLAB y Proteus
 Protoboard y cables de conexión

3
5. Circuito esquemático

SW2

SW-SPDT +12V +5V

R1 V3
D1 1k V1 5V
1N4004 12V

RESET

C5
1uF

Ilustración 1: Circuito de Reset y fuentes de alimentación.

C2 U1

5V
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
22pF 35
RB2
1

2 36
RA0/AN0 RB3/PGM RL4
3 37
X1 RA1/AN1 RB4 5V
4 38
CRYSTAL RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC 1N4004
C6 6 40
2

RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
22pF RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL 2N2222A R48
23
RC4/SDI/SDA 220
1 24 1k
RESET MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
5V

RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27

5V
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
R7 RD7/PSP7
30
U2 1k
8

PIC16F877A RL5
4 3 5V
VCC

R Q
7 1N4004
DC
R18
4.7k 5
CV
GND

2 6 2N2222A R15
TR TH 220
1k
1

C1 555
10nF C9
10uF
5V
5V

5V

RL6
5V

1N4004
R20 R23
U3 1k U5 1k
8

4 3 4 3
VCC

VCC

R Q R Q
2N2222A R17
7 7 1k 220
DC DC
R22 R24
4.7k 5 4.7k 5
CV CV
GND

GND

2 6 2 6
TR TH TR TH
1

C10 555 C12 555


10nF C11 10nF C13
10uF 10uF

Ilustración 2: Circuito general.

4
6. Diagrama de Flujo

INICIO

Definir procesador

Incluir registros internos

Ir Banco 1

Configurar puertos y timer:


PORTA -> Entrada
PORTB -> Entrada
PORTC -> Entrada
PORTD -> Salida
Timer0 - > Contador
Configurar Interrupciones

Ir Banco 0

Configurar
Timer1 - > Contador

SI
RA6 = 1 RD0=1
Llamar retardo
Cont=1 Cont=0

NO

SI
RA6 = 0 RD0=0
Cont=0 Llamar retardo
Cont=1

NO

5
A

SI Llamar retardo
RA6 = 1 RD0=1
Cont=0 (10s)
Cont=2
RD0=0

NO

SI
RC0 = 1 RD1=1
Llamar retardo
Cont=1 Cont=0

NO

RC0 = 0 RD1=0
Llamar retardo
Cont=1 Cont=0

NO

SI
Llamar retardo
RC0 = 1 RD1=1
(10s)
Cont=2 Cont=0
RD1=0

NO

SI
RB0 = 1 RD2=1 Llamar retardo
Cont=1 Cont=0 RD

NO

RB0 = 0 RD2=0
Llamar retardo
Cont=1 Cont=0

NO

SI
RD2=1 Llamar retardo
RB0 = 1
Cont=0 (10s)
Cont=2
RD2=0

NO

Ilustración 3: Diagrama de flujo


6
7. Diseño

7.1. Diagrama de bloques

Entrada Salida
Microcontrolador
(Pulsadores) (Puerto D)

Carga Conmutación Acoplamiento


(Leds) (Relés) (Transistores)

Ilustración 4: Diagrama de bloques.

7.2. Cálculos matemáticos

 Circuito anti-rebote
El temporizador 555 entregará a su salida (pin 3) un voltaje de nivel alto por un tiempo establecido
por el resistor R1 y el capacitor C1. Ver la siguiente fórmula: T = 1.1 x R1 x C1. El tiempo T
establecido, que es corto, cumple con la función que se desea. Aun así, este tiempo T de salida se
puede variar cambiando los valores de R1 y C1
5V

R9
U4 1k
8

4 3
VCC

R Q P1
7
DC
R20
4.7k 5
CV
GND

2 6
TR TH
1

C10 555
10nF C11
10uF

Ilustración 5: Circuito anti-rebote.

En el diseño se tiene el siguiente tiempo de cambio de estado lógico para los pulsadores de:
𝑇 = 1.1 𝑥 𝑅1 𝑥 𝐶1 = 1.1𝑥1000𝑥10𝑥10−6 = 0.011𝑠
𝑇 = 11𝑚𝑠

7
7.3. Configuración de Registros

 Timer0 como contador:

TOCS = 1, Timer0 como contador


TOSE = 0, incremento en flanco ascendente
PSA = 1, divisor asignado al WDT
PS2:PS0 = 000, pre-escalador de 1:2
OPTION_REG = b’00101000

 Timer1 como contador:

T1CKPS1:T1CKPS0 = 0, pre-escalador de 1:1


T1OSCEN = 0, oscilador deshabilitado
T1SYNEN = 0, se sincroniza la entrada de reloj externa
TMR1CS = 1, Timer1 como contador
TMR1ON = 1, habilita el Timer1
T1CON = b’00000011

 Registros de Interrupciones

TOIF = 1, desbordamiento del Timer0


RBIF = 1, cambio de estado en los pines RB4:RB7

TRM1IF = 1 desbordamiento del Timer1

8
8. Programa

;**************************CONFIGURACION DEL PIC********************************


PROCESSOR 16F877A
INCLUDE "P16F877A.INC"
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF &_LVP_OFF

;******************************VARIABLES****************************************
CBLOCK 0x20
R_ContB ;VARIABLE PARA GENERAR UN RETARDO
R_ContA ;VARIABLE PARA GENERAR UN RETARDO
Cont
Cont1
ENDC
;*******************************************************************************

;******************************VECTORES*****************************************
ORG 00h ;VECTOR DE RESET
GOTO INICIO
ORG 05h ;VECTOR DE INICIO
GOTO INICIO
;*******************************************************************************

;***************************BANCOS DE REGISTROS*********************************
BANCO0
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
BANCO1
BSF STATUS,RP0
BCF STATUS,RP1
RETURN
BANCO2
BCF STATUS,RP0
BSF STATUS,RP1
RETURN
BANCO3
BSF STATUS,RP0
BSF STATUS,RP1
RETURN
;*******************************************************************************

;*********************************RETARDOS**************************************
RETARDO_100ms
MOVLW d'100'
MOVWF R_ContB
R1ms_BUCLE1
MOVLW d'249'
MOVWF R_ContA
R1ms_BUCLE2
NOP

9
DECFSZ R_ContA,F
GOTO R1ms_BUCLE2
DECFSZ R_ContB,F
GOTO R1ms_BUCLE1
RETURN

RETARDO_10S
MOVLW d'100'
MOVWF Cont
BUCLE
CALL RETARDO_100ms
DECFSZ Cont,F
GOTO BUCLE
RETURN
;*******************************************************************************

;\\\INICIO DEL PROGRAMA///

INICIO
;**********************Configuracion de Puertos y Timers************************
CALL BANCO1 ;Seleciona el Banco 1
MOVLW 0x06
MOVWF ADCON1 ;Configura PORTA como digital
MOVLW 0xFF
MOVWF TRISA ;Configura PORTA como entrada
MOVLW 0xFF
MOVWF TRISB ;Configura PORTB como entrada
MOVLW 0xFF
MOVWF TRISC ;Configura PORTC como entrada
MOVLW 0x00
MOVWF TRISD ;Configura PORTD como salida
MOVLW 0x28 ;Configura el Timer0
MOVWF OPTION_REG ;Carga el valor al reg. OPTION_REG
BCF INTCON,T0IF ;Inhabilitar interrupcion en el bit TOIF
CALL BANCO0 ;Seleciona el Banco 0
MOVLW 0x03 ;Configura el Timer1
MOVWF T1CON ;Carga el valor al reg. T1CON
BCF PIR1,TMR1IF ;Inhabilitar interrupcion en el bit TMR1IF
CLRF PORTD ;Pone un cero logico en las salidas del PORTD
;Por la instruccion anterior los leds inician apagados

CALL PULSOS

TEST_PULSADOR_A1
BTFSS PORTA,RA0
GOTO TEST_PULSADOR_A1
BSF PORTD,RD0
CALL RETARDO_100ms
CALL RETARDO_100ms

TEST_PULSADOR_B1
BTFSS PORTA,RA1
GOTO TEST_PULSADOR_B1
10
BSF PORTD,RD1
CALL RETARDO_100ms
CALL RETARDO_100ms

TEST_PULSADOR_C1
BTFSS PORTA,RA2
GOTO TEST_PULSADOR_C1
BSF PORTD,RD2
CALL RETARDO_100ms
CALL RETARDO_100ms

TEST_PULSADOR_A2
BTFSS PORTA,RA0
GOTO TEST_PULSADOR_A2
BCF PORTD,RD0
CALL RETARDO_100ms
CALL RETARDO_100ms
; GOTO TEST_PULSADOR_A1

TEST_PULSADOR_B2
BTFSS PORTA,RD1
GOTO TEST_PULSADOR_B2
BCF PORTD,RD1
CALL RETARDO_100ms
CALL RETARDO_100ms
; GOTO TEST_PULSADOR_B1

TEST_PULSADOR_C2
BTFSS PORTA,RA2
GOTO TEST_PULSADOR_C2
BCF PORTD,RD2
CALL RETARDO_100ms
CALL RETARDO_100ms
; GOTO TEST_PULSADOR_C1

ON_A
BTFSS PORTA,RA4
GOTO ON_A
BTFSS INTCON,T0IF
GOTO ON_A
BSF PORTD,RD0
CALL RETARDO_10S
BCF PORTD,RD0
BCF INTCON,T0IF
CALL PULSOS
CLRF PORTA

ON_B
BTFSS PORTA,RA4
GOTO ON_B
BTFSS INTCON,T0IF
GOTO ON_B
BSF PORTD,RD1
11
CALL RETARDO_10S
BCF PORTD,RD1
BCF INTCON,T0IF
CALL PULSOS
CLRF PORTA

ON_C
BTFSS PORTA,RA4
GOTO ON_C
BTFSS INTCON,T0IF
GOTO ON_C
BSF PORTD,RD2
CALL RETARDO_10S
BCF PORTD,RD2
BCF INTCON,T0IF
CALL PULSOS
CLRF PORTA

PULSOS
MOVLW 0xFE ;Carga en w el valor para contar 2 pulsos
MOVWF TMR0 ;Carga el w en en el Timer0
RETURN

END

9. Conclusiones:
 Para determinar el número de pulsos fue necesario configurar el timer0 como contador, el cual
permitió contar el número de interrupciones externas producidas por el usuario.
 Fue necesario utilizar retardos para evitar errores en las salidas del microcontrolador,
obteniendo los valores lógicos para el correcto funcionamiento del circuito diseñado.
 Las interrupciones externas son necesarios para manipular dispositivos que necesitan ser
controlados manualmente por el usuario mediante el microcontrolador.

10. Recomendaciones:
 Se recomienda tener en cuenta el uso de simuladores, porque a través de ello se puede idealizar
las conexiones correspondientes en una protoboard física, y tener conocimientos si el programa
realizado es el requerido con las condiciones establecida.
 Para este laboratorio es necesario conocer el funcionamiento y la conexión física de los relés,
esto ayudará a resolver problemas de programación e implementación que se puedan presentar.
 Diseñar un circuito anti-rebote para los pulsadores que ayude a evitar errores al momento de
identificar el número de pulsos en la programación.

12
11. Referencias:
 Valdés, F. y Pallás, R. (2007). Microcontroladores Fundamentos y aplicaciones con PICS.
México: Alfaomega.
 Waldron, J. (2008). Introduction to RISC Assembly Language Programming. España:
Addison Wesley.
 Data Sheet PIC16F877A
 http://microcontroladores-mrelberni.com/timer1-pic/
 http://microcontroladores-mrelberni.com/timer0-pic/
 http://microcontroladores-mrelberni.com/interrupcion-por-cambio-de-estado-en-el-puerto-b-
pic/
 http://microcontroladores-mrelberni.com/interrupcion-externa-pic/

12. Anexos:

Eliminador de rebote con 555:

Conectando un relé:

13