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 Idear solucin 0erramientas 7indo5s Pensar la solucin y dise-ar circuito con programas PC? 0erramientas 4inuC PC? 2ic*eros

4istar

4istar programa con E;I%)3P46? o con cualquier Editores 6!CII editor 6!CII 3P6!3 gpasm

4istado.asm

Compilar

4istado.*eC

Emular

3P!I3 ) !imuPIC) 3isim 7inPICme,%< : circuito gra&ador) IC,Prog

gputils)gpsim)pi G;E9)3isim piG;E9

Fra&ar 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 K K K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, !e *an definido I /aria&les !(36)!(36@ y <E!(4 en diferentes posiciones de la memoria de datos en el <EFI!%E< 2I4E 36P ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

ORG 0 K K K K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Brigen de las instrucciones en el P<BF<63 3E3B<L 36P ;irecti/a de compilacin ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

(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.

4 1 COMANDO# 5@#ICO# AIB CARGA D" CALOR"#?#UMA 4 5ORRADO D" R"GI#TRO# IN#TRUCCIN "6"MPLO (o;<> > (o;l< D (o;<> #UMA (o;l< 0E0= NOTA (o;-r ac&(&lador < al r-*i%tro > (o;-r &n lit-ral l A0E0=B al ac&(&lador <

add<> >?d

%&(a < ' > A#UMA,B %i d70 -l add<> #UMA, r-%&latado -n F ?0 %i d71 -l r-%&ltado -n > A#UMA,B addl< 0E0, clr> #UMA clr< %&(a lit-ral A0E0,B ' < $on- a 0 -l r-*i%tro > A#UMAB $on- a 0 -l ac&(&lador <

addl< D clr> > clr<

"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 K K K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, !e *an definido @ /aria&les !(36 y <E!(4 en diferentes posiciones de la memoria de datos en el <EFI!%E< 2I4E 36P ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

ORG 0 K K K K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Brigen de las instrucciones en el P<BF<63 3E3B<L 36P ;irecti/a de compilacin ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

(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 : -------------------------------------------------: "62 A#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 K K K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, !e *an definido @ /aria&les !(361 y <E!(4 en diferentes posiciones de la memoria de datos en el <EFI!%E< 2I4E 36P ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

ORG 0 K K K K ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, Brigen de las instrucciones en el P<BF<63 3E3B<L 36P ;irecti/a de compilacin ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

(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 ;ecimal #INTA9I# d=cantidad=

.cantidad *=cantidad= 0eCadecimal >Ccantidad cantidad * Bctal ?inario o=cantidad= &=cantidad= a=caracter= 6!CII =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 inc> >?d inc> NOTA# Incr-(-nta -l r-*i%tro >? %i d70 %-

#UMA?0 d-c> #UMA?1 %&)l< )H0110H %&)<> R"#TA?0

al(ac-na -n <? %i d71 %- al(ac-na -n -l r-*i%tro D-cr-(-nta -l r-*i%tro #UMA ' -l r-%&ltado d- *&arda -n #UMA R-%ta 0110 - < ' r-%&ltado al(ac-nado -n < R-%ta >-< ' r-%&ltado -n <

d-c> >?d

%&)l< D

%&)<> >?d

"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@&

4 2 IN#TRUCCION"# LGICA# IN#TRUCCIN andl< D and<> >?d co(> >?d iorl< D ior<> >?d rl> >?d "6"MPLO andl< )Hooooo111H and<> r-*?1 co(> r-*?0 iorl< ;alor ior<> r-*?1 rl> r-*?0 NOTA# AND d-l lit-ral )H00000111Hcon < AND d-l < ' -l r-*i%tro r-* COMPL"M"NTO d-l r-*i%tro r-* Aca()iar 0 $or 1B OR d- < con ;alor OR d- < con r-* ROTAT" L"FT Arota iKL&i-rda r-*i%tro r-*B r-%&ltado -n < ROTAT" RIGGTArota d-r-cJa r-*i%tro r-*B r-%&ltado -n r-* int-rca()iar 4 )it% d- M $-%o con lo% 4 d- - $-%o d-l r-*i%tro r-* OR "9CLU#ICA d-l lit-ral )H00001110H con < OR "9CLU#ICA d-l r-*i%tro r-* con < r-%&ltado -n <

rr> >?d

rr> r-*?1

%<a$> >?d

%<a$> r-*?0 Eorl< )H00001110H Eor<> r-*?0

Eorl< D

Eor<> >?d

"6"MPLON R-aliKa &na o$-raci.n AND -ntr- do% r-*i%tro% K K K K realizar and entre dos registros reg1 registro 1 >Ca> reg@ registro @ >Ca1 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

4 4 IN#TRUCCION"# D" 5IT IN#TRUCCIN "6"MPLO NOTA#

)c> >?) )%> >?)

)c> r-*i%tro?1 )%> r-*i%tro?2

Pon- a 0 -l )it 1 d-l r-*i%tro 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 4 6 #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 IJ!% C644 !(?1 K 4lamada a su&rutina !(?1 IJ!% K4ugar de retorno IJ!%IK!u&rutina IJ!% IJ!% C644 !(?1 IJ!% IJ!% K4ugar de retorno IJ!%1K!u&rutina !(?1 IJ!%1 K ?loque se su&rutina IJ!%@K!u&rutina IJ!%@ IJ!%IK!u&rutina IJ!%I IJ!% <E%(<J K<etorno de la llamada C644 EJ; Equi/alente sin su&rutinas IJ!% IJ!%1K!u&rutina IJ!%@K!u&rutina

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 >I* >8* >6* )anD0 !%6%(! PB<%6 PB<%? )anD1 !%6%(! %<I!6 %<I!? Nota% ?it 8M> ?anG>. !i &it 8M1 ?anG1 ?itsM1 Entradas. ?itsM> !alidas ?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 I<P )it 6 <P1 )it = <PB )it 4 D %> )it 2 D P; )it , Q )it 1 ;C )it 0 C

#i*ni>icado0 5IT C Carry ;C ;igit carry Q Qero D P; Po5er do5n #i*ni>icado 6carreo en las operaciones) se produce al des&ordar la operacin. 6cti/o cuando *ay acarreo en el 4 &it de menor peso Es 1 cuando el resultado de una operacin es > > si est' en sleep) 1 cuando se acti/a clr5dt

D %> %imer out

2in de temporizacin

<PB <egister !eleccin de &ancos <P>M> &anG> <P>M1 ?anG1 &anG select <P1 I<P Jo usado 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 K 1Mentradas >Msalidas$ (o;<> 0E0= K>C>8M %<I!6 8 entradas > salidas (o;l< )H00000000H K 1Mentradas >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# )t>%c r-*i%tro?1 NOTA# )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 )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-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 ' %-

)t>%c >?)

)t>%% >?)

)t>%% >?)

d-c>%K >?d

d-c>%K contador?1

%alta 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

inc>%K >?d

inc>%K contador?0

!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 >1* &anG> >&* &anG> %3<B IJ%CBJ 5it N # # 5it 6 # # 5it = 5it 4 5it 2 5it , # # # # # # # 5it 1 # 5it 0 # #

%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!> >>> >>1 >1> >11 1>> 1>1 ;i/isor del Prescaler %3<B 1:@ 1:4 1:8 1:16 1:I@ 1:64

11> 111

1:1@8 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 K K K ,,,,,,,,,,,,,,,,,,,,,,,,, ,, programa contador ,,,, ,, /isualizar por leds ,, ,, la cuenta en PB<%? ,,, ,,,,,,,,,,,,,,,,,,,,,,,,,

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