Está en la página 1de 41

INTRODUCCIN A LA PROGRAMACIN

Microcontrolador PIC 16F84


mail : enric.serra
0 - INTRODUCCIN
Este documento es una introduccin a la programacin del PIC 16f84.
Este documento se puede copiar y utilizar siempre que se indique la procedencia
Escola Professional !alesians "oan ##III$ y se indique su autor Enric !erra.
%odos los comentarios y &ugs ser'n &ien reci&idos.
1 ! MICROCONTROLADOR"#
(n microcontrolador) es un circuito integrado programa&le que
contiene los elementos necesarios para controlar un sistema.
PIC significa Perip*eral Interface Controler es decir un controlador de
perif+ricos.
Cuando *a&lamos de un circuito integrado programa&le que controla
perif+ricos) estamos *a&lando de un sistema que contiene entre otras
cosas una unidad arim+tico,lgica) unas memorias de datos y
programas) unos puertos de entrada y salida) es decir estamos
*a&lando de un peque-o ordenador dise-ado para realizar unas
funciones espec.ficas.
Podemos encontrar microcontroladores en la/adoras) teclados)
tel+fonos m/iles) ratones etc.
0ay multitud de microcontroladores con m's memoria) entradas y
salidas) frecuencia de tra&a1o) coste) su&sistemas integrados y un largo
etc dependiendo de cada tipo de microcontrolador. El presente
documento esta &asado en el popular microcontrolador PIC 16284 del
fa&ricante 3icroc*ip %ec*nology Inc ya que es un sistema sencillo)
&arato y potente para muc*as aplicaciones electrnicas.
4as caracter.sticas del controlador las podemos encontrar en la 5e&
del fa&ricante microc*ip o en el siguiente enlace pic16f84.pdf
Pic 16f84
4as patillas del PIC 16284) 18 en el modelo 6 son las siguientes:
"nca$%&lado ' %i()olo*+a
7e& de microc*ip
, - CARACT"RI#TICA#
La -%tr&ct&ra d-l (icrocontrolador
Ali(-ntaci.n :
El PIC se alimenta a 8 9 entre los puntos 9dd :$ y 9ss ,$. El consumo del circuito
depende de las cargas en los puertos y de la frecuencia de tra&a1o.
Pr'ctica 1.1: ;ise-ar y montar el siguiente regulador de 9
<egulador 8 9 para alimentar un PIC 16284
Fr-c&-ncia d- tra)a/o0
4os PIC=s necesitan un relo1 oscilador que marcar' la frecuencia de tra&a1o.
Estos osciladores pueden ser del tipo :
<C 2ormado por una resistencia y un condensador
0! seutiliza un cristal de cuarzo o resonador cer'mico 0asta 1> 3z$
#% Cristal o resonador *asta 4 3*z
4P ?a1o consumo *asta @>>A*z$
4os osciladores se colocan entre las patillas B!C1 y B!C@
P&-rto% d- "NTRADA1#ALIDA
4os puertos son entradas y salidas del microcontrolador al eCterior) por ellas
en/iarmos o introducimos se-ales digitales %%4 89$ de forma que podemos
comunicar el microcontrolador con el eCterior.
En este caso tenemos @ puertos de entrada y salida ED!. !us nom&res son <6 y <?.
El puerto <6 tiene 8 pins <6>,<64) un caso particular es <64D%BCA1 que puede
actuar como pin de entrada o como entrada de impulsos para un contador
denominado %3<B
El puerto ? tien 8 l.neas que /an desde <?,<?E .Cada l.nea del <6 o del <? se
puede configurar como entrada o salida mediante @ registros llamados %<I!6 y
%<I!?.

Con esta informacin podemos montar un sencillo entrenador para PIC=s 16284
con el puerto <6 como entrada y el puerto <? como salida. (tilizaremos como
entrada unos microinterruptores y como salida unos leds conectados al puerto
<?>,<?E.
1.@ Pr'ctica: ;ise-ar el PC? y montar el siguiente entrenador PIC
M-(oria%
%odo dispositi/o programa&le necesita de una memoria para poder almacenar el
programa) poder mane1ar /aria&les y almacenar datos.
3E3B<I6 ;E P<BF<636
En el PIC 16284 la memoria de programa o de instruciones es una memoria tipo
246!0 de 1A
En esta memoria almacenaremos el programa que e1ecutar' el microcontrolador
ECiste un registro especial llamado contador d- $ro*ra(a PC cuya finalidad es
a/anzar por las instrucciones del programa de forma secuencial eCcepto cuando se
encuentran instrucciones de salto.
3apa de memoria de programa
3E3B<I6 ;E ;6%B!
4a memoria de datos sir/e para almacenar /aria&les) leer puertos de entrada o
escri&ir en los puertos de salida) podemos tam&ien acceder al temporizador o al
registron EEP<B3
4a memoria de dato% en el PIC 16284 est' formada por dos zonas:
3E3B<I6 <63 de 68 registros
3E3B<I6 EEP<B3 de 68 registros cuya caracteristica principal es que no se
perder'n los datos cuando se desconecta la alimentacin.
3apa de memoria de datos

Esta memoria est' formada por dos &ancos ?anG> y ?anG1
3apa de memoria <63 detallada

Otra% caract-ri%tica%
;entro del microcontrolador *ay unos registros especiales que determinan algunas
de las caracter.sticas nota&les del microcontrolador:
, %emporizadorDContador %3<>
, Perro guardi'n 5atc* ;og 7;$
, Interrupciones.
, <eset .<einicio del sistema$
Estas caracter.sticas se eCplicar'n mas adelante en el apartado correspondiente a
la programacin.
2 - DI#"3O D" PRO4"CTO#
2rente a un pro&lema t+cnico) *ay que &uscar una solucin de forma &arata y
sencilla) en este proceso de &Hsqueda de soluciones) los microcontroladores PIC
pueden ayudarnos a realizar soluciones sencillas) r'pidas y &aratas.
Partiremos de un planteamiento teniendo presente todas las /aria&les que afectan
al sistema)desarrollaremos la idea y la implementaremos con las *erramientas
adecuadas.
;iagrama de flu1o del desarrollo de proyectos con microcontrolador

0erramientas y fic*eros generados en cada paso del desarrollo de un proyecto
mediante PIC=s
Pa%o% a
%-*&ir
0erramientas 7indo5s
0erramientas
4inuC
2ic*eros
Idear
solucin
Pensar la solucin y dise-ar
circuito con programas PC?
PC?
4istar
4istar programa con
E;I%)3P46? o con cualquier
editor 6!CII
Editores 6!CII 4istado.asm
Compilar 3P6!3 gpasm 4istado.*eC
Emular 3P!I3 ) !imuPIC) 3isim
gputils)gpsim)pi
G;E9)3isim

Fra&ar
7inPICme,%< : circuito
gra&ador) IC,Prog
piG;E9
Enlaces
3icroc*ip
3isim
Fpasm
4 PROGRAMACIN "N "N#AM5LADOR PIC 16F84
Para programar un PIC 16284 necesitamos conocer las instrucciones para generar
el cdigo fuente para posteriormente compilarlo por e1emplo con 3P6!3) emular
el programa y poder gra&arlo para implementarlo en el circuito correspondiente.
El listado de instrucciones de microc*ip el fa&ricante del microcontrolador$ son
las siguientes:

(n listado en cdigo fuente es un fic*ero 6!CII con eCtensin 6!3 que est'
formado por 4 columnas para identificar las diferentes funciones:
, Etiquetas: ;an nom&re a determinadas partes del programa *asta I@ caracteres$
, Instrucciones: !on las instrucciones que se pasan al microcontrolador o una
;I<EC%I96 al ensam&lador.
, ;atos: ;atos u operandos para las instrucciones.
<egistros f$
?its
Etiquetas
JHmero constante literal 4$
, Comentarios !iempre despu+s de K son descripciones para *acer m's legi&le el
listado.
"6"MPLO D" PROGRAMA
<ealizamos en un editor el siguiente listado de programa que llamaremos
E"1.6!3
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K E4 !IF(IEJ%E P<BF<636 !(36 >8 L >@
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
LI#T P716F84 K 3odelo de PIC
#UMA1 "8U 090C : ;I<ECCIBJ 0E#6;ECI364 ;E4
BPE<6J;B 1
#UMA, "8U 090D : ;I<ECCIBJ ;E4 !EF(J;B BPE<6J;B
R"#UL "8U 090" K ;I<ECCIBJ ;E4 <E!(4%6;B
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K !e *an definido I /aria&les !(36)!(36@ y <E!(4
K en diferentes posiciones de la memoria de datos
K en el <EFI!%E< 2I4E 36P
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ORG 0
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K Brigen de las instrucciones en el P<BF<63 3E3B<L 36P
K ;irecti/a de compilacin
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
(o;l< 090= K PBJE3B! >8 en *eCadecimal EJ 7
(o;<> #UMA1 K P6!63B! 7 6 46 3E3B<I6 !(361
(o;l< 090, K PBJE3B! >@ 0eC EJ 7
(o;<> #UMA, K P6!63B! 7 6 46 3E3B<I6 !(36@
(o;>< #UMA1 K PBJE3B! EJ 7 !(361 M >8
add<> #UMA, ? 0 K !(363B! 7:!(36@ L E4 <E!(4%6;B
EJ 7
(o;<> R"#UL K PBJE3B! 964B< 6C(3(46;B< EJ <E!(4
"ND K 2IJ ;E P<BF<636
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Compilaremos con el 3P6!3
El compilador generar' los siguientes fic*eros E"1.0E#)E"1.CB;)E"1.E<<)E"1.4!%
Con el fic*ero E"1.0E# podremos gra&ar el microcontrolador con el programa
7IJ,PIC3E o cualquier otro y un gra&ador de pics.
41 COMANDO# 5@#ICO# AIB CARGA D" CALOR"#?#UMA 4
5ORRADO D" R"GI#TRO#
IN#TRUCCIN "6"MPLO NOTA
(o;<> > (o;<> #UMA (o;-r ac&(&lador < al r-*i%tro >
(o;l< D (o;l< 0E0=
(o;-r &n lit-ral l A0E0=B al
ac&(&lador <
add<> >?d
add<> #UMA,
?0
%&(a < ' > A#UMA,B %i d70 -l
r-%&latado -n F
%i d71 -l r-%&ltado -n > A#UMA,B
addl< D addl< 0E0, %&(a lit-ral A0E0,B ' <
clr> > clr> #UMA $on- a 0 -l r-*i%tro > A#UMAB
clr< clr< $on- a 0 -l ac&(&lador <
"6"MPLO ,
#&(ar -n )inario 0001 ' 0010 G&ardar -l r-%&ltado -n 0E0"
: --------------------------------------------------
: "6,A#M PROGRAMA PARA #UMAR "N 5INARIO 0001 4
0010
: R"#ULTADO GUARDADO "N 090"
: --------------------------------------------------
LI#T P716F84 : Mod-lo d- PIC
#UMA1 "8U 090C : DIR"CCION G"9AD"CIMAL D"L
OP"RANDO 1
R"#UL "8U 090" : DIRR"CCION D"L R"#ULTADO
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K !e *an definido @ /aria&les !(36 y <E!(4
K en diferentes posiciones de la memoria de datos
K en el <EFI!%E< 2I4E 36P
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ORG 0
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K Brigen de las instrucciones en el P<BF<63 3E3B<L 36P
K ;irecti/a de compilacin
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
(o;l< )H0001H : PON"MO# 0001 "N F
(o;<> #UMA1 : PA#AMO# F A LA M"MORIA #UMA1
(o;l< )H0010H : PON"MO# 0010 "N F
add<> #UMA1 ? 0 : #UMA F A LA M"MORIA #UMA1
R"#ULTADO "N F
(o;<> R"#UL : MOC"R F A R"#UL
"ND : FIN D" PROGRAMA
"6"MPLO 2
#&(ar -n )inario , ' 2? *&ardar -l r-%&ltado -n 0E0C
: --------------------------------------------------
: "62A#M PROGRAMA PARA #UMAR "N 5INARIO , 4 2
: R"#ULTADO GUARDADO "N 090D
: --------------------------------------------------
LI#T P716F84 : Mod-lo d- PIC
#UMA1 "8U 090C : DIR"CCION G"9AD"CIMAL D"L
OP"RANDO 1
R"#UL "8U 090D : DIRR"CCION D"L R"#ULTADO
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K !e *an definido @ /aria&les !(361 y <E!(4
K en diferentes posiciones de la memoria de datos
K en el <EFI!%E< 2I4E 36P
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ORG 0
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K Brigen de las instrucciones en el P<BF<63 3E3B<L 36P
K ;irecti/a de compilacin
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
(o;l< )H0010H : PON"MO# UN , "N F
(o;<> #UMA1 : PA#AMO# F A LA M"MORIA #UMA1
(o;l< )H0011H : PON"MO# 2 "N F
add<> #UMA1 ? 0 : #UMA F A LA M"MORIA #UMA1
R"#ULTADO "N F
(o;<> R"#UL : MOC"R F A R"#UL
"ND : FIN D" PROGRAMA
:------------------------------------------------------
"6"MPLO 2
#&(ar tr-% nI(-ro% A1? , ' 2B
4istado y funcionamiento en el entorno de simulacin 3P46? I;E de microc*ip.
En la /entana 7atc* podemos /er el /alor de !(31 y <E!(4 despu+s de arrancar
el programa.
"6"MPLO 4
#&(a d- lo% nI(-ro% 2 ' = -n d-ci(al ' al(ac-na(o% -l r-%&ltado -n
0E1,
El compilador acepta sistemas de numeracin *eCadecimal) decimal) octal) &inario
y 6!CII.
TIPO #INTA9I#
;ecimal d=cantidad=
.cantidad
0eCadecimal
*=cantidad=
>Ccantidad
cantidad *
Bctal o=cantidad=
?inario &=cantidad=
6!CII
a=caracter=
=caracter
4istado
: -------------------------------------------
: #UMA "N D"CIMAL 2 4 = R"#ULTADO "N 091,
: -------------------------------------------
4I!% PM16f84
!(3 EN( >C1> K 3emoria intermedia
<E!(4 EN( >C1@ K 3emoria de resultado
B<F >
K,,,,,,,,,,,,OOOOOO IJICIB OOOOO,,,,,,,,,,,,,,,,
mo/l5 d=I= K Cargamos en acumulador I
mo/5f !(3 K 6lmacenamos el I en !(3 >C1>
mo/l5 d=8= K Cargamos 8 en el acumulador
add5f !(3)> K !umamos y guardamos en 5
mo/5f <E!(4 K Fuardamos el resultado en >C1@
EJ;
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
"/-rcicio% $ro$&-%to%
4.1.1, !umar cuatro nHmeros en &inario >)1)@)I$
4.1.@, !umar tres nHmeros y almacenar los nHmeros y el resultado en las
direcciones >C>c >C>d >C>e >C>f
4.1.I , !umar @ nHmeros) almacenar el resultado en >C>d) &orrar el registro !(3 y
&orrar el acumulador 7
4, COMANDO# AIIB INCR"M"NTO 4 D"CR"M"NTO R"#TA#
IN#TRUCCIN "6"MPLO NOTA#
inc> >?d inc> Incr-(-nta -l r-*i%tro >? %i d70 %-
#UMA?0
al(ac-na -n <? %i d71 %- al(ac-na -n
-l r-*i%tro
d-c> >?d
d-c>
#UMA?1
D-cr-(-nta -l r-*i%tro #UMA ' -l
r-%&ltado d- *&arda -n #UMA
%&)l< D
%&)l<
)H0110H
R-%ta 0110 - < ' r-%&ltado al(ac-nado
-n <
%&)<> >?d
%&)<>
R"#TA?0
R-%ta >-< ' r-%&ltado -n <
"6"MPLO = Car*ar -l nI(-ro = -n 1AJ ACALOR1B ' incr-(-ntar do% ;-c-%
AAl(ac-nar -n 1cJB
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K Programa que incrementa el /alor 8
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
4I!% PM16284
964B< EN( 1a0K 6lmacenamos /alor en 1a0
B<F >
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K IJICIB
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
IJICIB
mo/l5 *=8=K Cargamos 8 en 5
mo/5f 964B<K mo/emos 8 a 964B<
incf 964B<)1K Incrementamos 964B<
incf 964B<)1
EJ;
"6"MPLO 6 D"CR"M"NTAR UN CALOR
: D-cr-(-ntador d- r-*i%tro
: Car*a(o% -l ;alor = -n 0E0a
: D-cr-(-nta(o% , ;-c-% Ja%ta 2
4I!% pM16284
/ equ >C>a
org >
inici
mo/l5 >C>8
mo/5f /
decf /)1
decf /)1
mo/f5 /
end

"/-rcicio% $ro$&-%to%
4.@.1 <estar dos nHmeros &inarios y almacenar el resultado en la direccin >C1>
4.@.@ ;ecrementar el /alor 1> cinco /eces y almacenarlo en la direccin >C@&
42 IN#TRUCCION"# LGICA#
IN#TRUCCIN "6"MPLO NOTA#
andl< D
andl<
)Hooooo111H
AND d-l lit-ral )H00000111Hcon <
and<> >?d and<> r-*?1 AND d-l < ' -l r-*i%tro r-*
co(> >?d co(> r-*?0
COMPL"M"NTO d-l r-*i%tro r-*
Aca()iar 0 $or 1B
iorl< D iorl< ;alor OR d- < con ;alor
ior<> >?d ior<> r-*?1 OR d- < con r-*
rl> >?d rl> r-*?0
ROTAT" L"FT Arota iKL&i-rda
r-*i%tro r-*B r-%&ltado -n <
rr> >?d rr> r-*?1
ROTAT" RIGGTArota d-r-cJa
r-*i%tro r-*B r-%&ltado -n r-*
%<a$> >?d %<a$> r-*?0
int-rca()iar 4 )it% d- M $-%o con
lo% 4 d- - $-%o d-l r-*i%tro r-*
Eorl< D
Eorl<
)H00001110H
OR "9CLU#ICA d-l lit-ral
)H00001110H con <
Eor<> >?d Eor<> r-*?0
OR "9CLU#ICA d-l r-*i%tro r-*
con < r-%&ltado -n <
"6"MPLON R-aliKa &na o$-raci.n AND -ntr- do% r-*i%tro%
K realizar and entre dos registros
K reg1 registro 1 >Ca>
K reg@ registro @ >Ca1
K res resultado >Ca@
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
list pM16f84
reg1 equ >Ca>
reg@ equ >Ca1
res equ >Ca@
org >
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
inici
mo/l5 &=>111>>11= K cargamos EI0 en 5 EI0M>111
>>11 E I$
mo/5f reg1 Ken/iamos a reg1 reg1,P>111>>11
mo/l5 &=>1>1>1>1= Kcargamos en 5 880 en 5 880M
>1>1 >1>1 8 8$
mo/5f reg@ Kmo/emos >1>1>1>1 a reg @
and5f reg1)> Krealizamos 6J; entre 5 y reg1 y lo
almacenamos en 5
mo/5f res K mo/emos el resultado al registro de
resultados res
end
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K El resultado 6J; de >111 >>11 y >1>1 >1>1 es >1>1 >>>1
810$
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Podemos /er la simulacin y el resultado en el entorno misim 1a/a$

Pantalla de misim despu+s de ensam&lar

3emory monitor del misim que muestra los resultados EI)88 y 81
"6"MPLO 8 R-aliKar o$-raci.n OR -ntr- &n r-*i%tro ' &n lit-ral
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K B< EJ%<E (J <EFI!%<B L (J 4I%E<64
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K <EF1 >#6B <EFI!%<B1
K <E! >#61 <E!(4%6;B
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
list pM16f84
reg1 equ >Ca>
res equ >Ca1
org >
K,,,,, inicio program ,,,,,,,,,,,,,,
inici
mo/l5 &=>>>>11>>=
mo/5f reg1
iorl5 &=>>11>>>>=
mo/5f res
end
"6"MPLO O Rotar do% ;-c-% Jacia la iKL&i-rda &n r-*i%tro
: ----------------------------------------------
: rotar -l ;alor 00111111 , ;-c-% a la iKL&i-rda
:-----------------------------------------------
li%t $716>84
r-* -L& 0E0)
or* 0
:-----------------------------------------------
inici
mo/l5 &=>>>>>11>=
mo/5f reg
rlf reg)1
rlf reg)1
end

"/-rcicio% $ro$&-%to%
4.I.1 <ealizar una rotacin 4 /eces *acia la derec*a de un registro de /alor
=1>11>>>>=
4.I.@ <ealizar una B< ECclusi/a de /al1M=>>11>1>1= y /al@M=1>1>>11>=
4.I.I Intercam&iar los 4 &its menos significati/os por los cuatro m's significati/os
del /alor &=>>111>1>=) almacenarlos en un registro
44 IN#TRUCCION"# D" 5IT
IN#TRUCCIN "6"MPLO NOTA#
)c> >?) )c> r-*i%tro?1 Pon- a 0 -l )it 1 d-l r-*i%tro
)%> >?) )%> r-*i%tro?2 Pon- a 1 -l )it 2 d-l r-*i%tro
4= IN#TRUCCIN GOTO
Es un salto incondicional utilizado para realizar &ucles) la istruccin es GOTO P
donde A es la etiqueta donde queremos saltar.
E1emplo:
IJICIB
mo/5l &=1>>>11>>=
goto IJICIB
EJ;
El programa anterior realizar' un &ucle cargando indefinidamente el /alor
1>>>11>> en el registro de tra&a1o 7
46 #U5RUTINA#
Podemos realizar &loques de instrucciones que podemos llamar dentro del
programa siempre que queramos) estos &loques se denominan su&rutinas y la
forma de llamarlas es como sigue:
Programa con su&rutinas Equi/alente sin su&rutinas
IJ!%
C644 !(?1 K 4lamada a su&rutina
!(?1
IJ!% K4ugar de retorno
IJ!%
C644 !(?1
IJ!% K4ugar de retorno
!(?1 IJ!%1 K ?loque se su&rutina
IJ!%@
IJ!%I
<E%(<J K<etorno de la llamada
C644
IJ!%
IJ!%1K!u&rutina
IJ!%@K!u&rutina
IJ!%IK!u&rutina
IJ!%
IJ!%
IJ!%1K!u&rutina
IJ!%@K!u&rutina
IJ!%IK!u&rutina
IJ!%
EJ;
EJ;
Podemos crear las su&rutinas que necesitemos) de forma que e/itaremos
repetir instrucciones dentro del mismo programa y +ste ser' m's legi&le.
= "NTRADA# 4 #ALIDA# "N "L MICROCONTROLADOR
CONFIGURANDO LO# PU"RTO# D" "NTRADA 4 #ALIDA
El microcontrolador tiene @ puertos PB<%6 >80$ y el PB<%? >60$
PORT A PORT 5

Cada l.nea de los puertos que corresponden a las patillas <6>,<64 y <?B,<?E
pueden ser configurados como entradas o salidas.
Para configurar los puertos eCisten dos registros especiales %<I!6 y %<I!?.

PB<%6 >80$ ?6JA> ?I%! <64,<6I,<6@,<61,<6> ,,P %<I!6 ?6JA1
PB<%? >60$ ?6JA> ?I%! <?E,<?6,<?8,<?4,<?I,<?@,<?1,<?> ,,P %<I!?
?6JA1
9emos como eCisten @ &ancos) ?6JA> y ?6JA1 para pasar de un &anco a otro
utilizamos el registro !%6%(! >I0$ mediante el &it 8 de ese registro) de forma
que si el &it 8 es > estamos en el &anco > y si el &it 8 es 1 pasaremos al &anco 1.
Dir-cci.n )anD0 )anD1 Nota%
>I* !%6%(! !%6%(! ?it 8M> ?anG>. !i &it 8M1 ?anG1
>8* PB<%6 %<I!6 ?itsM1 Entradas. ?itsM> !alidas
>6* PB<%? %<I!? ?itsM1 Entradas. ?itsM> !alidas
Cuando se resetea el microcontrolador se accede al &anco >) para acceder al &anco
1 *ay que poner a 1 el &it 8 del registro !%6%(!
Nota %o)r- -l r-*i%tro #TATU#
"l r-*i%tro #TATU# -% &n r-*i%tro -%$-cial L&- -%tQ -n la dir-cci.n
02J
Lo% )it% d-l r-*i%tro #TATU# %- l-% d-no(inan )and-ra% A>la*%B?
c&ando arranca -l (icrocontrolador la% )and-ra% -%tQn d- la
%i*&i-nt- >or(a #TATU#7H00011999H
"%to% 8 )it% ti-n- -l %i*&i-nt- %i*ni>icado0
)it N )it 6 )it = )it 4 )it 2 )it , )it 1 )it 0
I<P <P1 <PB D %> D P; Q ;C C
#i*ni>icado0
5IT #i*ni>icado
C Carry
6carreo en las operaciones) se produce al
des&ordar la operacin.
;C ;igit
carry
6cti/o cuando *ay acarreo en el 4 &it de menor
peso
Q Qero Es 1 cuando el resultado de una operacin es >
D P; Po5er
do5n
> si est' en sleep) 1 cuando se acti/a clr5dt
D %> %imer
out
2in de temporizacin
<PB <egister
&anG select
!eleccin de &ancos <P>M> &anG> <P>M1 ?anG1
<P1 Jo usado
I<P Jo usado

"l $roc-%o $ara con>i*&rar lo% $&-rto% -% -l %i*&i-nt-0
1. 6l arrancar el micro controlador el &anco por defecto es ?6JA>
@. 6ccedemos al &anco1 ?6JA1 poniendo a 1 el &it8 del registro !%6%(! >I*$
I. Cargar en %<I!6 los /alores adecuados > salidas 1 entradas$
4. Cargar en %<I!? los /alores adecuados > salidas 1 entradas$
8. 6cceder al &anco > ?6JA> poniendo a > el &it 8 del registro !%6%(!
6. <ealizar el programa para acti/ar las entradas y salidas
E1emplos de configuracin del microcontrolador
Configurar todo salidas:
%<I!6 >80 ?6JA1$ >>>>>
%<I!? >60 ?6JA1$ >>>>>>>>
Configurar todo entradas:
%<I!6 >80 ?6JA1$ 11111
%<I!? >60 ?6JA1$ 11111111
Configuracin de PB<%6 como entradas y PB<%? como salidas:
%<I!6 >80 ?6JA1$ 11111
%<I!? >60 ?6JA1$ >>>>>>>>
PB<%6 como entradas y PB<%? la mitad entradas y la mitad salidas
%<I!6 >80 ?6JA1$ >>>>>
%<I!? >60 ?6JA1$ >>>>1111
#"CU"NCIA PARA CONFIGURACIN D" LO# PU"RTO#
1 Poner el &it 8 del registro !%6%(! a 1 para acceder al &anco1
)%> 0E02?= K&it set file >C>I !tatus$ &it 8 M 1
@ Configuracin de %<I!6 y %<I!?
(o;l< )H11111111H K1Mentradas >Msalidas$
(o;<> 0E0= K>C>8M %<I!6 8 entradas > salidas
(o;l< )H00000000H K1Mentradas >Msalidas$
(o;<> 0E06 K %<I!? P(E<%B? salidas$
I Poner a > el &it 8 del registro !%6%(! para /ol/er al &anco >
)c> 0E02?= K ?it clear file Ponemos a > para acceder al &anco >$
4 Iniciciamos el programa
"6"MPLO 10 R-aliKar &n $ro*ra(a L&- l-a int-rr&$tor-% -n -l $ort A '
%aL&- -l ;alor $or lo% l-d% -n $ort 5
(tilizaremos el siguiente esquema:

%enemos 4 entradas en <6> <61 <6@ y <6I y 8 salidas <?> <?1 <?@ <?I <?4
<?8 <?6 <?E
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K,,,,, leds y interruptores ,,,,,,,,,,
K,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
list pM16f84
org >
K,,, configuramos puertos ,,,,,,,,,,,,,,,,,,
&sf *=>I=)8 KPonemos a 1 el &it 8 de !%6%(! >I*$
3B947 &=11111111= Kcargamos en 5 =11111111=
mo/5f *=>8= KConfiguramos %<I!6 >8*$ como entradas
mo/l5 &=>>>>>>>>= KCargamos > en 5
mo/5f *=>6= KConfiguramos %<I!? >60$ como salidas
&cf *=>I=)8 KPonemos a > el &it 8 de !%6%(! y pasamos
a &anG>
K,,,,, IJICIB ;E P<BF<636 P<IJCIP64 ,,,,,,,,
IJICIB
3B92 *=>8=)> KCargamos en 5 el /alor del PB<%6
mo/5f *=>6= KPasamos este /alor a PB<%?
goto IJICIB K?ucle para pasar al IJICIB del programa
end K2inal del programa
Juestro programa en el simulador 2EE<!(3 3I!I3 ;E 1.E.R

Podemos /er el estado del microcontrolador

%am&ien el estado de los dispositi/os de entrada Interruptores$ y los 4E;! de
salida

9amos a /er el mismo programa utilizando /aria&les
K ,,,,, 4E;! E IJ%E<<(P%B<E!
4I!% PM16284
!%6%(! EN( 0=>I=
PB<%6 EN( 0=>8=
PB<%? EN( 0=>6=
B<F >
K,,, CBJ2IF(<6CISJ ;E P(E<%B!
?!2 !%6%(!)8
3B947 0=22=
3B972 PB<%6
3B947 0=>>=
3B972 PB<%?
?C2 !%6%(!)8
K ,, P<BF<636 P<IJCIP64
IJICIB
3B92 PB<%6)>
3B972 PB<%?
FB%B IJICIB
EJ; K
E1 8.1 Poner comentarios al programa anterior.
"6"MPLO 11 R-aliKar &n $ro*ra(a $ara l--r -ntrada% ' o)t-n-r la% %alida%
co($l-(-ntada%
(tilizaremos el mismo esquema de 4 entradas y 8 salidas.
: -----------------------------------
: -- Pro*ra(a $ara l--r -ntrada%
: -- ' o)t-n-r %alida% co($l-(-ntada%
: ------------------------------------
li%t $716>84
%tat&% -L& JH02H
$orta -L& JH0=H
$ort) -L& JH06H
or* 0
: -- con>i*&ra(o% $orta ' $ort) -----
)%> %tat&%?= :acc-d-(o% )anco 1
(o;l< )H11111111H :-ntrada%
(o;<> $orta :al $&-rto A
(o;l< )H00000000H :%alida%
(o;<> $ort) :al $&-rto 5
)c> %tat&%?= :acc-d-(o% al )anco 0
: -- $ro*ra(a $rinci$al -------------
inicio co(> $orta?0 :l--(o% $ortA ' co($l-(-nta(o%
(o;<> $ort) :$a%a(o% lo% dato% a la %alida
*oto inicio :)&cl-
-nd
Juestro programa simulado mediante misim

"6"MPLO 1, Di%-Rar &n %-ncillo (-didor d- ni;-l
(tilizaremos el siguiente esquema

En <61 L <6> tenemos @ sondas de deteccin de ni/el de agua y en <?1 y <?@
tenemos las salidas
E/identemente este programa es de por s. poco Htil) pero nos permite practicar
con la programacin de los puertos.

Juestro programa simulado en misim
E1 8.@ 3odificar el programa para tener 4 ni/eles en el depsito.
E1 8.I ;ise-ar y realizar un programa con 8 entradas y 4 salidas. El programa slo
utilizar' las 4 primeras entradas.
El programa leer' las entradas y sacar' las salidas complementadas

Esquema para realizar el proyecto.
E1 8.4 (tilizando 8 entradas) realizar una puerta 6J; de 4 &its utiliza <?>,<?I
como una entrada y <?4,<?E como la segunda entrada$
6 #ALTO# "N FUNCIN D" 5IT# 4 D" R"GI#TRO#
IN#TRUCCIN "6"MPLO# NOTA#
)t>%c >?)
)t>%c
r-*i%tro?1
)it t-%t >il- %Di$ cl-ar #i -l )it ) d-l
r-*i%tro -% 1 la in%tr&cci.n %i*&i-nt-
%- -/-c&ta nor(al(-nt-? %i )70 la
in%tr&cci.n %i*&i-nt- %- i*nora ' %-
%alta
)t>%% >?) )t>%% >?)
)it t-%t >il- %Di$ %-t #i -l )it ) d-l
r-*i%tro -% 0 la %i*&i-nt- in%tr&cci.n
%- -/-c&ta nor(al(-nt-? %i )71la
%i*&i-nt- in%tr&cci.n %- %alta
d-c>%K >?d d-c>%K
contador?1
d-cr-(-nt >? %Di$ i> 0 D-cr-(-nta -l
r-*i%tro %i -l r-%&ltado NO -% 0 la
in%tr&cci.n %i*&i-nt- %- -/-c&ta
nor(al(-nt-? %i -l r-%&ltado -% c-ro la
in%tr&cci.n %i*&i-nt- %- i*nora ' %-
%alta
inc>%K >?d
inc>%K
contador?0
incr-(-nt >il- %Di$ i> 0 Incr-(-nta -l
cont-nido d-l r-*i%tro? %i -l r-%&ltado
NO -% 0 la %i*&i-nt- in%tr&cci.n %-
-/-c&ta nor(al(-nt-? $-ro %i -% 0 A$or
d-%)orda(i-nto d- 11111111B la
in%tr&cci.n %i*&i-nt- %- i*nora ' %-
%alta
!on funciones para tomar decisiones dependiendo del /alor del &it o del registro)
se utilizan para contarDdescontar registros o para determinar si se *a producido un
e/ento.
"6"MPLO 12 Pro*ra(a contador Ja%ta ,== ' l&-*o ;&-l;- a 0"l r-%&ltado
%- ;i%&aliKa con l-d% c&ando ll-*a a ,==
Juestro programa en el sinulador
E1 6.1 <ealizar un decrementador de @88 a >
N T"MPORISACIN "N "L PIC 16F84
Cuando se necesita un control del tiempo en el microcontrolador) se utiliza el timer
%3<>) que puede configurarse como CBJ%6;B< y como %E3PB<IQ6;B<.
El timer %3<> es un contador que determina el tiempo que tarda en des&ordarse
el contadordependiendo del /alor precargado.
!u funcionamiento es:

El contador el PIC es de 8 &its que /a desde &=>>>>>>>>= *asta &=11111111=)
cuando se produce el des&ordamiento /uel/e al /alor inicial &=>>>>>>>>=.
4os impulsos de entrada del contador pueden ser eCternos mediante el pin
<64D%BCA1 o &ien de una se-al del relo1 interno) de forma que puede funcionar de
dos formas distintas:
1, Como contador de impulsos que entran por <64D%BCA1
@,Como temporizador de tiempos.
Para configurar la forma de actuacin *ay que acceder al registro BP%IBJ y
actuar so&re el &it %BC!
!i %BC!M1 el timer actua como contador.
!i %BC!M> el timer actua como temporizador.

<egistros y &its importantes para control del temporizador
TMRO COMO CONTADOR
!e introducen los impulsos a contar por el pin <64D%BCA1
!e programa el &it %B!E del registro BP%IBJT<EF de la siguiente forma:
%B!EM1 6ctua por flanco actico descendente
%B!EM> 6ctua por flanco acti/o ascendente
Circuito utilizado para la entrada de un contador.
Cuando se des&orda el contador pasa de =11111111= a =>>>>>>>>= y se acti/a el &it
%BI2 del registro IJ%CBJ
TMRO COMO T"MPORISADOR
6l tra&a1ar como temporizador se cuentan los impulsosde la frecuencia de
oscilacin o frecuencia de tra&a1o) teniendo en cuenta que un ciclo de m'quina
ocupa 4 ciclos del cristal oscilador. 6s. tendremos que la frecuencia de conteo ser'
2cM2recuencia oscilacinD4
Para nuestro caso) que el relo1 es de 43*) tendremos 2cM43*zD4 M 1
microsegundo
Como 1 us es un periodo de tiempo muy peque-o) el microcontrolador tiene la
posi&ilidad de utilizar un di/isor de frecuencia llamado prescaler) el prescaler se
configura con los &its P!@)P!1)P!> del registro <EFTBP%IBJ.
5IT# D" CONFIGURACIN 4 L"CTURA D"L T"MPORISADOR TMR0
4os &its de lectura y configuracin son los siguientes:
Dir-cci.n R-*i%tro
5it
N
5it
6
5it = 5it 4 5it 2 5it ,
5it
1
5it 0
>1* &anG> %3<B # # # # # # # #
>&* &anG> IJ%CBJ # # # # # %BI2 # #
>1* &anG 1
BP%IBJT<
EF
# # %BC! %B!E P!6 P!@ P!1 P!>
<egistro TMRO: 9alor del contador o del temporizador.
<egistro INTCON:
?it @ , %BI2: %3<B B/erflo5 Interrupt 2lag ) ?andera de interrupcin del
contador o temporizador %3<B) cuando el registro %3<B pasa de
&=11111111= a &=>>>>>>>>= el /alor de %BI2 pasa a 1
<egistro OPTIONTR"G0
?it 8 , %BC! %3<B ClocG !ource !elect ?it$
%BC! M > Pulsos del relo1 interno 2 oscilacin D 4K el %3<B se
programa como temporizador.
%BC! M 1 Pulsos eCternos introducidos por el pin <64D%BCA1)
%3<B actua como contador.
?it 4 , %B!E %3<B !ource Edge select ?it$
%B!E M > El contador del pin <64D%BCA1 actua con flanco
ascendente
%B!E M 1 El contador actua con flanco descendente
?it I P!6 Prescaler 6signment ?it$
P!6 M > El di/isor de frecuencia se asigna a %3<B Contador o
temporizador$
P!6 M 1 ;i/isor asignado al 7atc*dog no eCplicado toda/ia$
?it @ ?it 1 ?it > Prescaler <ate !elect ?its$ ?its de seleccin del di/isor
de frecuencia.
P!@ P!1
P!>
;i/isor del Prescaler
%3<B
>>> 1:@
>>1 1:4
>1> 1:8
>11 1:16
1>> 1:I@
1>1 1:64
11> 1:1@8
111 1:@86
"6"MPLO# D"L TMRO COMO CONTADOR
Para programar un contador con el pic necesitamos:
1, Pasar al &anco 1 ?!2 !%6%(!)8
@, Programar los &its 4 %B!E y el &it 8 %BC! del registro <EFTBP%IBJ
>10$ de la siguiente forma:
%BC!M1 Contador
%B!EM> acti/o por flanco descendente
%B!EM1 acti/o por flanco ascendente
P!6M1 prescaler al 5ac*dog ya que no necesitamos prescaler al
contador
mo/5l &=>>111>>>= KContador y acti/ado por flanco descenente
mo/5f <EFTBP%IBJ
I, Pasar al &anco > ?C2 !%6%(!)8
4, Iniciar el contador a > clrf %3<B
8 , 4eer %3<B mo/f %3<B)>
"6"MPLO 14 UTILISAR "L CIRCUITO D" CONTADOR PARA
CONTAR IMPUL#O# 4 CI#UALISARLO# "N L"D# D" #ALIDA
K ,,,,,,,,,,,,,,,,,,,,,,,,,
K ,, programa contador ,,,,
K ,, /isualizar por leds ,,
K ,, la cuenta en PB<%? ,,,
K ,,,,,,,,,,,,,,,,,,,,,,,,,
4I!% pM16f84
%3<B EN( 0=>1= K<egistro de configuracin y contador
!%6%(! EN( 0=>I= K<egistro de !%6%(!
PB<%? EN( 0=>6= K<egistro Puerto ? de salida
org >
K ,, CBJ2IF(<6CIBJ ;E4 CBJ%6;B< L E4 P(E<%B !64I;6
?!2 !%6%(!)8 K6cceso al &anco 1
3B947 &=>>111>>>= KConfiguramos %3<B como contador
3B972 %3<B Kpor flanco ascendente
3B947 &=>>>>>>>>= Kconfiguramos como salida
3B972 PB<%? Kel puerto ?
?C2 !%6%(!)8 KPasamos al &anco >
C4<2 %3<B Kiniciamos el contador a >
K,, Programa principal ,,,
inicio 3B92 %3<B)> KCargamos el contador en 5
3B972 PB<%? KPasamos el /alor cuenta al PB<%?
FB%B inicio K?ucle
EJ; K2inal de programa
"6"MPLO# D"L TMRO COMO T"MPORISADOR
Para programar el temporizador necesitamos calcular el tiempo de
temporizacin) aplicaremos la siguiente frmula:
%iempo M 4 O %iempo 2recuencia oscilador O Prescaler O @86,Carga en el
temporizador$
%iempo frecuencia oscilador Para 4 3*z$ M 1 u segundo
Prescaler desde 1D@ *asta 1D@86
Para programar un temporizador con el pic necesitamos:
1, Pasar al &anco 1 ?!2 !%6%(!)8
@, Programar los &its 4 %B!E) el &it 8 %BC! y los &its I)@)1)> del registro
<EFTBP%IBJ >10$ de la siguiente forma:
%BC!M> %emporizador
%B!EM> acti/o por flanco descendente
%B!EM1 acti/o por flanco ascendente
P!6 &it I$M> prescaler al temporizador
P!@)P!1)P!> &its @)1)>$!egHn la ta&la de seleccin del
prescaler
mo/5l &=11>1>1>1= K%emporizador flanco ascendente P!6M>
Prescaler al temporizador y prescaler 1>1 1D64$
mo/5f <EFTBP%IBJ
I, Pasar al &anco > ?C2 !%6%(!)8
4, Iniciar el temporizador a > clrf %3<B
8 , 4eer %3<B mo/f %3<B)>
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
K ,, Programa de temporizacin del parpadeo de un led
K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
list pM16f84
port& equ *=>6=
timer equ *=>1=
estatus equ *=>I=
org >
K ,,,,,,,,, iniciamos puertos y temporizador ,,
&sf estatus)8 K Pasamos al &anco 1
mo/l5 &=11>1>1>1= K Cargamos el /alor en el
mo/5f timer K <egistro Bption del timer
mo/l5 &=>>>>>>>>= K Cargamos >> en el registro
mo/5f port& K Puerta ? salidas$
&cf estatus)8 K Pasamos al &anco >
clrf port& K Ponemos la salida PB<%? a >
K ,, Programa principal ,,
inicio &sf port&)> K Ponemos un 1 en la salida > del port ?
call temp
&cf port&)> K Ponemos a > el &it > del port ?
call temp K 4lamamos a la su&rutina del temporizador
goto inicio K 9ol/emos al inicio
K ,, !u&rutina de temporizacin ,,
temp clrf timer K Ponemos el temporizador a >
&ucle &tfss timer)E K Compro&amos si el temporizador llega a &=1>>>>>>>=
goto &ucle K 9ol/emos al &ucle
return K !i el /alor es &=1>>>>>>>= del temporizador /ol/emos de la
K su&rutina
K ,, 2inal de su&rutina ,,
end
E1ercicios propuestos:
E1ercicio E.1 <ealizar un contador de decenas y o&tener el resultado en un display.
E1ercicio E.@ realizar un programa para encender los leds del port& de la siguiente
forma:
Encendemos led >
%emporizamos >.8 segundos$
6pagamos led> y encendemos led1
%emporizamos
6pagamos led1 y encendemos led@
....
Cuando llegamos al ledE apagamos ledE temporizamos y /ol/emos a encender el
led 1
E1ercicio E.I <ealizar un sem'foro temporizado cuyo &ucle sea:
Encendemos /erde y temporizamos
Encendemos led amarillo parpadeante
Encendemos led ro1o y temporizamos
9ol/emos al inicio.

También podría gustarte