You are on page 1of 10

UNIVERSIDAD NACIONAL DE

SAN AGUSTN

FACULTAD DE INGENIERA DE PRODUCCIN Y SERVICIOS


ESCUELA PROFESIONAL DE INGENIERA ELECTRNICA

LABORATORIO DE MICROCONTROLADORES Y
MICROPROGRAMACIN

LABORATORIO N 3
Tema: PROGRAMACIN EN MPASM

DOCENTE : Ing. Juan Carlos Cuadros M.

INTEGRANTES : ANCALLA, AYAMAMANI, TONY


ARCE TUPACYUPANQUI, PAULO
RAMIREZ LLERENA, NILTON

FECHA DE ENTREGA: 18/07/2012


SEMESTRE: 2012 - I
Arequipa - Per
2011
LABORATORIO N 3
Tema: PROGRAMACION EN MPASM

PLANTEAMIENTO

En el siguiente diagrama

Switch
uC LED
Switch

Programar el microcontrolador para que el led prenda y apague de acuerdo a la siguiente


tabla:

Switch A Switch B LED


0 0 ON
ON / T=1.25 seg.
0 1
Off / T=0.5 seg.
ON / T=0.5seg.
1 0
OFF / T=1.25 seg.
1 1 OFF

SOLUCIN

- Se decide implementar el circuito usando el TIMER1 en modo comparador, donde


cargaremos en CCPR1H-CCPR1L el valor para generar la onda con el periodo que
nos solicitan para cada caso, el led se conecta a RA0, los Switch A y B se conectan
en RB4 Y RB5, ya que estos pines pueden generar interrupcin.
ALGORITMO DE SOLUCIN

Inicio
Declaracin de variables
Configuracin de puertos
Configuracin de TIMER1 y CCP1
Configuracin de interrupciones
Detectar la fuente de la interrupcin
Si la interrupcin proviene de CCP1, realizar el toggle para el LED
Si la interrupcin proviene de PORTA, detectar en estado de RA 0 - RA1
Si RA0 - RA1 es 00, cargar CCP1 con valor necesario para ON
Si RA0 - RA1 es 01, cargar CCP1 con valor necesario para Secuencia 1
Si RA0 - RA1 es 10, cargar CCP1 con valor necesario para Secuencia 2
Si RA0 - RA1 es 11, cargar CCP1 con valor necesario para OFF
Fin
DIAGRAMA DE FLUJO

INICIO
1

Variables:
comp No
sis_flag RA0=0 3
sis_flag

Si

Conf. Puerto A Toggle a


RB4 y RB5 como
entradas
3

Conf. Puerto A
Como E/S digitales
2

Conf. Puerto A
Como salida RA0 RA1

00 01 10
Conf. TIMER1 como
comparador

4 5 6 7
Conf. CCP1 como
comparador

4 5
Activar interrup:
Generales, de
perifricos y de Cargar en Cargar en
PORTA CCPR1H-CCPR1L CCPR1H-CCPR1L
Valor para Valor para
generar pulso ON generar pulso de
i 1
3

3 3
No
Interrupci

Si 7
6

CCP1
Cargar en OFF
CCPR1H-CCPR1L
Valor para generar
1 2 pulso de secuencia 1
2

3
ESQUEMTICO
PROGRAMA
;****************************************************************
; File: variador.asm
;{ -> Required: P16F877A.INC
;
;-----------------------------------------------------------------
; System: Laboratorio de Microcontroladores y Microprogramacin
; Component name: Laboratorio 4
; TEMA: PROGRAMACIN CON PIC
;-----------------------------------------------------------------
; Languaje: MPASM
;-----------------------------------------------------------------
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Autores: Ancalla, Arce, Ramirez
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Descripcin:
; Vara la frecuencia de parpadeo de un LED de acuerdo a dos
; pulsadores A y B
;
; A B T
; 0 0 ON
; 0 1 Secuencia 1
; 1 0 Secuencia 2
; 1 1 OFF
;
;----------------------------------------------------------------
; Limitaciones:
; Usa cristal de 4000000 Hz
;----------------------------------------------------------------
; FOREGROUND:
; Tacom_med
; Overf_tmr0
; Pid_pwm
;----------------------------------------------------------------
; Procedimientos:
;
;----------------------------------------------------------------
; BACKGROUND:
;
;
;
;----------------------------------------------------------------
; Pin asignados: empaquetado 40-Pin PDIP
;
; Pin RA0 Switch A Genera interrupcin
; Pin RA1 Switch B Genera interrupcin
; Pin RA5 LED
;
;----
; Modulos usados: {Modo}, <Interrrupciones>:
; TMR1 {timer_CCP1}
; CCP1 Intervalo de tiempo de 0.5segundos
;
;
;}
;*-*-*--**-----*--**-*-**-*-***-*-*-***************************************

LIST P=16F877A ;selecciona modelo


INCLUDE <P16F877A.INC> ;carga las constantes del
controlador
INCLUDE <macros_com.inc> ;incluimos archivo de macros
__CONFIG _LP_OSC & _WDT_OFF ;configuracin de oscilador y apagamos el
WatchDog

;===================================
;Declaracin de variables
UDATA
comp RES 1
sis_flag RES 1
;===================================

CODE 0X00
GOTO INICIO
ORG 0X04
INTERRUPCCION
;IDT Tabla de interrupciones, verifica si la interrupcin proviene
;de TMR1 o de la puerta A
BTFSC PIR1,CCP1IF ;Verifica si la interrupcin procede de CCP1
GOTO Toggle ;Si es as llama al procedimiento Toggle
BTFSC INTCON,RBIF ;Verifica si la interrupcin procede de PORTA
GOTO Boton ;Si es as, llama al procedimiento Boton
RETFIE ;Retorna si no hay interrupcin

;>>>ISR rutinas de insterrupcion

Toggle ; Si el led esta prendido, lo apaga y viceversa


BTFSC sis_flag,0 ;Testea el bit 0 del registro sis_flag
GOTO Caso_11_bit ;Si sis_flag es 1 llama al procedimiento Caso_11_bit
Neg_b PORTA,RA0 ;Si sis_flag es 0 llama al macro Neg_b, que apaga o prende el
LED
GOTO Fin_toggle ;Llama al procedimiento Fin_toggle
Caso_11_bit ;Caso de que switch A=1 y B=1
BCF PORTA,RA5 ;Apagamos el LED
Fin_toggle ;Procedimiento para finalizar el Toggle
BCF PIR1,CCP1IF ;Ponemos a 0 el flag de interrupcin de CCP1
(CCP1IF)
RETFIE ;Retornamos al programa principal

Boton ;Procedimiento en caso de activar interrupcion


desde PORTB
CLRF TMR1L ;Limpiamos el TMR1
CLRF TMR1H

MOVFW PORTA ;Cargamos el valor de PORTA a W


ANDLW A'00110000' ;Realizamos un AND con el literal A00110000 para sacar los
valores de RA0-RA1
MOVWF comp ;Cargamos los valores RA0-RA1 a comp
MOVLW A'00000000' ;Cargamos el literal A00000000 a W
XORWF comp,W ;Hacemos un XOR entre los valores de RA0-RA1 con W
BZ Caso_00_btn ;Si el XOR es 0 quiere decir que los valores RA0-RA1
son 00,
;llamamos a Caso_00_btn
;En caso los valores RA0-RA1 no sean 00, probamos si son 01

MOVLW A'00010000' ;Cargamos el literal B00010000 a W


XORWF comp,W ;Hacemos un XOR entre los valores de RA0-RA1 con W
BZ Caso_01_btn ;Si el XOR es 0 quiere decir que los valores RA0-RA1 son 01,
;llamamos a Caso_01_btn

;En caso los valores RB4-BR5 no sean 00 ni 01, probamos si son 10

MOVLW B'00100000' ;Cargamos el literal A00100000 a W


XORWF comp,W ;Hacemos un XOR entre los valores de RA0-RA1 con W
BZ Caso_10_btn ;Si el XOR es 0 quiere decir que los valores RA0-RA1
son 10,
;llamamos a Caso_10_btn
;En caso los valores RA0-RA1 no sean 00 ni 01 ni 10 , probamos si son 11
MOVLW A'00000011' ;Cargamos el literal A00100000 a W
XORWF comp,W ;Hacemos un XOR entre los valores de RA0-RA1 con W
BZ Caso_11_btn ;Si el XOR es 0 quiere decir que los valores RA0-RA1
son 11,
;llamamos a Caso_11_btn
GOTO Fin_casos_btn ;Finalmente llamamos a Fin_casos_btn

Caso_00_btn ;En caso de que RB4-RB5 sean 00

CLRF CCPR1L ;Borramos CCPR1L


MOVLW 0X8E
MOVWF CCPR1L
MOVLW 0X12 ;Cargamos el literal 0x10 a W
MOVWF CCPR1H ;Cargamos CCPR1H con el valor de W
;este valor se calcul para darnos un periodo
secuencia 1
GOTO Fin_casos_btnr
Caso_01_btn ;En caso de que RA0-RA1 sean 01
CLRF CCPR1L ;Borramos CCPR1L
MOVLW 0X1C
MOVWF CCPR1L
CLRF CCPR1H ;Borramos CCPR1H
MOVLW 0X25
MOVWF CCPR1H ;Cargamos CCPR1H con el valor de 0x20
;este valor se calcul para darnos un periodo
secuencia 2
GOTO Fin_casos_btnr
Caso_10_btn ;En caso de que RB4-RB5 sean 10
CLRF CCPR1L ;Borramos CCPR1L
MOVLW 0X47
MOVWF CCPR1L
CLRF CCPR1H ;Borramos CCPR1H
MOVLW 0X9
MOVWF CCPR1H ;Cargamos CCPR1H con el valor de 0x8
;este valor se calcul para darnos un periodo
de 1 segundo
GOTO Fin_casos_btnr
Caso_11_btn ;En caso de que RA0-RA1 sean 11
BSF sis_flag,0 ;Ponemos a 0 el bit 0 del registro sis_flag
GOTO Fin_casos_btn ;Llamamos al procedimeinto Fin_casos_btn
Fin_casos_btnr
BCF sis_flag,0 ;Pone a 0 el bit 0 de sis_flag
Fin_casos_btn
BCF INTCON,RBIF ;Desactiva el flag de interrupcin del PORTA
RETFIE ;Retorna al programa principal

INICIO
;Configuracin de puertos
MOVLW A'00110000'
; --11---- Configuramos RA0-RA1 como entradas
;
BANKSEL TRISA ;Seleccionamos banco del registro TRISA
MOVWF TRISB ;Cargamos configuracin a TRISA

MOVLW 0X06 ; Configuramos las lineas del puerto A como


MOVWF ADCON1 ; entadas/salidas digitales

MOVLW b'00000000'
; -------0 Configuramos RA5 como salida
BANKSEL TRISA ;Seleccionamos banco de TRISA
MOVWF TRISA ;Cargamos la configuracin a TRISA
CLRF STATUS ;Banco 0
;===================================================================
;Configuracion del timer1
MOVLW A'00010001'
; --01---- T1CKPS1:T1CKPS0:11 = 1:2 Prescale value
; ----0--- T1OSCEN: Timer1 Oscillator Enable Control bit 1 = Oscillator is
enabled
; -----0-- T1SYNC: Timer1 0 = Synchronize external clock input
; ------0- TMR1CS: Timer1 Clock Source Select bit 1 = External clock
; -------1 TMR1ON: Timer1 On bit
MOVWF T1CON
CLRF TMR1L ;Limpiamos el TIMER1
CLRF TMR1H
;Configuracion de modulos CCP1
CLRF CCPR1L ;Limpiamos CCPR1L
MOVLW 0XFF
MOVWF CCPR1H ;Cargamos CCPR1H con 0xFF
MOVLW A'00001011'
; ----1011 CCPxM3:CCPxM0:1011 = Compare mode
MOVWF CCP1CON

;==================================================================

BANKSEL PIE1
BSF PIE1,CCP1IE
; Configuracin de interrupciones
MOVLW B'11001000'
; 1------ Activamos las interrupciones generales GIE=1
; -1----- Activamos interrupciones de perifricos
; ----1--- Activamos las interrupciones de puerto B RBIE=1
MOVWF INTCON ;Cargamos la configuracin

CLRF STATUS ;BANCO 0

BSF INTCON,RBIF ;Activamos el flaf RBIF para activar la interrupcin de


;PORTB y ver los valores actuales de PORTA

Background
GOTO Background ;Bucle infinito

END

CONCLUSIONES

Para la implementacin fsica de un circuito con PIC debemos conocer con mucha precisin
el hardware del que dispone el PIC, en este caso especfico, el PIC 16F877.

Se necesita tambin un conocimiento completo de los comandos de assembler para la


programacin del PIC.

El programa Proteus conjuntamente con MPLAB, nos permite simular nuestros circuitos sin
la necesidad de quemar el PIC, lo cual nos ahorra tiempo en el desarrollo de nuestros
proyectos.

BIBLIOGRAFA

MPASM USERS GUIDE Microchip


PIC micro Mid-Range MCU Family Reference Manual - Microchip

Curso: Microcontroladores y Microprogramacin Clases Prcticas- Ing. Wildor Ferrel Serruto

Representacin de Datos en Memoria, Abelardo Pardo, Universidad Carlos III de Madrid

Microcontroladores PIC Diseo Prctico de Aplicaciones, Segunda Parte, Jos Angulo


Ustegui, Mc Graw-Hill.