19
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 además tendrá 3 entradas, las cuales realizarán diferentes funciones. La entrada RB0 tiene la función de activar y desactivar el toda la función. 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 función 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 continuación. Fig. 1: Circuito para simular el Zapper

Zapper & dimmer

  • Upload
    csarpc

  • View
    136

  • Download
    3

Embed Size (px)

DESCRIPTION

descripción de como realizar un Zapper y un dimmer con un pic16f877a. código en assembler y simulación en proteus.

Citation preview

Page 1: Zapper & dimmer

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 además tendrá 3 entradas, las cuales realizarán diferentes funciones. La entrada RB0 tiene la función de activar y desactivar el toda la función. 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 función 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 continuación.

Fig. 1: Circuito para simular el Zapper

DESARROLLO:

Para poder realizar esta aplicación se utilizó el simulador y ensamblador MPLAB y el simulador ISIS de Proteus. Para poder realizar la simulación, se diseñaron varios diagramas de flujo, cada uno con una función en especial. Se diseñaron diagramas de flujo para el PROGRAMA PRINCIPAL, DELAY, INTERRUPCION, INTERRUPCION INTONOFF e INTERRUPCION INTCAMBIO. Los diagramas de flujo se muestran a continuación.

Page 2: Zapper & dimmer

DIAGRAMA DE FLUJO PARA EL PROGRAMA PRINCIPAL

INICIO

DECLARAR VARIABLESREGTIMERCONTA1

REGISTROREG2

REGONOFF

¿REGONOFF,0 = 0?

HABILITAR INTERRUPCIONES

GIE = 1RBIE = 1INTE = 1T0IE = 1

PORTA SALIDAPORTB ENTRADA

REGTIMER = .211REGONOFF = 0x00REGISTRO = PORTB

SI

NO

RD0 = 0

Page 3: Zapper & dimmer

DIAGRAMA DE FLUJO DE LA INTERRUPCION

DIAGRAMA DE FLUJO DE LA INTERRUPCION INT_ONOFF

DIAGRAMA DE FLUJO DE LA INTERRUPCION INT_CAMBIO (FRECUENCIA)

INICIO INTERRUPCION

GUARGAR W, STATUS, PCLATH

¿INTF0 = 0?

¿RBIF = 0?

RECUPERA W, STATUS, PCLATH

SALIR INTERRUPCION

NO

NO

INT_ONOFF

INT_CAMBIO

INICIO INT_ONOFF

¿REGONOFF = 0?

CONTA1 = REGTIMER CONTA1 = REGTIMER

SI NO

INTF = 0

SALIR INT_ONOFF

¿T0IF = 0? INT_TMR0

NO

Page 4: Zapper & dimmer

SALIR INT_ONOFF

¿RD0 = 0?

REG2 = PORTB XOR REGISTRO

¿REG2,4 = 1?

¿RB4 = 1?

¿REG2,5 = 1?

¿RB4 = 1?

¿REGTIMER = .170? ¿REGTIMER = .211?

REGTIMER = REGTIMER – 1 REGTIMER = REGTIMER + 1

SI

NO

NO NO

NO NO

NO NO

SI SI

SI SI

SI

SI

DIAGRAMA DE FLUJO DE LA INTERRUPCION DE INT_TMR0

REGISTRO = PORTB

RBIF = 0

SALIR INT_CAMBIO

Page 5: Zapper & dimmer

A partir del diagrama de flujo se procedió a realizar el programa en lenguaje ensamblador. Este programa se muestra a continuación.

list p=16f877A ; list directive to define processor#include <p16f877A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;***** VARIABLE DEFINITIONSw_temp EQU 0x7D ; variable used for context saving status_temp EQU 0x7E ; variable used for context savingpclath_temp EQU 0x7F ; variable used for context savingREGTIMER EQU 0x20 ; VARIABLE QUE GUARDA EL TIEMPO DEL CONTADORCONTA1 EQU 0x21 ; VARIABLE DEL CONTADOR\REGISTRO EQU 0x22 ; REGISTRO PARA EL PORTB ANTERIORREG2 EQU 0x23 ; REGSITRO PARA LA COMPARACIONREGONOFF EQU 0x24 ; REGISTRO PARA DE ENCENDIDO Y APAGADO

;**********************************************************************ORG 0x000 ; processor reset vector

nop ; nop required for icdgoto main ; go to beginning of program

ORG 0x004 ; interrupt vector location

movwfw_temp ; save off current W register contentsmovf STATUS,w ; move status register into W registermovwf status_temp ; save off contents of STATUS registermovf PCLATH,w ; move pclath register into w registermovwf pclath_temp ; save off contents of PCLATH register

INICIO INT_TMR0

¿RD1 = 0?

CONTA1 = REGTIMER CONTA1 = REGTIMER

SI NO

T0IF = 0

SALIR INT_TMR0

¿RDO = 0?

TMR0 = REGTIMER

NO

SI

Page 6: Zapper & dimmer

goto Rut_Interrupcion

Salir_Interrupcion:movf pclath_temp,w ; retrieve copy of PCLATH registermovwf PCLATH ; restore pre-isr PCLATH register contentsmovfstatus_temp,w ; retrieve copy of STATUS registermovwf STATUS ; restore pre-isr STATUS register contentsswapfw_temp,fswapfw_temp,w ; restore pre-isr W register contentsretfie ; return from interrupt

main;----------;Configurar;----------bsf STATUS,RP0bcf STATUS,RP1 ; Banco1clrf TRISD ; PORTD Salidamovlw 0xFFmovwf TRISB ; PORTB Entradamovlw b'11000000'movwf OPTION_REG ; Configuramos TMR0bcf STATUS,RP0bcf STATUS,RP1 ; Banco0movlw .172 ; Iniciando la frecuencia para 30KHzmovwf REGTIMERmovlw 0x00 ; Iniciando la funcion en apagado OFFmovwf REGONOFFmovfw PORTBmovwf REGISTROclrf PORTDmovfw REGTIMERmovwf TMR0

;------------------------; Habilitar Interrupciones;------------------------bsf INTCON,GIE ; GIE=1bsf INTCON,RBIE ; RBIE=1bsf INTCON,INTE ; INTE=1bsf INTCON,T0IE ; TOIE=1

;------------------------; Programa principal;------------------------

PP:btfsc REGONOFF,0goto ENCENDIDOgoto APAGADO

ENCENDIDO:bsf PORTD,0goto FINPP ;Si esta encendido, emite los pulsos

APAGADO:bcf PORTD,0goto FINPP ;Si esta apagado, no hace nada

FINPP:goto PP

;------------------------; Rutina de las interrupciones;------------------------

Page 7: Zapper & dimmer

Rut_Interrupcion:btfsc INTCON,INTFgoto Int_ONOFFbtfsc INTCON,RBIFgoto Int_CAMBIObtfsc INTCON,T0IFgoto Int_TMR0goto Salir_Interrupcion

;------------------------; Rutina de interrupcion de emision de pulsos;------------------------

Int_TMR0:btfss PORTD,0goto salir_TMR0goto RUTINATIMER

RUTINATIMER:btfsc PORTD,1goto Hacer0_D1goto Hacer1_D1

Hacer0_D1:bcf PORTD,1goto salir_TMR0

Hacer1_D1:bsf PORTD,1goto salir_TMR0

salir_TMR0:movfw REGTIMERmovwf TMR0bcf INTCON,T0IFgoto Salir_Interrupcion

;------------------------; Rutina de interrupcion de encendido y apagado (RB0);------------------------

Int_ONOFF:btfsc REGONOFF,0goto Hacer0_D0goto Hacer1_D0

Hacer0_D0:bcf REGONOFF,0goto salir_IntONOFF

Hacer1_D0:bsf REGONOFF,0goto salir_IntONOFF

salir_IntONOFF:bcf INTCON,INTFgoto Salir_Interrupcion

;------------------------; Rutina de interrupcion de incremento y disminución de frecuencia (RB4 y RB5);------------------------

Int_CAMBIO:btfss PORTD,0goto salir_Intgoto RUTINA

RUTINAmovfw PORTBxorwf REGISTRO,Wmovwf REG2

BIT4CAMBIO:btfss REG2,4 ;Verifica si hubo cambios en RB4goto BIT5CAMBIOgoto rutinaflanco4

Page 8: Zapper & dimmer

BIT5CAMBIO:btfss REG2,5 ;Verifica si hubo cambios en RB5goto salir_Intgoto rutinaflanco5

rutinaflanco4:btfss PORTB,4 ;Verifica si hubo flanco de subida en RB4goto salir_Intgoto subirfrec

rutinaflanco5:btfss PORTB,5 ;Verifica si hubo flanco de subida en RB5goto salir_Intgoto bajarfrec

subirfrec ;Aumenta la frecuencia de los pulsos disminuyendo el tiempo del delaymovlw .211subwf REGTIMER,Wbtfsc STATUS,Zgoto salir_Intmovlw .3addwf REGTIMERgoto salir_Int

bajarfrec ;Disminuye la frecuencia de los pulsos aumentando el tiempo del delaymovlw .172subwf REGTIMER,Wbtfsc STATUS,Zgoto salir_Intmovlw .3subwf REGTIMERgoto salir_Int

salir_Int:movfw PORTBmovwf REGISTRObcf INTCON,RBIFgoto Salir_Interrupcion

END ; 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 través de una interrupción.

RESULTADOS:

Page 9: Zapper & dimmer

La simulación 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 envía un flanco de subida a RB4 o RB5.

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

Page 10: Zapper & dimmer

De la misma manera, cuando se envíe 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).

CONCLUSIÓN:

- Al desarrollar el programa, se notó que el periodo por ciclo del TMR0 es aproximadamente 560us. Lo cual no serviría para la aplicación 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 código del delay va a variar cada vez que se aumente las líneas de programación. Esto sucede ya que a más instrucciones en el bucle, más 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.

DimmerOBJETIVOS:

El objetivo del segundo trabajo del laboratorio es desarrollar un programa a través 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 realizarán diferentes funciones. La entrada RB0 tiene la función de recibir la señal proveniente el circuito detector de cruce por cero. La segunda entrada es RB4 a través 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. Además 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 continuación.

Page 11: Zapper & dimmer

DESARROLLO:

Para poder realizar esta aplicación se utilizó el simulador y ensamblador MPLAB y el simulador ISIS de Proteus. Para poder realizar la simulación, se diseñaron varios diagramas de flujo, cada uno con una función en especial. Los diagramas de flujo se muestran a continuación.

DIAGRAMA DE FLUJO

INICIO

RB EntradaRD Salida

Leer RB0

RB0=0? 1

RB4=1? RB5=5? 1

1

No

Si

Cont=0Cont_desf=0

GIE=1RBIE=1

Page 12: Zapper & dimmer

Contador=Contador+1 Contador=Contador-1

Rutina_Cuenta Rutina_Cuenta

Rutina_Cuenta

Contador_dsf = Contador

Contador_desf=0?

RD0=1

Delay_1MS

Delay_10ms

2

2

No No

No

Si

Si Si

Page 13: Zapper & dimmer

A partir del diagrama de flujo se procedió a realizar el programa en lenguaje ensamblador. Este programa se muestra a continuación.

list p=16F877A ; Indica el modelo de PIC que se usainclude <p16F877A.inc> ; en este inc están etiquetadas algunas direcciones para un mejor entendimiento del programa.

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF

;***** VARIABLE DEFINITIONSw_temp EQU 0x7D ; variable used for context saving status_temp EQU 0x7E ; variable used for context savingpclath_temp EQU 0x7F ; variable used for context savingCONT EQU 0x25CONT_TIME EQU 0x26

ORG 0x000 ; processor reset vectornop ; nop required for icdgoto main ; go to beginning of program

ORG 0x004 ; interrupt vector locationmovwfw_temp ; save off current W register contentsmovf STATUS,w ; move status register into W registermovwf status_temp ; save off contents of STATUS registermovf PCLATH,w ; move pclath register into w registermovwf pclath_temp ; save off contents of PCLATH register

RD0=0

1

Page 14: Zapper & dimmer

goto Rut_Inter

Salir_Inter:movf pclath_temp,w ; retrieve copy of PCLATH registermovwf PCLATH ; restore pre-isr PCLATH register contentsmovfstatus_temp,w ; retrieve copy of STATUS registermovwf STATUS ; restore pre-isr STATUS register contentsswapfw_temp,fswapfw_temp,w ; restore pre-isr W register contentsretfie ; returnfrominterrupt

;--------------------------------;Configuración inicial de puertos;--------------------------------main

CLRF PORTBBSF STATUS,RP0BCF STATUS,RP1 ;BANCO 1 (RP0=1 RP1=0)MOVLW 0X06MOVWF ADCON1 ;PORTA ENTRADA DIGITALMOVLW 0xFFMOVWF TRISB ;ENTRADACLRF TRISD ;SALIDAMOVLW b'11000111'MOVWF OPTION_REGBCF STATUS,RP0BCF STATUS,RP1 ;BANCO O (RP0=0 RP1=0)MOVLW .1MOVWF CONT

;-------------------------; Habilitar Interrupciones;-------------------------

BSF INTCON,GIE ; GIE=1BSF INTCON,RBIE ; RBIE=1

;-------------------; Programa principal;-------------------

DIMMER MOVWF PORTBBTFSS PORTB,0GOTO DIMMERGOTO CTA_1

CTA_1 MOVF CONT,WMOVWF CONT_TIME

CTA_2 DECFSZ CONT_TIME,FGOTO DESFASEGOTO PULSE

DESFASE CALL Delay_10msGOTO CTA_2

PULSE BSF PORTD,0CALL Delay_1msBCF PORTD,0CALL Delay_10msGOTO DIMMER

Page 15: Zapper & dimmer

;-----------------------------; Rutina de las interrupciones;-----------------------------

Rut_Inter:btfss INTCON,RBIFGOTO Salir_InterGOTO BTN_1

;---------------------;Testeo de los botones;---------------------

BTN_1 BTFSS PORTB,4GOTO BTN_2GOTO AUMNT_TIME

BTN_2 BTFSS PORTB,5GOTO salir_IntGOTO DISM_TIME

AUMNT_TIME MOVLW .1ADDWF CONT,FGOTO salir_Int

DISM_TIME MOVLW .1SUBWF CONT,FGOTO salir_Int

salir_Int:BCF INTCON,RBIFGOTO Salir_Inter

INCLUDE "ModDelay10MHz.asm"

END ; directive 'end of program'

Simulación:

Page 16: Zapper & dimmer