You are on page 1of 51

CURSO DE MICROCONTROLADORES

Por Aureliano Juan Mancha Garca

DESARROLLADOS NUEVOS PROYECTOS, ms abajo, QUE EL


AUTOR SEGUIR AMPLIANDO.
Estas pginas van dirigidas tanto a estudiantes como a los apasionados por este
tema, que sabemos que son muchos. Sobre todo ahora que estn tan de moda estos
circuitillos que andan por la red. Nosotros desde aqu queremos ensear unas
nociones sobre los microcontroladores con ayuda de unas prcticas muy sencillas y
que vosotros podris ampliar. Podris automatizar algunas actividades mediante
sensores adecuados, como por ejemplo el riego de una huerta, el llenado de un
estanque. Tambin podris construiros programadores de luces para discotecas, y todo
lo que se os ocurra.
El autor presenta aqu su nueva interfaz de estudio. Pulsa sobre ACCESO AL
CURSO y podrs sumergirte en el mundo de los microcontroladores. Se trata de
informacin recopilada de Internet. Al final de la pgina hemos incluido una serie de
PROYECTOS que se irn ampliando.

El programa MPLAB de Microchip te lo facilitamos desde aqu: MPLAB (versin


6, 23Mb). Instrucciones en documento word (DOC).

Ahora ya ests preparado para comenzar a desarrollar las prcticas. Podrs


entender los programas y modificarlos para estudiar sus efectos. Cada prctica trata
de explicar las distintas posibilidades que ofrecen los microcontroladores. Aqullas
irn aumentando gradualmente su complejidad para sacar el mximo partido a estos
componentes.

PRCTICA N 1
PRCTICA N 2
PRCTICA N 3
PRCTICA N 4
PRCTICA N 5
PRCTICA N 6
PRCTICA N 7
PRCTICA N 8
PRCTICA N 9
PRCTICA N 10
PRCTICA N 11

PROYECTOS:
PROYECTO N 1:

LUZ PRESENCIAL:

Construir un dispositivo electrnico que:


* Detecte la situacin ambiental de la luz: noche-da.

* Control sobre la potencia lumnica de la lmpara incandescente


a activar.
* Control sobre el tiempo que est encendida o apagada: 5, 10,
20 o 40 minutos.
En resumen, si es de da la lmpara nunca se encender pero si es
de noche la lmpara puede estar activada o apagada una misma
cantidad de tiempo y a la vez, cuando est encendida, podemos
controlar la cantidad de luz que irradie.
PROYECTO N2:
INSOLADORA DE CIRCUITOS IMPRESOS CON
TEMPORIZACIN ELECTRNICA
PROYECTO N3:

CERRADURA ELECTRNICA

PROYECTO N4:

TERMMETRO DIGITAL

PROYECTO N5:

TERMMETRO DIGITAL MEJORADO

PROYECTO N6:

RELOJ ELECTRNICO

PROYECTO N7:

MINICARTEL LUMINOSO DE TEMPERATURA Y RELOJ

PROYECTO N8:

CINCO VOLTMETROS

PROYECTO N9:

COMPROBADOR DE SERVOS

PROYECTO N10:

RODADOR DE MOTORES

PROYECTO N11:

CONTROL DE MOTOR PASO A PASO MEDIANTE PC

PROYECTO N12:

IMPLEMENTACIN DE UN RELOJ MEDIANTE UN BUS I2C

PROYECTO N13:

RELOJ CON ALARMA MEDIANTE UN BUS I2C

PROYECTO N14:
activacin de buzzer

RELOJ CON ALARMA MEDIANTE UN BUS I2C con H:M:S y

PROYECTO N15:

RELOJ CALENDARIO

PROYECTO N16:

PROGRAMADOR DE RIEGO POR GOTEO

PROYECTO N17:

REGULADOR DE POTENCIA

PROYECTO N18:

CONTROL DE SEMILLERO

PROYECTO N19:

CALCULADORA CONVERSORA DE CDIGOS

PROYECTO N20:

TEMPORIZADOR

PROYECTO N21:

CONTROL REMOTO CON MANDO A DISTANCIA POR IR

PROYECTO N22:

NUEVO DISEO DE MICRORASTREADOR

PROYECTO N23:

TERMOSTATO PARA INCUBADORA DE GALLINAS (NUEVO)

PROYECTO N24:

TEMPORIZADOR DOBLE CON MEMORIA (NUEVO)

PROYECTO N25:
IZDO Y DCHO (NUEVO)

CONTROLADORES DE SERVOS DE ROTACIN CONTINUA

Autor: Aureliano Juan Mancha Garca

PRCTICAS SOBRE MICROCONTROLADORES:


Por Pedro Guerrero Amado
Estas 14 prcticas, por su sencillez, introducen al alumno, en el fascinante mundo de
los microcontroladores y han servido de apoyo en cursos sobre este tema. Para
facilitar su bajada, estn en PDF.

PRCTICA N 1
PRCTICA N 2
PRACTICA N 3
PRACTICA N 4
PRACTICA N 5
PRACTICA N 6
PRACTICA N 7
PRACTICA N 8
PRCTICA N 9
PRCTICA N 10
PRCTICA N 11
PRCTICA N 12
PRCTICA N 13
PRCTICA N 14

PRCTICAS SOBRE MICROCONTROLADORES:

DESARROLLO DEL PROYECTO VELORATN,


VIDEO FINAL DEL PROYECTO (archivo wmv, 2MB)

PRCTICA N1
Microcontrolador PIC16F84A.
Objetivo:
Encender y apagar cada segundo los leds conectados al puerto
B.
Esquema elctrico:

Programa:
;------------------------------------------------------

;PROGRAMA PORTB.ASM
;Apagar y encender el puerto B cada segundo
;------------------------------------------------------list
include
definidos.

p=16f84A;
"p16F84A.inc";

org
del re;
reset;
goto
comien;

00h;

posicin de memoria de comienzo

inicio;

set ( 0000h ).
etiqueta = posicin de memoria.
salto a posicin de memoria donde

org

identificar el micro usado.


archivo con los registros

za el programa.
10h;

el
;
inicio;

posicin de memoria donde comienza


programa ( 0010h ).
etiqueta = direccin 0010h.

;------------------------------------------;Configurar el puerto B como salida


;-------------------------------------------;Registro TRISB=00h para salidas.
bsf

STATUS,5;

movlw

00h;

movwf

TRISB;

bcf

STATUS,5;

pongo a uno el bit 5 del registro


STATUS para entrar en el banco1.
cargo w con el dato

00h.
;
;
;---------------------------------;PROGRAMA PRINCIPAL
;----------------------------------programa;
principal.

cargo el registro TRISB con el w para


hacer el puerto B como salida.
pongo a cero el bit 5 del registro
STATUS para entrar en el banco 0.

etiqueta de programa

movlw
movwf

00h;
PORTB;

cargo w con el dato 00h


cargo el registro PORTB con w
apagando los leds.

;
call
movlw
movwf

sg1;

subrutina de retardo de 1 seg.

0ffh;
PORTB;

cargo w con el dato ffh.


cargo el registro PORTB con w
encendiendo los leds.

;
call

sg1;

subrutina del retardo de 1 seg.

goto

programa;

salta al comienzo del

programa.
;-----------------------------------------------;RETARDOS
;-----------------------------------------------;ffh=255 goto=2 useg. decfsz=1 useg.
;(255 x 2) + 255= 765 useg
;(765 x 765) + 255= 585480 useg.
;(585480 x 2) + 1= 1170961 useg.
sg1;
1 seg.

etiqueta = subrutina del retardo de


movlw
movwf
movwf

0ffh;
0ch;
0dh;

movlw
movwf

01h;
0eh;

salto1 ;
repeticin.
decfsz
si es
;
0ch.
goto

cargo w con el dato ffh.


cargo el registro 0ch con el w.
cargo el registro 0dh con el w.
cargo w con el dato 01h.
cargo el registro 0eh con w.
etiqueta del bucle de

0ch,1;

decremento el registro 0ch y salto


cero depositando el resultado en

salto1;

salto a la etiqueta salto1.

decfsz

0dh,1;

si es
;
0dh.

decremento el registro 0dh y salto


cero depositando el resultado en

goto
decfsz

salto1;
0eh,1;

si es
;
0eh.

salto a salto1.
decremento el registro 0eh y salto
cero depositando el resultado en

goto

salto1;

salto a salto1.

return;

regreso de

end;

fin del programa PORTB.

subrutina.

PRCTICA N 2
Microcontrolador PIC16F84A.

Objetivo:

Hacer juegos de encendidos y apagados de leds conectados al


puerto B.
A la vez practicaremos con la intrucciones:

Swapf f,d
Rlf f,d
Rrf f,d

La instruccin swapf f,d intercambia los 4 bits de mayor peso


por los cuatros de menor peso y viceversa del dato contenido en el
registro usado. Ejemplo:

swapf 0ch,1

Si tuviramos en el registro 0ch el dato 0fh, al aplicar la instruccin


el contenido se transformara en f0h y lo guardaramos en 0ch por
ser d= 1.

Si fuese d= 0 lo guardaramos en el acumulador w.

La instruccin rlf f,d desplaza el contenido del registro usado


hacia la izquierda, introduciendo por el lugar del bit de menor peso
el valor del acarreo. El acarreo es a su vez cargado con el contenido
del bit de ms peso del dato contenido en el registro usado.

El contenido es almacenado en el registro si d= 1 y si no ser


guardado en el acumulador w por ser d= 0. Ejemplo:

rlf 0ch,1

Si el valor contenido en el registro 0ch es 01h y el acarreo es


cero, al desplazarse hacia la izquierda el contenido ser 02h. El valor
02h se guardar en 0ch por ser d= 1.

La instruccin rrf f, d desplaza el contenido del registro usado


hacia la derecha introduciendo el valor del acarreo por el bit de ms
peso y cargndose el acarreo
con el valor del bit de menor peso
del registro. El valor del dato se guardar en el registro si d= 1 o en
el acumulador w, si d= 0.

Ejemplo:

rrf 0ch,1

Si el contenido del registro 0ch fuese 00h y el acarreo valiese


1, el contenido del registro sera 80h, y se guardara en 0ch.

EL PROGRAMA SALTA A LA PRIMERA COMBINACION Y SE


REPITEN TODAS, HACIENDO

Esquema elctrico:

Programa:
;-------------------------------------------------------;PROGRAMA LED.ASM
;Apagar y encender el puerto B cada segundo
;--------------------------------------------------------

list

p=16f84A

include

"p16F84A.inc"

org 00h
reset
goto inicio

org 10h
inicio

;------------------------------------------;Configurar el puerto B como salida


;-------------------------------------------;Registro TRISB=00h para salidas.

bsf
STATUS

STATUS,5;

pongo a 1 el bit 5 del registro


para entrar en el banco1.

movlw

00h;

cargo w con el dato

movwf

TRISB;

cargo el registro TRISB con el w

00h.
para
;

hacer el puertoB como salida.


bcf

;
0.

STATUS,5;

pongo a cero el bit 5 del registro


STATUS para entrar en el banco

;----------------------------------;PROGRAMA PRINCIPAL
;----------------------------------programa
movlw
movwf

00h;
PORTB;

cargo w con el dato 00h.


cargo el registro PORTB con el w.

call

sg1;

call

sg1

movlw

0fh;

cargo w con el dato 0fh.

movwf

PORTB;

cargo el registro PORTB con el w.

call

sg1

call

sg1

swapf

PORTB,1;

subrutina de retardo de 1 seg.

aplico la intruccin al

contenido del registro PORTB

y lo deposito en el mismo ya

que d= 1.
call
call

sg1
sg1

movlw

0ffh;

cargo el w con el dato ffh.

movwf

PORTB;

cargo PORTB con el w.

call
call

call

sg1
sg1

rotacion;

subrutina de rotar un solo

led de derecha a izquierda y

viceversa ,una sola vez.


goto

programa; salto al comienzo del progra-

ma principal.

;------------------------------------------------------------;PROGRAMA DE ROTACION.
;------------------------------------------------------------rotacion
movlw

00h;

cargo w con el dato 00h.

movwf

10h;

cargo registro 10h con el w.

movlw

09h;

cargo w con el dato 09h.

movwf

11h;

cargo el registro 11h con w.

bsf

STATUS,0; pongo a uno el bit 0 del STATUS

;
acarreo ).

( bit 0 = C =

der
decfsz
salto si

11h,1;

decremento el registro 11h y

;
en

es cero y deposito el contenido

11h ya que d= 1.

goto

derecha;

salto a la etiqueta ( direccin )

llama;

da derecha.

movlw

08h;

cargo w con el dato 08h.

movwf

11h;

cargo el registro 11h con w.

bcf

STATUS,0; pongo a cero el bit 0 de STATUS

( bit 0 = C = acarreo ).

izq
decfsz
salto

11h,1;

decremento el registro 11h y

;
conteni-

si vale cero depositando el

;
1.

do en el mismo ya d=
goto

izquierda; salto a la etiqueta ( direccin )

lla;
izquierda.

mada

return;

regreso de subrutina.

derecha
rrf

10h,0;

roto a la derecha el contenido del

;
ya

registro 10h y lo almaceno en w

que d= 0.
movwf

10h;

cargo el registro 10h con el

movwf

PORTB;

cargo el registro PORTB con el

w.
w.

izquierda

call

sg1

goto

der;

salto a etiqueta der.

rlf

10h,0;

roto a la izquierda el contenido

del
;
ya

registro 10h y lo almaceno en w

que d= 0.
movwf

10h;

cargo 10h con el w.

movwf

PORTB;

cargo PORTB con

w.
call

sg1

goto

izq;

salto a etiqueta izq.

;RETARDOS
;---------------------------------------;ffh=255 goto=2 useg.

decfsz=1 useg.

;(255 x 2) + 255= 765 useg


;(765 x 765) + 255= 585480 useg.
;(585480 x 2) + 1= 1170961 useg.

sg1
movlw

0ffh

movwf

0ch

movwf

0dh

movlw

01h

movwf

0eh

salto1
decfsz

0ch,1

goto

salto1

decfsz

0dh,1

goto

salto1

decfsz

0eh,1

goto

salto1

return

end

PRACTICA N 3
Microcontrolador PIC16F84A.

Objetivo:

Comprobar como funciona la interrupcin externa, /INT, pin


n6.
Al actuar sobre el pin n6 mediante un pulsador provocaremos que el
puerto A, al cual, hemos conectados unos leds, se apagen y
enciendan en un bucle repetitivo.

Cmo se configuran los registros que intervienen en una


interrupcin externa ?

Pasos:

1 paso:

Como las interrupciones de este microcontrolador estn


vectorizadas en una sola posicin de memoria, hay que poner la
direccin de la interrupcin (0004h), que es donde va a ir a buscar la
instruccin de salto (goto), que conducir al microcontrolador al
programa de tratamiento de la
interrupcin.

2 paso:

Se configura el registro OPTION_REG y en concreto se eligir el


tipo de flanco: ascendente o descendente.
El bit 6 de este registro, llamado INTEDG, se cargar con 1 para
elegir flanco ascendente y 0 para flanco descendente.
Yo he elegido flanco descendente.

3paso:

Se configura el registro relacionado con el software de la


interrupcin /Int.

El registro y los bits son:

INTCON: bit 7 (GIE)= Activacin global de interrupciones = 1=


permiso concedido.

bit 4 (INTE)= Activacin de la interrupcin externa = 1=


activada.

Cmo sabremos si se ha producido una interrupcin externa, /Int ?

Toda interrupcin, si est activada, al producirse provocar la


activacin de las llamadas banderas o bits, que al ser examinados nos
descubrirn si sea producido una interrupcin.

La bandera o bit de la interrupcin /Int, est en el registro


INTCON, y es el bit 1, llamado INTF. Un 1 en l nos indica que sea
producido una interrupcin.

Esta bandera hay que bajarla, o sea, ponerla a cero por


software para saber si se ha producido una peticin de interrupcin
posterior.
Esquema elctrico:

Programa:

;--------------------------------------------------------;PROGRAMA inter.ASM
;Cmo funciona la interrupcin externa /Int.
;--------------------------------------------------------list
include

p=16f84A
"p16F84A.inc"

;--------------------------------------------------;RESET
;--------------------------------------------------org

00h

goto

inicio

reset
;-----------------------------;INTERRUPCION
;-----------------------------org
04h
goto

int

;-------------------------------;PUNTERO DE INICIO
;-------------------------------org
inicio

10h

;----------------------------------------------------------;Configurar el puerto A como salida.


;----------------------------------------------------------;Registro TRISB=00h para salidas.
bsf
movlw
movwf
bcf

STATUS,RP0;
00h;
TRISA;
STATUS,RP0;

;----------------------;PuertoA apagado.
;----------------------movlw
00h
movwf
PORTA

banco1
puertoA como salida
banco0

;-----------------------------------------------;Configurar el registro OPTION_REG.


;Flanco de bajada.
;-----------------------------------------------;Registro OPTION_REG
;bit6=INTEDG= 0= flanco descendente
bsf
bcf
bcf

STATUS,RP0;
OPTION_REG,INTEDG;
STATUS,RP0;

banco1
flanco descendente
banco0

;-------------------------------------------------------------------------------;Configurar el registro INTCON.


;Habilitar permisos de interrupciones general y particular de /Int.
;-------------------------------------------------------------------------------;Habilitar permiso de interrupcin global.
bsf

INTCON,GIE;

1= activacin permiso general.

;Habilitar permiso int.


bsf

INTCON,INTE;

1= activacin permiso /int.

;--------------------------------------------------------------------;Esperando la interrupcin.
;Cuando pulse el botn provoco un flanco de bajada y salgo del
;bucle de espera. La bandera pasa a 1 y salto al programa de la in;terrupcin y luego al programa principal, haciendo infinitos bucles.
;La /Int la uso como autorizacin (pulsar el botn) para ejecutar
;el programa principal.
;--------------------------------------------------------------------espera

btfss

INTCON,INTF;

salta si es uno

goto

espera;

salto a "espera" hasta que la


bandera sea 1.Cuando pulse el
el botn provoco la interrupcin y salto a ejecutar la subrutina de interrupcin "int".
Luego ejecuto el programa
principal.

;
;
;
;
;
;

;-------------------------------------------------;PROGRAMA PRINCIPAL
;-------------------------------------------------programa
movlw
movwf

00h;
PORTA

call

sg1

movlw
movwf

0ffh;
PORTA

call

sg1

goto

apago puerto A.

enciendo puerto A.

programa

;-----------------------------------------------------------------------------------------;INTERRUPCION DE /Int.
;-----------------------------------------------------------------------------------------;Deshabilitar permiso de int. global y particular de /Int.
;Con deshabilitar una de los dos bastara para no haber ms interrupciones.
int
bcf

INTCON,GIE;

bcf

INTCON,INTE;

;
;

0 para no ms interrupciones
de ningn tipo.
0 para no ms interrupcin
/Int.

;Poner a cero el flag de la /Int., necesario si hubiera ms interrupciones de /Int.


;Este programa solo va haber una "unica" llamada a la /Int. y se ejecutar el
;programa principal indefinidamente deshabilitando para siempre la /Int.
bcf

INTCON,INTF;

retfie;

0 por software.
retorno de subrutina de interrupcin.

;------------------------------------------------------------------------;Retardos.
;-------------------------------------------------------------------------;c1h=193 goto=2 useg. decfsz=1 useg.( salta si 0 ).
;(193 x 2) + 193 = 579 useg
;(579 x 579) = 335241 useg.
;(335241 x 3) = 1005723 useg.
;0ch, 0dh y 0eh registros RAM del GPR
;---------------------------------------sg1;

1005723 useg.
movlw
movwf
movwf

0c1h
0ch
0dh

movlw
movwf

01h
0eh

salto1
decfsz
goto

0ch,1
salto1

decfsz
goto

0dh,1
salto1

decfsz

0eh,1

goto

salto1

return
;------------------------sg500; 497025 useg.
movlw
movwf
movwf

0e6h;
0ch
0dh

salto2 decfsz
goto

0ch,1
salto2

decfsz
goto

e6h= 235

0dh,1
salto2

return
;-------------------------sg250; 251001 useg.
movlw
movwf
movwf

0a7h;
0ch
0dh

a7h= 167

salto3
decfsz
goto

0ch,1
salto3

decfsz
goto

0dh,1
salto3

return
;--------------------------sg125; 125316 useg.
movlw

76h;

76h= 118

movwf
movwf

0ch
0dh

salto4
decfsz
goto

0ch,1
salto4

decfsz
goto

0dh,1
salto4

return
;---------------------------------end

PRCTICA N 4
Microcontrolador PIC16F84A.

Objetivo:

Hacer funcionar el contador y ver como al desbordarse el


contador provoca una interrupcin. El pin n3 es la entrada de un
contador que cuenta de 00h a ffh. Al pasar de ffh a 00h provoca una
interrupcin y la subida de una bandera o flag.

Cmo se configuran los registros que intervienen en los contajes ?

Pasos:

1 paso: configurar el hardware del contador.

Se configurar el registro OPTION_REG y en concreto los bit


sigtes:

El bit 4, llamado TOSE, nos da la eleccin de elegir el tipo de


flanco: ascendente o descendente. Un 1= flanco descendente y un 0=
flanco ascendente. Yo he elegido flanco descendente.
El bit 5, llamado TOCS, nos da la opcin de elegir el tipo de
reloj.

Un 1= pulsos introducidos por el pin n 3 (T0cki) y un 0= pulsos de


reloj interno de frecuencia un cuarto de la frecuencia del cristal
usado.

En este caso ser pulso exterior.

2 paso: configurar el software.


Se configura el registro INTCON y en concreto los bits sigtes:

El bit 7 (GIE) se pondr a 1 para habilitar el permiso general de


interrupciones.

El bit 5 (T0IE) se cargar con 1 para habilitar el permiso


particular de la interrupcin por desbordamiento del contador.

Cmo sabremos si se ha producido una interrupcin debido al desbordamiento


del contador?

Esta interrupcin tiene asociada una bandera o flag, el bit 2


(T0IF) del registro INTCON.

Esta bandera hay que borrarla por software.

Esquema elctrico:

Programa:

;---------------------------------------------;PROGRAMA CONTADOR.ASM
;Probar el contador y su interrupcin.
;---------------------------------------------list
include

p=16f84A
"p16F84A.inc"

;------------------------------

;RESET
;-----------------------------org 00h
reset
goto inicio
;-----------------------------;INTERRUPCION
;-----------------------------org 04h
goto int
;-----------------------------;PUNTERO DE INICIO
;-----------------------------org 10h
inicio
;----------------------------------------------------;Configurar el puerto A como salida
;----------------------------------------------------;Registro TRISA= 00h para salidas.
bsf
movlw
movwf
bcf

STATUS,RP0; banco1
00h;
TRISA;
puertoA como salida
STATUS,RP0; banco0

;PuertoA apagado
movlw
movwf

00h
PORTA

;-----------------------------------------------------;Configurar el contador TMR0

;-----------------------------------------------------;TMR0 = contador descentente cargado con el dato ffh.


;Registro OPTION_REG
;Contador= bit5=T0CS= 1= pulsos exteriores.
;Descentente= bit4=T0SE= 1
bsf
bsf
bsf
bcf

STATUS,RP0;
OPTION_REG,T0SE
OPTION_REG,T0CS
STATUS,RP0;

banco1
banco0

;Cargar el TMR0 con ffh.


movlw
movwf

0ffh
TMR0;

;
;
;

cargo TMR0 con el dato ffh


para que desborde con un pulso
del pulsador conectado a la entrada T0cki.

;--------------------------------------------;Preparar interrupciones.
;--------------------------------------------;Habilitar permiso de interrupcin global.
bsf

INTCON,GIE

;Habilitar permiso int. particular del TMR0.


bsf

INTCON,T0IE

;Espera hasta rebosar el TMR0.


espera
btfss
;
;

INTCON,T0IF;

salta si es 1. Al pulsar hago


que el contador se desborde al
pasar de ffh a 00h. La bandera

;
;
;
;

se pone a 1 y salto a la interrupcin y luego al programa principal.


El puerto A se encender y apagar
en un bucle indefinido.
goto

espera

;----------------------------------;PROGRAMA PRINCIPAL
;----------------------------------programa
movlw
movwf

00h
PORTA;

call

sg1

movlw
movwf

0ffh;
PORTA

call

sg1

goto

programa

apago el puertoA

;------------------------------------------;INTERRUPCION DEL TMR0


;------------------------------------------int
;Deshabiltar permiso de int. global
bcf

INTCON,GIE

;Deshabilitar permiso de int. del contador


bcf

INTCON,T0IE

;Poner a cero el flag

enciendo el puertoA

bcf

INTCON,T0IF

retfie;

retorno subrutina de interrupcin.

;-----------------------------------------------------------------;Retardos.
;-----------------------------------------------------------------;c1h=193 goto=2 useg. decfsz=1 useg.( skip if 0 ).
;(193 x 2) + 193 = 579 useg
;(579 x 579) = 335241 useg.
;(335241 x 3) = 1005723 useg.
;0ch, 0dh y 0eh registros RAM del GPR
;---------------------------------------------------sg1;

1005723 useg.
movlw
movwf
movwf

0c1h
0ch
0dh

movlw
movwf

01h
0eh

salto1
decfsz
goto

0ch,1
salto1

decfsz
goto

0dh,1
salto1

decfsz
goto

0eh,1
salto1

return
;-------------------------

sg500; 497025 useg.


movlw
movwf
movwf

0e6h;
0ch
0dh

salto2
decfsz
goto

0ch,1
salto2

decfsz
goto

0dh,1
salto2

e6h= 235

return
;-------------------------sg250; 251001 useg.
movlw
movwf
movwf

0a7h;
0ch
0dh

salto3
decfsz
goto

0ch,1
salto3

decfsz
goto

0dh,1
salto3

a7h= 167

return
;-----------------------------------------------sg125; 125316 useg.
movlw
movwf
movwf

76h;
0ch
0dh

76h= 118

salto4
decfsz
goto

0ch,1
salto4

decfsz
goto

0dh,1
salto4

return
;---------------------------------end
PRCTICA N 5
Microcontrolador PIC16F84A
Objetivo:
Encender y apagar cada segundo un led conectado al puerto
PA2. Se usar el timer0 para hacer la temporizacin.
Esquema elctrico:

Programa:
;----------------------------------------------;PROGRAMA TIMER0.ASM
;Temporizador con el timer0
;haciendo on-off un led seg. alternos.
;----------------------------------------------list
p=16F84A
include "p16F84A.inc"

;-----------------;RESET
;------------------

org 00h
reset
goto inicio
;--------------------------INTERRUPCIONES
;--------------------------org 04h
goto int
;------------------------------;Comienzo del programa
;------------------------------org 10h
inicio
;----------------------------------------------;Configurar el puertoA como entrada
;excepto el PA2 que ser salida.
;----------------------------------------------;1= entradas, 0= salidas
;PA3,4= 1; PA2= 0; PA1,0= 1
;Registro TRISA= ---1 1011b= 1bh
bsf
movlw
movwf
bcf

STATUS,RP0;
1bh
TRISA
STATUS,RP0

banco1

PORTA,2;

poner 0 en la puerta 2.

;apagar led
bcf

;-----------------------------------------;Configurar el TMR0 (contador).

;-----------------------------------------bsf

STATUS,RP0;

movlw

87h;

movwf

OPTION_REG

bcf

STATUS,RP0;

;
;
;
;
;
;
;
;

banco1
Divido la frecuencia entre 256 poniendo PS0,PS1 y PS2= 1; PSA= 0
asigno el divisor de frecuencia a
TMR0; T0SE= 0 flanco ascendente;
T0CS= 0 pulsos de reloj interno de
f= fosc./4; INTEDG:= 0 flanco descendente (no usada la /int);
/RBP0= 1 desactivadas (no usadas las
resistencias pull-up puerta B).
banco0

;-------------------------------------;Configurar las interrupciones


;-------------------------------------bsf
bsf

INTCON,GIE;
INTCON,T0IE;

activo permiso interrupcin general.


activo interrupcin del TMR0.

;-------------------------------------;Configurar registros generales.


;-------------------------------------movlw
movwf

64h;
0eh

64h= 100 decimal

;-------------------------------------;Programa principal
;-------------------------------------programa
bsf
;

PORTA,2;

poner 1 en el PA2, enciendo el


led.

lcall

cuenta1;

bcf

PORTA,2;

lcall

retardo 1 sg.
poner 0 en el PA2, apago el led.

cuenta1

goto programa;

salto a programa

;--------------------------------------------;Subrutina de temporizar 1 segundo.


;--------------------------------------------;Frecuencia del cristal es 4Mhz.
;La seal de entrada al TMR0 es fosc./4, o sea, 1Mhz (T= 1 useg.).
;El divisor de frecuencia divide por 256, con lo que la seal de 1 Mhz se
;transforma en una de 3906,25 Hz (T= 0,256 mseg.)
;1seg= 1000 mseg.
;0,256 mseg x 3900= 998,4 mseg
;El TMR0 va a contar desde 216 a 255 que son 39 impulsos de 0,256 mseg.
;y esto lo va hacer 100 veces, o sea, las 3900 veces que necesito.
cuenta1
bsf
bcf

INTCON,T0IE;
INTCON,T0IF;

activo int. timer0.


poner a cero el flag del
timer0.

movlw
movwf

0d8h;
TMR0;

d8h= 216 decimal


255 - 216 = 39.

btfss

INTCON,T0IF;

goto

cuenta;

cuenta
;
decfsz

0eh,1;

goto

cuenta1

movlw

64h;

salta si es 1. Espero la
interrupcin por
desbordamiento.
decrementa 0eh y salta si es
cero.

64h= 100

movwf
return

0eh

;--------------------------------------;Tratamiento de la interrupcin.
;--------------------------------------int
bcf INTCON,T0IE;
bcf INTCON,T0IF;
retfie;

desactivacin de la int. del timer0.


borro el flag
retorno subrutina interrupcin.

end

PRCTICA N 7: Proyecto: Regulador lumnico mediante el control


de la fase.

En qu consiste una regulacin por control de la fase?

La corriente elctrica que usamos en la vida diaria es una seal alterna senoidal como la de
la figura:

Al pasar esta corriente elctrica por la lmpara haremos que se ilumine al 100 %.

Si nos las ingeniamos para que la seal aplicada a la lmpara se recorte como se ve
en la figura siguiente, obtendremos valores de iluminacin entre un 0% y un 100%.

Cmo conseguimos esos recortes en la seal?


1: Necesitamos una seal de referencia que este situada en los cero voltios de la seal
senoidal.
Si a la salida del transformador de toma intermedia colocamos un rectificador de
onda completa ( dos diodos 1N4148 ) obtenemos una seal de igual nombre. Esta seal la
atenuamos con un potencimetro de 47K y la introducimos en un circuito disparador para
transformarla en una seal cuadrada positiva de +5voltios de amplitud.
2: Con los flancos de bajada de esos impulsos situados alrrededor de los cero voltios
activaremos la interrupcin externa INT y subiremos la bandera INTF.
A partir de ese instante programaremos pulsos de tiempo variable que nunca llegarn a
tener ms duracin ms all del siguiente impulso de referencia y que una vez agotado
daremos un impulso pequeo de disparo del triac.

Fuente de alimentacin y circuitos para obtener la seal de referencia de T= 10 mseg.

Circuito de botones UP y DOWN.

Circuito microcontrolador PIC 16F84A.

Circuito de control del Triac.

PRCTICA N 8: La instruccin RETLW.


Es una instruccin de regreso de subrutina que carga en el acumulador, W, un
nmero.
Realizaremos un contador (TMR0) de eventos (del 0h al Fh) simulado por un pulsador
y teniendo como elemento de visualizacin un display de siete segmentos. Como el
microcontrolador slo cuenta en hexadecimal tendremos que decodificar el n hexadecimal
a siete segmentos. Esto lo haremos creando una tabla con la instruccin retlw.

Tabla de decodificacin hexadecimal-7 segmentos.

;----------------------------------------------------------------------------;PROGRAMA COMPROBADO:
;Manejo de la instruccin RETLW
;Realizaremos un contador de eventos
;con TMR0 (de 00h a 0Fh).
;----------------------------------------------------------------------------;PIC 16F84A/ 4 MHz/
;Bits de configuracin para el programador:
;CP(proteccin de la memoria de cdigo):..............................No
;PWRTE(activacin del temporizador "Power-up"):..............No
;WDTE(activacin del "perro guardin"):...............................No
;FOSC1-FOSC0(tipo de oscilador):.........................................Xtal
;------------------------------------------------------------------------------;PROGRAMA
LIST
p=16f84A
INCLUDE
"p16f84A.inc"
ORG
goto

00h
inicio

ORG

10h

tabla
movf TMR0,0
andlw 0fh
addwf PCL,1

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

3fh
06h
5bh
4fh
66h
6dh
7dh
07h
7fh
67h
77h
7ch
39h
5eh
79h
71h

inicio
;Configurar el puerto B salida
call
movlw
movwf
call

banco1
00h
TRISB
banco0

movlw
movwf

00h
PORTB

;Configurar el TMR0.
call
bsf
bsf
call

banco1
OPTION_REG,T0SE
OPTION_REG,T0CS
banco0

clrf

TMR0

programa
call
tabla
movwf

PORTB

goto

programa

;-----------------------------------------;Subrutinas de cambios de bancos.


;-----------------------------------------banco0
bcf
STATUS,RP0
return
banco1
bsf
STATUS,RP0

return
END

You might also like