Sei sulla pagina 1di 13

Practica

Hacer un programa que controle la intensidad luminosa en una lmpara


incandescente alimentada con C.A. (Dimmer)
Mediante el control del ngulo de disparo por medio del
triac T1 de la tarjeta de desarrollo.
Incrementar la luminosidad con la tecla S3 y decrementarla con la tecla S2.

Fecha: 03 de septiembre de 2014

Introduccin
Se realizo tres programas en MAPLAB. En donde el primero nosotros tuvimos el objetivo de
prender una lmpara incandescente en la salida del puerto C del microcontrolador, usando
control del ngulo de disparo por medio del triac T1 de la tarjeta de desarrollo. Despus en el
segundo programa nosotros controlamos la intensidad de la corriente que llegaba al foco por medio
de las teclas del S2,S3 para decrementar o incrementar la intensidad de luz del foco. En el tercer
programa nosotros hicimos que se agrandaran los rangos del incremento o decremento de la
intensidad o corriente del foco.

Objetivo
1. Prender una lmpara con un programa,
2. Incrementar la luminosidad con la tecla S3 y decrementarla con la tecla S2. Limitar el
encendido y apagado de la lmpara.
3. Que el prender o pagar la lmpara sea en ms intervalos.

Material y Equipo utilizado.

PC.
MPLAB.
Tarjeta con.
Microchip MPLAB IDE.
Microcontrolador PIC16F877A (situado en la tarjeta).
Lmpara

Diagrama esquemtico de circuito.

Programa documentado
Programa encender la lmpara. Primer programa
list

p=16F877A

; Indica el modelo de PIC que se usa


; Es una directiva de ensamblador
#include <p16F877A.inc>
; definicin de registros del microcontrolador

;***** DEFINICIN DE VARIABLES


DELH
EQU 0x20
DELL
EQU 0x21
CONT EQU 0x22
DECRE EQU 0x23
;RESULTADO
EQU

0x22

;**********************************************************************
ORG 0x00
; vector de reset
goto MAIN
; salta al inicio del programa
ORG 0x05
INICIALIA

bcf STATUS,RP0
bcf
STATUS,RP0 ;selacciona banco 0
bcf
STATUS,RP1
;Selecciona banco 0
clrf PORTA
;Limpia los latches de salida del puerto A
bsf STATUS,RP0
;Selecciona banco 1 purto A
movlw
0x06
;Configura todos los pines del puerto A
movwf
ADCON1
;como E/S digitales
movlw
movwf
bcf

0x23
TRISA
STATUS,RP0

;Programa RA0, RA1 y RA5 como entradas


;y RA2, RA3 y RA4 como salidas
;Selecciona banco 0

movlw
0x0C
movwf
PORTA
;Saca 0x0C por puerto A
bcf
STATUS,RP1
;Selecciona banco 0
clrf PORTC
;Limpia los latches de salida del puerto C
bsf STATUS,RP0
;Selecciona banco 1 purto C
movlw
0x06
;Configura todos los pines del puerto C
movwf
ADCON1
;como E/S digitales
movlw
movwf

0x00
TRISC

;Programa RA0, RA1 y RA5 como entradas


;y RA2, RA3 y RA4 como salidas

bcf
STATUS,RP0
;Selecciona banco 0
movlw
0x0C
movwf
PORTC
;Saca 0x0C por puerto C
return
DELAY
DEL2
DEL1

movf DISP,w
movwf DELH
movlw 0xFF
movwf DELL
decfsz
goto DEL1
decfsz
goto DEL2
return

;Subrutina de retardo

DELL,f
DELH,f

MAIN call INICIALIA

SALTO btfsc
goto

;subrutina de inicializacin de puertos

PORTA,1
SALTO

movlw 0x0C
movwf PORTC
LEER btfss
goto

; Verificamos el estado del bit 1 del puerto A,se salta la siguiente instruccin si el bit 1 es 0
;Regresa ala instruccin con la etiqueta SALTO

;Mueve el Valor literal 0 al registro de trabajo


;Mueve el valor del registro de trabajo al puerto C ,apaga el foco
PORTA,1
LEER

call DELAY
movlw 0x02
movwf PORTC

;Verifica el estado del bit 1 del puerto A se el bit es uno salta la siguente instruccion
; Regresa ala instruccin con la etiqueta LEER

;Subrutina de retardo
;Mueve el valor literal 2 al registro de trabajo W
; Mueve el valor del registro de trabajo al puerto C prende el foco

goto SALTO

;Regresa ala etiquta Salto

END

;Fin del programa

Programa para limitar (segundo programa )


list

p=16F877A

; Indica el modelo de PIC que se usa


; Es una directiva de ensamblador
#include <p16F877A.inc>
; definicin de registros del microcontrolador

;***** DEFINICIN DE VARIABLES


DELH
EQU 0x20
DELL
EQU 0x21
CONT EQU 0x22
DISP EQU 0x23
;RESULTADO

EQU

0x22

;**********************************************************************
ORG 0x00
; vector de reset
goto MAIN
; salta al inicio del programa
ORG 0x05
INICIALIA

bcf STATUS,RP0

bcf

STATUS,RP0

bcf

STATUS,RP1

clrf

;selacciona banco 0

PORTA

;Limpia los latches de salida del puerto A

bsf STATUS,RP0
movlw
movwf
movlw
movwf

;Selecciona banco 0

;Selecciona banco 1 purto A


0x06
ADCON1

0x32
TRISA

;Configura todos los pines del puerto A


;como E/S digitales
;Programa RA0, RA1 y RA5 como entradas
;y RA2, RA3 y RA4 como salidas

bcf

STATUS,RP0
movlw
movwf

bcf

;Selecciona banco 0

0x0C
PORTA

STATUS,RP1

clrf

;Selecciona banco 0

PORTC

;Limpia los latches de salida del puerto C

bsf STATUS,RP0
movlw
movwf

DEL2
DEL1

;Configura todos los pines del puerto C


;como E/S digitales

0x00
TRISC
STATUS,RP0

movlw
movwf
movlw 0x15
movwf DISP
return
DELAY

;Selecciona banco 1 purto C


0x06
ADCON1

movlw
movwf
bcf

;Saca 0x0C por puerto A

;Programa RA0, RA1 y RA5 como entradas


;y RA2, RA3 y RA4 como salidas
;Selecciona banco 0

0x0C
PORTC

movf DISP,w
movwf DELH
movlw 0xFF
movwf DELL
decfsz
goto DEL1
decfsz
goto DEL2
return

;Saca 0x0C por puerto C

;Subrutina de retardo

DELL,f
DELH,f

MAIN call INICIALIA ;Llama ala subrutina de inicializacion de puertos


LAZO
btfsc PORTA,1
goto LAZO
bcf PORTC,1

;Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es cero
;Regesa ala etiqueta LAZO
;apaga triac

LAZO1
btfss PORTA,1
goto LAZO1

;lee estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es uno
;Regesa ala etiqueta LAZO1
; leer el estado s2 con un salto condicional

btfsc PORTA,5 ;Verifica el estado del bit 5 del puerto A se salta la siguiente instruccin si el bit es cero
goto LAZO2
; verifica s2, Regesa ala etiqueta LAZO
; modificar el retardo
movf DISP,w
;Mueve DISP al registro de trabajo W
sublw 0x30
; Resta el valor de W con 30
btfss STATUS,Z ;Verifica la vandeja de estado cero, se salta la siguiente instruccin si el bit es uno
incf DISP,f
goto LAZO3

;Incrementa 1 el valor de DISP


;Salta a la etiqueta LAZO3

LAZO2
btfsc

; si no esta presionado me voy a lazo2


;Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es cero

PORTA,4

goto LAZO3

;verifica s3, Salta a la etiqueta LAZO3

movf DISP,w

; Mueve el valor DISP al registro de trabajo W

sublw 0x01
;mueve el valor literal 0x01 a registro de trabajo W
btfss STATUS,Z ;Verifica la vandeja de estado cero, se salta la siguiente instruccin si el bit es uno
decf DISP,f
;Decrementa un bit a DISP

LAZO3 call DELAY ;Subrutina de retardo


bsf PORTC,1 ;dispara triac
goto LAZO
END

;Regresa ala etiquta LAZO

; directiva "fin del programa "

Programa que controle la intensidad luminosa en una lmpara incandescente


alimentada con C.A. (Dimmer) tercer programa
list

p=16F877A

; Indica el modelo de PIC que se usa


; Es una directiva de ensamblador
#include <p16F877A.inc>
; definicin de registros del microcontrolador

;***** DEFINICIN DE VARIABLES


DELH
DELL
RETH
DISP
SEM_CONT
RETL
EQU
SEMI
EQU

EQU
EQU 0x21
EQU
0x22
EQU
0x23
EQU
0x24
0x25
0X26

;RESULTADO

EQU

0x20

0x22

;**********************************************************************
ORG
0x00
; vector de reset
movlw
0x10
movwf
SEMI
goto MAIN
ORG
0x05
INICIALIA bcf
STATUS,RP0

bcf

STATUS,RP1

; salta al inicio del programa

;Selecciona banco 0

clrf PORTA

;Limpia los latches de salida del puerto A

bsf

STATUS,RP0

;Selecciona banco 1 purto A

movlw
movwf

0x06
ADCON1

;Configura todos los pines del puerto A


;como E/S digitales

movlw 0x32
movwf
TRISA

;Programa RA0, RA1 y RA5 como entradas


;y RA2, RA3 y RA4 como salidas

bcf

STATUS,RP0

;Selecciona banco 0

movlw
movwf

0x0C
PORTA

;Saca 0x0C por puerto A

bcf

STATUS,RP1

;Selecciona banco 0

clrf PORTC

;Limpia los latches de salida del puerto C

bsf

;Selecciona banco 1 purto C

STATUS,RP0

movlw

0x06
movwf

ADCON1

;Configura todos los pines del puerto C


;como E/S digitales

movlw 0x00
movwf
TRISC

;Programa RA0, RA1 y RA5 como entradas


;y RA2, RA3 y RA4 como salidas

bcf

;Selecciona banco 0

STATUS,RP0

movlw
0x0C
movwf
PORTC
movlw 0x29
movwf RETH
movlw
0x10
movwf
SEM_CONT
bcf
PORTC,1
return
DELAY

movf

DEL2
DEL1

MAIN

call

;Saca 0x0C por puerto C

;le da a W un valor literal de 10


;Mueve el valor de W a la variable SEM_CONT
;Limpia el bit 1 del Puerto C

RETH,w
Subrutina de retardo
movwf
DELH
movlw
0xFF
movwf
DELL
decfsz DELL,f
goto
DEL1
decfsz DELH,f
goto DEL2
return
INICIALIA

LAZO
btfsc PORTA,1
goto
LAZO
bcf
PORTC,1
LAZO1

btfsc

PORTA,1 ; Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es cero

goto
btfsc
goto
movf
sublw
btfsc
goto

LAZO1
;Regresa ala instruccin en donde este la etiquta LAZO1
PORTA,5 ; Verifica el estado del bit 5 del puerto A se salta la siguiente instruccin si el bit es cero
LAZO2
;Salta a la etiqueta LAZO2
RETH,w ;Mueve el valor RETH a W
0x30
;Resta W con 30
STATUS,Z ;Verifica la vandeja de estado cero, se salta la siguiente instruccin si el bit es cero
LAZO3 ;Slta a donde esta la etiqueta de LAZO3

decfsz
goto
incf

LAZO2

; Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es cero
;Regresa ala instruccin en donde este la etiquta LAZO
;apaga triac

SEMI,f ;Decrementa SEME de F


LAZO3 ;Salta ala etiqueta LAZO3
RETH,f ;Incremeta RETH

movlw
movwf

0x10
SEMI

;Mueve un valor literal a W


; Mueve este valor literal a SEMI

goto

LAZO3 ;Salta ala etiqueta LAZO3

; si no esta presionado me voy a lazo2


btfsc PORTA,4
; Verifica el estado del bit 4 del puerto A se salta la siguiente instruccin si el bit es cero
goto
LAZO3
;Salta a la etiqueta LAZO3
movf
sublw
btfsc
goto

RETH,w
0x01
STATUS,Z
LAZO3

decfsz
goto

SEMI,f
LAZO3

decf
movlw
movwf

RETH,f
0x10
SEMI

;Mueve RETH a w
;Resta W con 1
Verifica la vandeja de estado cero, se salta la siguiente instruccin si el bit es cero
;Salta a la etiqueta LAZO 3
;Decrementa SEMI
;Salta a la etiqueta LAZO 3

;Decrementa RETH
;Mueve el valor literal a W
;Mueve el valor de w a SEMI

LAZO3

END

btfss

PORTA,1

; Verificamos el estado del bit 1 del puerto A,se salta la siguiente instruccin si el bit 1 es 1

goto

LAZO3

;Regresa a la etiqueta LAZO3

call
bsf
goto

DELAY
PORTC,1
LAZO

;Llama ala subrutina de retardo


;dispara triac
;Regresa a la etiqueta LAZO
; directiva "fin del programa "

Desarrollo
El diagrama de Flujo

Programa para encender la lmpara

Creamos un proyecto nuevo en MPLAB.


Configuramos los Bits. (FIGURA 1.0)

Figura 1.0

Colocamos el cdigo del primer programa.


Guardamos el cdigo como .asm.
En la siguiente parte del programa es donde se hace la tarea de encienda
y apague la lmpara
MAIN call INICIALIA

SALTO btfsc
PORTA,1
goto
SALTO
movlw 0x0C
movwf PORTC
LEER btfss PORTA,1
goto
LEER
call DELAY
movlw 0x02
movwf PORTC
goto SALTO

END

En el programa se encuentra las siguientes instrucciones de la subrutina.


DELAY
DEL2
DEL1

movlw
movwf
movlw
movwf
decfsz
goto DEL1
decfsz
goto
return

0xFF
DELH
0xFF
DELL
DELL,f
DELH,f
DEL2

Una vez hecho correctamente el programa se ensambla, y si no hay ningn error.


Programamos el PIC
Una vez programado en la tarjeta se prendi el foco. Resultados en la tarjeta (FIGURA 1.1)

FIGURA 1.1
Programa para limitar la lmpara.

Creamos un proyecto nuevo en MPLAB.


Configuramos los Bits. (FIGURA 1.0)

Figura 1.0

Colocamos el cdigo del segundo programa.


Guardamos el cdigo como .asm.
En la siguiente parte del programa es donde se hace la tarea de limitar el
encendido y apagado de la lmpara.

MAIN call INICIALIA ;Llama ala subrutina de inicializacion de puertos


LAZO
btfsc PORTA,1
goto LAZO
bcf PORTC,1

;Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es cero
;Regresa ala etiqueta LAZO
;apaga triac, foco apagado

LAZO1
btfss PORTA,1
goto LAZO1

;lee estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es uno
;Regresa ala etiqueta LAZO1
; leer el estado s2 con un salto condicional

btfsc PORTA,5 ;Verifica el estado del bit 5 del puerto A se salta la siguiente instruccin si el bit es cero
goto LAZO2
; verifica s2, Regresa a la etiqueta LAZO
; modificar el retardo
movf DISP,w
;Mueve DISP al registro de trabajo W
sublw 0x30
; Resta el valor de W con 30,el valor de 30 es donde el foco esta apagado
btfss STATUS,Z ;Verifica la bandeja de estado cero, se salta la siguiente instruccin si el bit es uno
incf DISP,f
goto LAZO3
LAZO2
btfsc

PORTA,4

;Incrementa 1 el valor de DISP


;Salta a la etiqueta LAZO3
; si no esta presionado me voy a lazo2
;Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es cero

goto LAZO3

;verifica s3, Salta a la etiqueta LAZO3

movf DISP,w

; Mueve el valor DISP al registro de trabajo W

sublw 0x01
;mueve el valor literal 0x01 a registro de trabajo W,foco con la mayor corriente posible
btfss STATUS,Z ;Verifica la bandeja de estado cero, se salta la siguiente instruccin si el bit es uno
decf DISP,f
;Decrementa un bit a DISP

LAZO3 call DELAY ; Subrutina de retardo


bsf PORTC,1 ;dispara triac
goto LAZO
END

;Regresa ala etiquta LAZO

; directiva "fin del programa "

En el programa tiene una subrutina DELAY en donde est la variable DISP.


DELAY
DEL2
DEL1

movf
DISP,w
movwf DELH
movlw 0xFF
movwf DELL
decfsz DELL,f
goto
DEL1
decfsz DELH,f
goto
DEL2
return

Una vez hecho correctamente el programa se ensambla, y si no hay ningn error de sintaxis.
Programamos el PIC

Una vez programado en la tarjeta podemos controlar la intensidad del foco por medio de
las teclas S2 Y S3,ademas de que estas estn limitadas, o sea al incrementar a un valor
mximo o mnimo estas ya no se incrementan o decrementan .

La tercera parte es igual que la segundo solo que ahora tenemos que agregar un contador para as
poder hacer que el encendido o apagado de la lmpara valla ms lento. Simplemente le agregamos
lo siguiente.
MAIN

call

INICIALIA

;Inicializamos los puertos

LAZO
btfsc PORTA,1

; Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es

cero

LAZO1
cero

goto
bcf

LAZO
PORTC,1

;Regresa ala instruccin en donde este la etiquta LAZO


;apaga triac

btfsc

PORTA,1 ; Verifica el estado del bit 1 del puerto A se salta la siguiente instruccin si el bit es

goto
btfsc

LAZO1
;Regresa ala instruccin en donde este la etiquta LAZO1
PORTA,5 ; Verifica el estado del bit 5 del puerto A se salta la siguiente instruccin si el bit es

goto
movf
sublw
btfsc

LAZO2
;Salta a la etiqueta LAZO2
RETH,w ;Mueve el valor RETH a W
0x30
;Resta W con 30
STATUS,Z ;Verifica la vandeja de estado cero, se salta la siguiente instruccin si el bit es cero

goto

LAZO3

cero

decfsz
goto
incf

;Slta a donde esta la etiqueta de LAZO3

SEMI,f ;Decrementa SEME de F


LAZO3 ;Salta ala etiqueta LAZO3
RETH,f ;Incremeta RETH

movlw
movwf

0x10
SEMI

goto

LAZO3 ;Salta ala etiqueta LAZO3

LAZO2
btfsc PORTA,4

;Mueve un valor literal a W


; Mueve este valor literal a SEMI

; si no esta presionado me voy a lazo2


; Verifica el estado del bit 4 del puerto A se salta la siguiente instruccin si el bit es

cero

LAZO3

goto

LAZO3

;Salta a la etiqueta LAZO3

movf
sublw
btfsc

RETH,w
0x01
STATUS,Z

;Mueve RETH a w
;Resta W con 1
Verifica la vandeja de estado cero, se salta la siguiente instruccin si el bit es cero

goto

LAZO3

;Salta a la etiqueta LAZO 3

decfsz
goto

SEMI,f
LAZO3

;Decrementa SEMI
;Salta a la etiqueta LAZO 3

decf
movlw
movwf

RETH,f
0x10
SEMI

;Decrementa RETH
;Mueve el valor literal a W
;Mueve el valor de w a SEMI

btfss PORTA,1
goto
LAZO3
call DELAY
bsf PORTC,1
goto
LAZO

;dispara triac

END

; directiva "fin del programa "

En el programa tiene una subrutina DELAY en donde est la variable DISP.


DELAY
DEL2
DEL1

movf
DISP,w
movwf DELH
movlw 0xFF
movwf DELL
decfsz DELL,f
goto
DEL1
decfsz DELH,f
goto
DEL2
return

Una vez hecho correctamente el programa se ensambla, y si no hay ningn error de sintaxis.
Programamos el PIC
Ensamblamos el programa en el microcontrolador y con las teclas S2,S3 se pudo observar
que se alago el intervalo de incrementar la intensidad de corriente en el foco a su vez que el
decremento se observo que se haba largo el apagado segn como oprimamos la tecla de
apagado.

Conclusiones
Con esta prctica nosotros pudimos comprender el funcionamiento del dimer en la tarjeta de
desarrollo.
Se logro el objetivo deseado en la primera parte del programa que era lograr prender el foco y
observar que pasaba si modificbamos los valores del DIPS(disparo) en la subrutina DALAY.
En este caso se observaba que nosotros podamos controlar la corriente en el foco, y averiguar qu
valores eran los mnimos y mximos en el caso de 1 para completamente encendido o 30
completamente pagado.
En el segundo programa nosotros logramos el objetivo de limitar el encendido y el pagado para que
ya no hubiera un incremento ms a ya de 30 (apagado) o decremento en el caso de 1 (encendido).
En el tercer programa se logro alargar el intervalo de encendido o apagado del foco.

Potrebbero piacerti anche