You are on page 1of 16

Zapper

OBJETIVOS: El objetivo del primer trabajo del laboratorio es realizar un programa en lenguaje ensamblador para el PIC 16F877A con el objetivo de emitir pulsos con frecuencia controlable entre 30KHz y 50 KHz. Este PIC adems tendr 3 entradas, las cuales realizarn diferentes funciones. La entrada RB0 tiene la funcin de activar y desactivar el toda la funcin. La segunda entrada es RB4 la cual subir la frecuencia de los pulsos enviados por cada flanco de subida. La tercera y ltima entrada es RB5, que de manera contraria, disminuye la frecuencia de los pulsos enviados por cada flanco de subida. El PIC tiene dos salidas. La primera es RD0, la cual indica si la funcin del PIC est activada o no. Finalmente, la salida desde donde se originan los pulsos, es RD1. El circuito para poder simular el Zapper en ISIS se muestra a continuacin.

Fig. 1: Circuito para simular el Zapper DESARROLLO: Para poder realizar esta aplicacin se utiliz el simulador y ensamblador MPLAB y el simulador ISIS de Proteus. Para poder realizar la simulacin, se disearon varios diagramas de flujo, cada uno con una funcin en especial. Se disearon diagramas de flujo para el PROGRAMA PRINCIPAL, DELAY, INTERRUPCION, INTERRUPCION INTONOFF e INTERRUPCION INTCAMBIO. Los diagramas de flujo se muestran a continuacin.

DIAGRAMA DE FLUJO PARA EL PROGRAMA PRINCIPAL

INICIO

DECLARAR VARIABLES REGTIMER CONTA1 REGISTRO REG2 REGONOFF

HABILITAR INTERRUPCIONES GIE = 1 RBIE = 1 INTE = 1 T0IE = 1

PORTA SALIDA PORTB ENTRADA REGTIMER = .211 REGONOFF = 0x00 REGISTRO = PORTB

SI
REGONOFF,0 = 0?

NO
RD0 = 0

DIAGRAMA DE FLUJO DE LA INTERRUPCION

INICIO INTERRUPCION

GUARGAR W, STATUS, PCLATH

INTF0 = 0?

INT_ONOFF

NO
RBIF = 0? INT_CAMBIO

NO
T0IF = 0? INT_TMR0

NO
RECUPERA W, STATUS, PCLATH

SALIR INTERRUPCION

DIAGRAMA DE FLUJO DE LA INTERRUPCION INT_ONOFF

INICIO INT_ONOFF

SI

REGONOFF = 0?

NO

CONTA1 = REGTIMER

CONTA1 = REGTIMER

INTF = 0

SALIR INT_ONOFF

DIAGRAMA DE FLUJO DE LA INTERRUPCION INT_CAMBIO (FRECUENCIA)


SALIR INT_ONOFF

SI

RD0 = 0?

NO
REG2 = PORTB XOR REGISTRO

REG2,4 = 1?

NO

REG2,5 = 1?

NO

SI
NO
RB4 = 1?

SI
RB4 = 1?

NO

SI SI
REGTIMER = .170?

SI
REGTIMER = .211?

SI
NO
REGTIMER = REGTIMER 1

NO
REGTIMER = REGTIMER + 1

REGISTRO = PORTB

RBIF = 0

SALIR INT_CAMBIO

DIAGRAMA DE FLUJO DE LA INTERRUPCION DE INT_TMR0


INICIO INT_TMR0

RDO = 0?

SI

NO

SI

RD1 = 0?

NO

CONTA1 = REGTIMER

CONTA1 = REGTIMER

TMR0 = REGTIMER

T0IF = 0

SALIR INT_TMR0

A partir del diagrama de flujo se procedi a realizar el programa en lenguaje ensamblador. Este programa se muestra a continuacin.
list #include p=16f877A ; list directive to define processor <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF ;***** VARIABLE DEFINITIONS w_temp EQU 0x7D status_temp EQU 0x7E pclath_temp EQU 0x7F REGTIMER EQU 0x20 CONTA1 EQU 0x21 REGISTRO EQU 0x22 REG2 EQU 0x23 REGONOFF EQU 0x24 ; ; ; ; ; ; ; ; variable variable variable VARIABLE VARIABLE REGISTRO REGSITRO REGISTRO used for context saving used for context saving used for context saving QUE GUARDA EL TIEMPO DEL CONTADOR DEL CONTADOR\ PARA EL PORTB ANTERIOR PARA LA COMPARACION PARA DE ENCENDIDO Y APAGADO

;********************************************************************** ORG 0x000 ; processor reset vector nop goto ORG main 0x004 ; nop required for icd ; go to beginning of program ; interrupt vector location ; save off current W register contents

movwfw_temp

movf movwf movf movwf goto

STATUS,w status_temp PCLATH,w pclath_temp Rut_Interrupcion

; move status register into W register ; save off contents of STATUS register ; move pclath register into w register ; save off contents of PCLATH register

Salir_Interrupcion: movf pclath_temp,w ; retrieve copy of PCLATH register movwf PCLATH ; restore pre-isr PCLATH register contents movfstatus_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapfw_temp,f swapfw_temp,w ; restore pre-isr W register contents retfie ; return from interrupt main ;---------;Configurar ;---------bsf STATUS,RP0 bcf STATUS,RP1 clrf TRISD movlw 0xFF movwf TRISB movlw b'11000000' movwf OPTION_REG bcf STATUS,RP0 bcf STATUS,RP1 movlw .172 movwf REGTIMER movlw 0x00 movwf REGONOFF movfw PORTB movwf REGISTRO clrf PORTD movfw REGTIMER movwf TMR0 ;-----------------------; Habilitar Interrupciones ;-----------------------bsf INTCON,GIE bsf INTCON,RBIE bsf INTCON,INTE bsf INTCON,T0IE ;-----------------------; Programa principal ;-----------------------PP: btfsc goto goto ENCENDIDO: bsf goto APAGADO: bcf goto FINPP: goto PP REGONOFF,0 ENCENDIDO APAGADO PORTD,0 FINPP PORTD,0 FINPP ;Si esta apagado, no hace nada ;Si esta encendido, emite los pulsos

; Banco1 ; PORTD Salida ; PORTB Entrada ; Configuramos TMR0 ; Banco0 ; Iniciando la frecuencia para 30KHz ; Iniciando la funcion en apagado OFF

; ; ; ;

GIE=1 RBIE=1 INTE=1 TOIE=1

;-----------------------; Rutina de las interrupciones ;-----------------------Rut_Interrupcion: btfsc INTCON,INTF goto Int_ONOFF btfsc INTCON,RBIF goto Int_CAMBIO btfsc INTCON,T0IF goto Int_TMR0 goto Salir_Interrupcion ;-----------------------; Rutina de interrupcion de emision de pulsos ;-----------------------Int_TMR0: btfss goto goto RUTINATIMER: btfsc goto goto Hacer0_D1: bcf goto Hacer1_D1: bsf goto salir_TMR0: movfw movwf bcf goto PORTD,0 salir_TMR0 RUTINATIMER PORTD,1 Hacer0_D1 Hacer1_D1 PORTD,1 salir_TMR0 PORTD,1 salir_TMR0 REGTIMER TMR0 INTCON,T0IF Salir_Interrupcion

;-----------------------; Rutina de interrupcion de encendido y apagado (RB0) ;-----------------------Int_ONOFF: btfsc REGONOFF,0 goto Hacer0_D0 goto Hacer1_D0 Hacer0_D0: bcf REGONOFF,0 goto salir_IntONOFF Hacer1_D0: bsf REGONOFF,0 goto salir_IntONOFF salir_IntONOFF: bcf INTCON,INTF goto Salir_Interrupcion ;-----------------------; Rutina de interrupcion de incremento y disminucin de frecuencia (RB4 y RB5) ;-----------------------Int_CAMBIO: btfss goto goto RUTINA movfw xorwf movwf PORTB REGISTRO,W REG2 PORTD,0 salir_Int RUTINA

BIT4CAMBIO: btfss goto goto BIT5CAMBIO: btfss goto goto

REG2,4 BIT5CAMBIO rutinaflanco4 REG2,5 salir_Int rutinaflanco5

;Verifica si hubo cambios en RB4

;Verifica si hubo cambios en RB5

rutinaflanco4: btfss PORTB,4 goto salir_Int goto subirfrec rutinaflanco5: btfss PORTB,5 goto salir_Int goto bajarfrec subirfrec movlw subwf btfsc goto movlw addwf goto bajarfrec movlw subwf btfsc goto movlw subwf goto salir_Int: movfw movwf bcf goto END

;Verifica si hubo flanco de subida en RB4

;Verifica si hubo flanco de subida en RB5

;Aumenta la frecuencia de los pulsos disminuyendo el tiempo del delay .211 REGTIMER,W STATUS,Z salir_Int .3 REGTIMER salir_Int ;Disminuye la frecuencia de los pulsos aumentando el tiempo del delay .172 REGTIMER,W STATUS,Z salir_Int .3 REGTIMER salir_Int

PORTB REGISTRO INTCON,RBIF Salir_Interrupcion ; directive 'end of program'

Este programa explica paso a paso como se realiza el proceso para poder emitir los pulsos y variarles su frecuencia a travs de una interrupcin.

RESULTADOS: La simulacin inicia en estado de apagado. Al mandar un flanco de subida con RB1, el PIC inicia su funcionamiento y emite los pulsos con una frecuencia inicial de 30 KHz.

Fig. 2: Encenciendo el circuito Zapper

Fig. 3: Frecuencia inicial del Zapper

En la figura anterior se puede observar como el periodo de inicio es de 32.75us, que aproximan a una frecuencia de 30KHz. Luego, se procede a comprobar como la frecuencia varia cada vez que se enva un flanco de subida a RB4 o RB5.

Fig. 4: La frecuencia de salida disminuye al mandar un flanco de subida en RB4

De la misma manera, cuando se enve un flanco de subida a RB5, la frecuencia disminuir. Esto va a suceder siempre y cuando la frecuencia se encuentre entre los valores definidos (30KHz a 50KHz). CONCLUSIN: - Al desarrollar el programa, se not que el periodo por ciclo del TMR0 es aproximadamente 560us. Lo cual no servira para la aplicacin de enviar pulsos de 20us. - Para poder usar el TIMER0 se configura el OPTION_REG para poder escalar el contador (OPTION_REG = 11000000). Luego se modifica la frecuencia del PIC para poder llegar al tiempo deseado (20us y 33.3us). - El cdigo del delay va a variar cada vez que se aumente las lneas de programacin. Esto sucede ya que a ms instrucciones en el bucle, ms tiempo va a tomar el delay en realizarse. - Se concluye que cada vez q se suma o se resta 3 al registro REGTIMER, este va a variar aproximadamente 1KHz.

Dimmer
OBJETIVOS:

El objetivo del segundo trabajo del laboratorio es desarrollar un programa a travs de MPLAB en lenguaje ensamblador para el PIC 16F877A cuya tarea es poder controlar el desfasaje de un pulso de 1ms permitiendo asimismo controlar la luminosidad de una carga, en este caso, un foco. Este PIC tendr 3 entradas, las cuales realizarn diferentes funciones. La entrada RB0 tiene la funcin de recibir la seal proveniente el circuito detector de cruce por cero. La segunda entrada es RB4 a travs de la cual se generar el desfasaje hacia la derecha por cada flanco de subida. La tercera y ltima entrada es RB5, que de manera contraria, generar el desfasaje hacia la izquierda por cada flanco de subida. Adems el PIC tendr una salida que ser RD0, por donde saldr el pulso en la fase que se desee. El circuito para poder simular el Dimmer en ISIS se muestra a continuacin.

DESARROLLO: Para poder realizar esta aplicacin se utiliz el simulador y ensamblador MPLAB y el simulador ISIS de Proteus. Para poder realizar la simulacin, se disearon varios diagramas de flujo, cada uno con una funcin en especial. Los diagramas de flujo se muestran a continuacin.

DIAGRAMA DE FLUJO INICIO

RB Entrada RD Salida

Cont=0 Cont_desf=0

GIE=1 RBIE=1 1 Leer RB0

No RB0=0? 1

Si RB4=1? No Si Contador=Contador+1 Si Contador=Contador-1 RB5=5? No 1

Rutina_Cuenta

Rutina_Cuenta

Rutina_Cuenta

Contador_dsf = Contador

2 Contador_desf=0? No Si RD0=1 2 Delay_10ms

Delay_1MS

RD0=0

A partir del diagrama de flujo se procedi a realizar el programa en lenguaje ensamblador. Este programa se muestra a continuacin.
list p=16F877A ; Indica el modelo de PIC que se usa include <p16F877A.inc> ; en este inc estn etiquetadas algunas direcciones para un mejor entendimiento del programa. __CONFIG _LVP_OFF _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_OFF &

;***** VARIABLE DEFINITIONS w_temp EQU 0x7D status_temp EQU 0x7E pclath_temp EQU 0x7F CONT EQU 0x25 CONT_TIME EQU 0x26 ORG nop goto 0x000 main

; variable used for context saving ; variable used for context saving ; variable used for context saving

; processor reset vector ; nop required for icd ; go to beginning of program ; interrupt vector location ; save off current W register contents ; move status register into W register ; save off contents of STATUS register ; move pclath register into w register ; save off contents of PCLATH register

ORG 0x004 movwfw_temp movf STATUS,w movwf status_temp movf PCLATH,w movwf pclath_temp goto Rut_Inter Salir_Inter: movf pclath_temp,w movwf PCLATH movfstatus_temp,w movwf STATUS swapfw_temp,f swapfw_temp,w retfie

; retrieve copy of PCLATH register ; restore pre-isr PCLATH register contents ; retrieve copy of STATUS register ; restore pre-isr STATUS register contents ; restore pre-isr W register contents ; returnfrominterrupt

;-------------------------------;Configuracin inicial de puertos ;-------------------------------main CLRF PORTB BSF STATUS,RP0 BCF STATUS,RP1 ;BANCO 1 (RP0=1 RP1=0) MOVLW 0X06 MOVWF ADCON1 ;PORTA ENTRADA DIGITAL MOVLW 0xFF MOVWF TRISB ;ENTRADA CLRF TRISD ;SALIDA MOVLW b'11000111' MOVWF OPTION_REG BCF STATUS,RP0

BCF MOVLW .1 MOVWF CONT

STATUS,RP1

;BANCO O (RP0=0 RP1=0)

;------------------------; Habilitar Interrupciones ;------------------------BSF INTCON,GIE BSF INTCON,RBIE

; GIE=1 ; RBIE=1

;------------------; Programa principal ;------------------DIMMER MOVWF BTFSS GOTO GOTO PORTB PORTB,0 DIMMER CTA_1

CTA_1 CTA_2

MOVF CONT,W MOVWF CONT_TIME DECFSZ CONT_TIME,F GOTO DESFASE GOTO PULSE CALL GOTO BSF CALL BCF CALL GOTO Delay_10ms CTA_2 PORTD,0 Delay_1ms PORTD,0 Delay_10ms DIMMER

DESFASE PULSE

;----------------------------; Rutina de las interrupciones ;----------------------------Rut_Inter: btfss INTCON,RBIF GOTO Salir_Inter GOTO BTN_1 ;--------------------;Testeo de los botones ;--------------------BTN_1 BTFSS PORTB,4 GOTO BTN_2 GOTO AUMNT_TIME BTFSS PORTB,5 GOTO salir_Int GOTO DISM_TIME MOVLW .1 ADDWF CONT,F GOTO salir_Int MOVLW .1

BTN_2

AUMNT_TIME

DISM_TIME

SUBWF CONT,F GOTO salir_Int salir_Int: BCF GOTO INTCON,RBIF Salir_Inter

INCLUDE "ModDelay10MHz.asm" END ; directive 'end of program'

Simulacin:

You might also like