Академический Документы
Профессиональный Документы
Культура Документы
MICROCONTROLADORES
LABORATORIO No. 4
TERCER PARCIAL
NRC. 4468
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
R1 V3
D1 1k V1 5V
1N4004 12V
RESET
C5
1uF
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
4
6. Diagrama de Flujo
INICIO
Definir procesador
Ir Banco 1
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
Entrada Salida
Microcontrolador
(Pulsadores) (Puerto D)
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
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
Registros de Interrupciones
8
8. Programa
;******************************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
;**********************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:
Conectando un relé:
13