Vous êtes sur la page 1sur 23

0. Introduccin Con este tutorial se pretende introducir al lector en el mundo de la programacin de microcontroladores PIC de forma prctica y sencilla.

Se suponen unos conocimientos muy bsicos sobre electrnica digital. Hablaremos de Instrucciones, registros de memoria RAM, memoria PR!M "un tipo de R!M#, de ni$eles lgicos %&% o %'% y cosas por el estilo. l PIC'()*+ es un microcontrolador, una especie de %ordenador en miniatura% "con muc,as comillas# -ue podremos programar. n su interior posee un microprocesador, una memoria RAM "$olatil# donde guardaremos las $ariables, una memoria PR!M "no $olatil# donde guardaremos nuestro programa, un .imer o contador -ue nos facilitar algunas tareas, y algunas cosas mas. Algunas caracter/sticas ms representati$as son0 1. Descripcin de sus pines !SC'6C;3I= y !SC86C;3!>.0 son para el oscilador ;os tipos de osciladores mas usados son el ?. "cristal de cuar2o# y el RC "resistencia y condensador# el modo de cone1ionado es el siguiente0 RA&, RA', RA8, RA4 y RA+0 son los pines del puerto A R9&, R9', R98, R94, R9+, R95, R9( y R9:0 son los pines del puerto 9. MC;R0 Pin de reseteo del pic, cuando se pone a %&% el pic se resetea. <dd y <ss0 pines de alimentacin "<dd 5< y <ss a masa# !pera a una frecuencia m1ima de '& MH2 '3byte de memoria PR!M para nuestro programa (* bytes "de * bits# de memoria RAM (+ bytes de memoria Solo 45 instrucciones '4 pines de entrada6salida "un puerto de * bits 7 otro de 5 bits# .imer6contador de * bits PR!M para datos "no $oltiles#

Oscilador XT C'@C8@44p) Crystal A +MH2 2. Organizacin de la memoria n primer lugar tenemos -ue distinguir claramente entre tres tipos de memoria0 >na0 la memoria PR!M donde almacenaremos el programa -ue ,aremos, esta memoria solo podr ser leida por el pic "el pic $a leyendo las instrucciones del programa almacenado en esta memoria y las $a eCecutando#. Al apagar el pic esta memoria no se borra. Dos0 la memoria RAM en cuyos registros se irn almacenando los $alores de las $ariables -ue nosotros -ueramos y cuando nosotros -ueramos "por programa#, al apagar el pic esta memoria se borra. .res0 la memoria PR!M para datos, es un espacio de memoria PR!M en la -ue se pueden guardar $ariables -ue -ueremos conser$ar aun-ue se apague el pic. =o se tratar a-u/ por ser una memoria mas dif/cil de emplear. Oscilador RC C' alrededor de 8&p) 53B A R' A '&&3B

2.1 La memoria EE RO! o memoria de programa l espacio marcado como %>ser memory Space% es el espacio de memoria donde ir nuestro programa, comprende las direcciones de memoria desde la &&&&, ,asta la 4)), "4)), en decimal es '&84, mas la direccin &&&&, ,acen '&8+ direcciones, es decir, '3byte#

%Reset <ector% es la primera direccin a la -ue se dirige el pic al encenderlo o al resetearlo. %PC% y los %StacE ;e$el% son empleados por el pic y nosotros no tenemos acceso a ellos.

2.2 La memoria R"! ;a memoria RAM no solo se usa para almacenar nuestras $ariables, tambiFn se almacenan una serie de registros -ue configuran y controlan el PIC. Podemos obser$ar en la imagen -ue esta memoria esta di$idida en dos bancos, el banco & y el banco ', antes de acceder a un registro de esta memoria tenemos -ue preguntarnos en -ue banco estamos, generalmente se trabaCa en el banco &, ya $eremos mas adelante como cambiamos de banco de memoria. )iCndonos en el banco ', las direcciones desde la &&, ,asta la &9, estn ocupadas por registros del pic, por lo -ue tendremos -ue empe2ar a guardar nuestras $ariables a partir de la direccin &C,. Podremos acceder al resto de registros para cambiar la configuracin o el estado del pic. )altar/a aGadir a este cuadro el registro mas utili2ado de todos, el acumulador "H# o registro de trabaCo. =o se trata de un registro propiamente dic,o ya -ue no tiene direccin pero se usa constantemente para mo$er datos y dar $alore a las $ariables "registros#. Por eCemplo, si -ueremos copiar la informacin del registro &C, en el registro &D, no podremos ,acerlo directamente, deberemos usar una instruccin para cargar el $alor del registro &C, en el acumulador y despuFs otra instruccin para cargar el $alor del acumulador en el registro &9,.

#. Registros internos A continuacin se e1plican todos los registros de configuracin y control de la memoria RAM. stos registros se usan para controlar los pines del pic, consultar los resultados de las operaciones de la A;> "unidad aritmFtica lgica#, cambiar de banco de memoria... entre otras cosas. n 9A=C! %&% I=D) "direccionamiento indirecto#0 Direccin &&,, sir$e para $er el dato de la direccin a la -ue apunta el registro )SR "dir. &+,# -ue $eremos mas adelante. .MR& ".imer6contador#0 Direccin &',, A-u/ se puede $er el $alor en tiempo real del .imer6contador. .ambiFn se puede introducir un $alor y alterar as/ el conteo. ste conteo puede ser interno "cuenta ciclos de reloC# o e1terno "cuneta impulsos introducidos por RA+#. PC; "Parte baCa del contador de programa#0 Direccin &8,, Modificando este registro se modifica el contador de programa, este contador de programa es el -ue seGala al pic en -ue direccin "de PR!M# tiene -ue leer la siguiente instruccin. sto se utili2a muc,o para consultar tablas "ya $eremos mas adelante# S.A.>S0 Direccin &4,, este es uno de los registros mas importantes y el -ue mas $as a utili2ar. Hay -ue anali2ar el funcionamiento de este registro bit a bit0 o CARRI, Direccin S.A.>S,& "bit &#0 bit de desbordamiento. ste bit se pone a %'% cuando la operacin anterior ,a rebasado la capacidad de un byte. Por eCemplo, si sumo dos nJmeros y el resultado no cabe en * bit el CARRI se pone a %'%, Pasa lo mismo cuando resto dos nJmeros y el resultado es un nJmero negati$o. Se puede usar para saber si un nJmero es mayor -ue otro "restndolos, si ,ay acarreo es -ue el segundo era mayor -ue el primero#. >na $e2 -ue este bit se pone a %'% no se baCa solo "a%&%#, ,ay -ue ,acerlo por programa si -ueremos $ol$erlo a utili2ar. o DC "digit carry#, Direccin S.A.>S,' "bit '#0 lo mismo -ue el anterior pero esta $e2 nos a$isa si el nJmero no cabe en cuatro bits. o K "2ero#, Direccin S.A.>S,8 "bit 8#0 Se pone a %'% si la operacin anterior ,a sido cero. I pasa a %&% si la operacin anterior no ,a sido cero. Se usa para comprobar la igualdad entre dos nJmeros "restndolos, si el resultado es cero ambos nJmeros son iguales# o PD "PoLer M DoLn bit#, Direccin S.A.>S,4 "bit4# se pone a %&% despuFs de eCecutar la instruccin S; PN, se pone a %'% despuFs de eCecutar la instruccin C;RHD.N o despuFs de un poLerMupN. o .! ".imer >p#, Direccin S.A.>S,+ "bit+# se pone a %&% cuando se acaba el tiempo del HA.CHD!ON, Se pone a %'% despues de eCecutar las instrucciones, C;RHD.N o S; PN o despues de un poLerMupN. o RP& y RP' "seleccin de banco#, Direccin S.A.>S,5 y S.A.>S,(. Como el PIC'()*+ solo tiene dos bancos de memoria el RP' no se usa para nada, la

seleccin del banco se ,ace mediante RP& "S.A.>S,5#, si est a %&% nos encontramos en el banco &, y si est a %'% nos encontramos en el banco '. o IRP, Direccin S.A.>S,:, n este PIC no se usa para nada.

)SR "Puntero#, Direccin &+,, se usa para direccionamiento indirecto en combinacin con el registro I=D) "dir. &&,#0 se carga la direccin del registro -ue -ueremos leer indirectamente en )SR y se lee el contenido de dic,o registro en I=D). P!R.A "Puerto A#, Direccin &5,. Con este registro se puede $er o modificar el estado de los pines del puerto A "RA& M RA+#. Si un bit de este registro est a %'% tambiFn lo estar el pin correspondiente a ese bit. l -ue un pin estF a %'% -uiere decir -ue su tensin es de 5<, si est a %&% su tensin es &<. Correspondencia0 o RA& @@P P!R.A,& o RA' @@P P!R.A,' o RA8 @@P P!R.A,8 o RA4 @@P P!R.A,4 o RA+ @@P P!R.A,+

P!R.9 "Puerto 9#, Direccin &(, igual -ue P!R.A pero con el puerto 9 Correspondencia0 o R9& @@P P!R.9,& o R9' @@P P!R.9,' o R98 @@P P!R.9,8 o R94 @@P P!R.9,4 o R9+ @@P P!R.9,+ o R95 @@P P!R.9,5 o R9( @@P P!R.9,( o R9: @@P P!R.9,:

Direccin &:,, =o utili2ada por este PIC. DA.A, Direccin &*,. PR!M de datos n este registro se pone el dato -ue se -uiere grabar en la

ADR, Direccin &Q,. n este registro se pone la direccin de la donde -ueremos almacenar el contenido de DA.A

PR!M de datos

PC;A.H, Direccin &A,. Modifica la parte alta del contador de programa "PC#, el contador de programa se compone de '4 bits, los * bits de menor peso se pueden modificar con PC; "dir. &8,# y los 5 bits de mayor peso se pueden modificar con PC;A.H I=.C!= "controla las interrupciones#, Direccin &9,. Se estudia bit a bit0 o R9I) ")lag de interrupcin por cambio de P!R.9# Direccin I=.C!=,& "bit &# se pone a %'% cuando alguno de los pines R9+, R95, R9(, o R9: cambia su estado. >na $e2 -ue est a %'% no pasa a %&% por si mismo0 ,ay -ue ponerlo a cero por programa. o I=.) ")lag de interrupcin de R9&# Direccin I=.C!=,'. Si est a %'% es -ue ,a ocurrido una interrupcin por R9&, si est a %&% es -ue dic,a interrupcin no ,a ocurrido. ste bit es una copia de R9&. o .!I) ")lag de interrupcin por desbordamiento de .MR&# Direccin I=.C!=,8. Cuando .MR& se desborda este )lag a$isa poniendose a %'%. Poner a %&% por programa. o R9I "Habilita la interrupcin por cambio de P!R.9# Direccin I=.C!=,4. Si est a %'% las interrupciones por cambio de P!R.9 son posibles. o I=. "Habilita la interrupcin por R9&# Direccin I=.C!=,+. Si lo ponemos a %'% la interrupcin por R9& es posible o .!I "Habilita la interrupcin por desbordamiento de .MR&# Direccin I=.C!=,5. Si este bit esta a %'% la interrupcin por desbordamiento de .MR& es posible. o I "Habilita la interrupcin por fin de escritura en la PR!M de datos# Direccin I=.C!=,(. Cuando este bit est a %'% la interrupcin cuando acaba la escritura en la PR!M de datos es posible.

o OI "Habilita las interrupciones globalmente# Direccin I=.C!=,:. ste bit permite -ue cual-uier interrupcin de las anteriores sea posible. Para usar alguna de las interrupciones anteriores ,ay -ue ,abilitarlas globalmente e indi$idualmente. $. Registros internos A,ora $amos con el banco ', solo un comentario antes de empe2ar0 Rrecuerdas la tabla de registros internos -ue $e/amos en el punto 8.8S $es -ue los registros del banco & y los del banco

' tienen direcciones distintas, en realidad podemos utili2ar las mismas direcciones para referirnos a registros -ue estn en uno u otro banco. l pic las diferenciar sin problemas gracias al bit de seleccin de banco "RP&#. Por eCemplo, la direccin &5, se refiere a P!R.A si estamos en el banco & y a .RISA si estamos en el banco 8. Sabiendo esto $amos con los registros del 9A=C! '0 I=D), Direccin &&,, Igual -ue en el 9anco & !P.I!=, Direccin &',, "configuracin del prescaler, .imer, y alguna cosa mas# Se estudia bit a bit o PS&, PS' y PS8 "9its del & al 8# Configuracin del preescaler0 l preescaler es un di$isor de pulsos -ue est a la entrada del .imerMcontador. l prescaler di$ide el nJmero de pulsos -ue le entran al timerMcontador o al Hac,tdog. l factor de di$isin es el siguiente "segJn los $alores de PS8, PS' y PS& respecti$amente.

o o PSA, Direccin !P.I!=,4. 9it de asignacin de prescaler0 si est a %'% el prescaler se asigna a HD. "Hac,tdog#, si est a %&% se asigna al .MR& o .!S , Direccin !P.I!=,+. 9it de seleccin del tipo de flanco para .MR&. A %'% se incrementa .MR& por flanco descendente de RA+, a %&% se incrementa .MR& por flanco ascendente de RA+. o .!CS, Direccin !P.I!=,5. Selecciona la entrada de reloC de .MR&. A %'% la entrada de reloC de .MR& es por flanco de la patilla RA+, a %&% la entrada de reloC de .MR& es por ciclo de reloC interno. o I=. DO, Direccin !P.I!=,(. .ipo de flanco para la interrupcin por R9&0 A %'% la interrupcin ser por flanco ascendente, a %&% la interrupcin ser por flanco decendente. o R9P>, direccin !P.I!=,:. Carga PullM>p en puerto 9. A %&% todas las salidas del puerto 9 tendrn una carga de pullM>p interna.

PC;, Direccin &8,, igual -ue en el banco & S.A.>S, Direccin &4,, Igual -ue en el banco & )SR, Direccin &+,, Igual -ue en el banco & .RISA, Direccin &5,, Configura el puerto A como entrada o salida. Si un bit de este registro se pone a %&% el pin correspondiente en el puerto A ser una salida, por el contrario, si se pone a %'% el pin correspondiente en el puerto A ser una entrada. .RIS9, Direccin &(,, Igual -ue el anterior pero con el puerto 9 Direccin &:,, =o usada en este pic C!=', Direccin &*,, Controla la lecturo y escritura en la estudia bit a bit0 PR!M de datos. Se

o RD, Direccin C!=',& "bit &# A %'% iniciamos el ciclo de lectura, cuando acaba el ciclo se pone a %&% el solito o HR, Direccin C!=',' "bit '# A %'% indicamos -ue comien2a el ciclo de escritura, cuando acaba el ciclo se pone a %&% Fl solito o HR =, Direccin %&% no se permite. C!=',8 "bit 8# si lo ponemos a %'% se permite la escritura, a

o HR RR, Direccin C!=',4 "bit 4# error de escritura, si est a %'% indica -ue no se ,a terminado el ciclo de escritura. o I), Direccin C!=',+ "bit +# interrupcin de ciclo de escritura de la PR!M, si est a %'% indica -ue el ciclo de escritura ,a terminado, ,ay -ue ponerlo a %&% por programa.

o 9its del 5 al : no se utili2an. C!=8, Direccin &Q,, Se utili2a para la escritura en la PR!M de datos como medida de seguridad0 para poder guardar algo en la PR!M ,ay -ue cargar el $alor 55, en este registro. PC;A.H, Direccin &A,, Igual -ue en el banco & I=.C!=, Direccin &9,, Igual -ue en el banco ' %. Instrucciones para el ensam&lador Podemos usar para escribir los programas el bloc de notas de HindoLs, una $e2 escrito se guarda con e1tensin .asm y se con$ierte "ensambla# con un programa ensamblador, el MPASM. l resultado es un arc,i$o con e1tensin .,e1 -ue podemos transferir al PIC'()*+.

.odo esto se e1plica mas detalladamente en Programador del PIC'()*+. 1isten una serie de instrucciones -ue son para el ensamblador y nos ,acen la tarea de programacin mas sencilla y mas legible. T>0 >n eCemplo de esto son las eti-uetas, podemos poner un nombre a un registro de memoria, esto se ,ace mediante la instruccin T>. Por eCemplo0 <ARIA9; ' T> &CH

A partir de a,ora en lugar de escribir &CH podemos escribir <ARIA9; ' Con T> tambiFn podemos poner nombre a constantes de la misma forma. UD )I= 0 !tra instruccin para el ensamblador -ue usaremos ser la instruccin UD )I= . s parecido a T>, solo -ue a-u/ no ponemos eti-uetas a un registro, podemos ponerla a una instruccin entera, Por eCemplo0 UD )I= UD )I= 9A=C!' 9A=C!& 9S) S.A.>S,5 9C) S.A.>S,5

A partir de a,ora, cuando escribamos 9A=C!' se pondr a %'% el bit de seleccin de banco y pasaremos al banco ', al escribir 9A=C!& pasaremos al banco & !RO0 Indica al ensamblador la direccin "de memoria de programa# donde se guardar la instruccin -ue $aya a continuacin. Por eCemplo0 !RO &&H C;R) <ARIA9; ' ;a instruccin C;R) est en la direccin de memoria de programa &&H "ser la primera instruccin en ser eCecutada por el pic# =D0 Se escribe al final del programa para indicar -ue ya ,a acabado. "es obligatorio, si no da error#. ti-uetas a direcciones de Programa0 muy Jtiles para usar con instrucciones CA;; ";lamada a subrutina# o O!.! "Salto#. Por eCemplo0 ......... VHay programa anteriorW ......... 9.)SC <ARIA9; ',& O!.! 9S) S>=! <ARIA9; ',&

XSi el bit & de <ARIA9; ' es X%&% se salta la siguiente Xinstruccin XSalta a S>=! solo si el bit & Xde <ARIA9; ' es %'% XSi el bit & de <ARIA9; ' es & Xse eCecuta esta instruccin y el

Xprograma sigue por a-u/ ............ VContinJa el programaW ............ S>=! 9C) <ARIA9; ',& X ti-ueta a una direccin de Xprograma XSi el bit & de <ARIA9; ' es X%'% se eCecuta esta otra Xinstruccin y el programa Xsigue por a-u/

...... VCuntinJa el programaW ...... 'n poco de orden( s importante lle$ar un poco de orden a la ,ora de escribir el programa, nos ayudar muc,o0 Al principio $an los T> y los UD )I= , despuFs comen2amos con el programa. l programa se escribe en cuatro columnas separadas por tabuladores0 o o o o n la primera columna se ponen las eti-uetas a direcciones de programa n la segunda columna se ponen las instrucciones "9S), C;R), 9.)SC... etc.# n la tercera columna se ponen ;os registros o parmetros a los -ue afecta la instruccin. n la cuarta columna se ponen los comentarios -ue creas pertinentes "cuantos mas meCor# seguidos de un punto y coma.

Cemplo de programa bien ordenado0 XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN XN l siguiente programa configura XN RA' como entrada y RA& como XN salida y ,ace -ue la salida "RA&# XN sea la in$ersa de la entrada XN "RA'# XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN X"Con$iene poner t/tulo y una Xpe-ueGa e1plicacin de lo -ue X,ace el programa# X"Primero los C> y los UD )I= # S.A.>S .RISA P!R.A UD )I= UD )I= T> &4H T> &5H T> &5H 9A=C!& 9C) S.A.>S,5 9A=C!' 9S) S.A.>S,5 N N N N N

X"DespuFs empe2amos con el programa# !RO 9A=C!' 9C) 9S) 9A=C!& I=ICI! O!.! 9S) O!.! S>=! O!.! =D &&H .RISA,& .RISA,' 9.)SC P!R.A,' S>=! P!R.A,& I=ICI! 9C) P!R.A,& I=ICI! X mpe2amos siempre a escribir en esta direccin XPasamos al banco ' para ,acer algunas Xconfiguraciones XConfiguramos RA& como salida XConfiguramos RA' como entrada X<ol$emos al banco & XComprueba la entrada "RA'#, si es %&% se salta la Xsiguiente instruccin Xsi la entrada "RA'# es %'% $a a S>=! XPone a %'% la salida RA&. Cecuta esta instruccin Xpor-ue la entrada RA' era %&% X<uel$e otra $e2 a comprobar el estado de la Xentrada RA' XPone a %&% la salida RA&. Cecuta esta instruccin Xpor-ue la entrada RA' era %'% X<uel$e otra $e2 a comprobar el estado de la Xentrada RA' XIndica final del programa

). *u&rutinas >na subrutina o subprograma es una parte de programa -ue ,ace algo concreto y se repite a menudo, para a,orrar memoria y esfuer2o y para ,acer el programa mas comprensible se agrupa en forma de subrutina. >na subrutina se debe eCecutar siempre llamndola con la instruccin CA;; y al final de dic,a subrutina debe ,aber siempre un R .>R=. l es-uema de la derec,a muestra como funcionan las subrutinas0 Durante el programa principal se llama $arias $eces a la subrutina S>9R "el nombre es lo de menos# con la instruccin CA;;. Cuando el pic eCecuta una instruccin CA;; se guarda en memoria la direccin de cdigo de programa a la -ue tiene -ue retornar de tal forma -ue cuando se encuentra con la instruccin R .>R= $uel$e al programa principal donde lo deC. >na subrutina no solo puede ser llamada desde el programa principal, tambiFn puede ,acerse desde otra subrutina "una subrutina -ue llama a

otra subrutina# o desde una interrupcin "enseguida las $eremos#. l siguiente eCemplo muestra un programa -ue utili2a una subrutina de retardo a la -ue llama D ;AI. sta subrutina de retardo se ,ace decrementando el registro C> =.A8 desde )), ,asta &&, '( $eces "las $eces -ue se decrementa C> =.A8 son contadas ,acia atrs por C> =.A'# De esta forma se consigue perder tiempo "el tiempo perdido con esta subrutina depende de la frecuencia a la -ue opere el pic# XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN XN ste programa configura R9& como salidaN XN y genera una intermitencia en dic,a N XN salida N XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN S.A.>S .RIS9 P!R.9 C> =.A' C> =.A8 ) L !RO 9S) 9C) 9C) I=ICI! CA;; 9C) CA;; O!.! T> T> T> T> T> T> T> &CH &DH ' & &4H &(H &(H X;as $ariables -ue usemos siempre a Xpartir de la direccin &C,

&&H S.A.>S,5 .RIS9,& S.A.>S,5 9S) .RIS9,& D ;AI .RIS9,& D ;AI I=ICI!

Xbanco ' XR9& como salida Xbanco & XPone a %'% R9& "enciende# X;lama a la subrutina de retardo XCuando $uel$e del retardo pone Xa %&% R9& "apaga# Xllama a la subrutina de retardo Xcuando $uel$e del retardo XeCecuta el O!.!

X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X@ D ;AI0 Subrutina de retardo @ X@ Modifica los siguientes registros0 @ X@ C> =.A' @ X@ C> =.A8 @ X@ AC>M>;AD!R @ X@ S.A.>S @ X"Con$iene ,acerse un pe-ueGo resumen de lo -ue X,ace cada subrutina, puede sernos muy Jtil para Xusarla en otros programas# D ;AI M!<;H &'&H XCarga el acumulador con el $alor X'&H "'( en decimal#

M!<H) ACA' M!<H) ACA O!.! D C)SK O!.! R .>R=

XMue$e el contenido del acumulador Xa C> =.A' M!<;H &))H XCarga el acumulador con el $alor ))H C> =.A8 XMue$e el contenido del acumulador Xa C> =.A8 D C)SK C> =.A8,) XDecrementa C> =.A8, guarda el resultado Xen f, y si es cero se salta la siguiente Xinstruccin ACA X$uel$e a decrementar mientras XC> =.A8 no sea cero C> =.A',) XSe decrementa C> =.A' cada $e2 -ue XC> =.A8 llega a cero ACA' Xmientras C> =.A' no llegue a cero recarga XC> =.A8 y repite el proceso Xretorna al programa principal

C> =.A'

X@ @ X@ )I= D ;A S>9R>.I=A D ;AI @ X@@@@@@@@@@@@@@@@@@@@@@@@@@@ =D +. Interrupciones Cuando se produce una interrupcin el pic deCa automticamente lo -ue estF ,aciendo, $a directo a la direccin &+, de programa y eCecuta lo -ue encuentre a partir de all/ ,asta encontrarse con la instruccin R .)I -ue le ,ar abandonar la interrupcin y $ol$er al lugar donde se encontraba antes de producirse dic,a interrupcin. Para -ue se pueda producir una interrupcin ,ay -ue ,abilitar las interrupciones globalmente y la interrupcin en concreto -ue -ueremos utili2ar "con el registro I=.C!=#. ste pic tiene + tipos de posibles interrupciones0 '. 8. 4. +. Por cambio en los bits R9+MR9: Por el estado de R9& Por desbordamiento del .imerMcontador Por fin de ciclo de escritura de la PR!M de datos X)in del programa

Mientras se est eCecutando una interrupcin no se puede producir otra interrupcin, el pic no lo permite. >na cosa importante a tener en cuenta al usar interrupciones es -ue cuando estas se producen podr/amos estar trabaCando con registros -ue pueden ser modificados en la propia interrupcin, como el acumulador o el S.A.>S. Para -ue la interrupcin no ec,e a perder el buen funcionamiento del programa principal con$iene guardar los $alores de estos registros en otras $ariables -ue no $ayamos a modificar. Antes de salir de la interrupcin $ol$emos a restaurar los $alores guardados y todo solucionado. l siguiente eCemplo muestra un programa -ue usa la interrupcin por cambio en el puerto 9 " n pines R9+ a R9:# XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN XN ste programa in$ierte el estado del pinN XN RA& cada $e2 -ue se modifica el estado N

XN de alguno de los pines R9+, R95, R9( o N XN R9:. Para ello ,abilita la interrupcin N XN por cambio de R9+MR9: N XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN S.A.>S T> &4H .RISA T> &5H P!R.A T> &5H .RIS9 T> &(H P!R.9 T> &(H I=.C!= T> &9H AC>M T> &CH S.A. T> &DH ) T> ' L T> & UD )I= 9A=C!& 9C) S.A.>S,5 UD )I= 9A=C!' 9S) S.A.>S,5

!RO &&H O!.! I=ICI!

Xponemos este O!.! al principio para poder poner Xel subprograma de las interrupciones a partir de Xla direccin &+,

XComien2a la interrupcin0 X@@@@@@@@@@@@@@@@@@@@@@@@@ !RO &+H 9C) I=.C!=,& X l pic salta a esta direccin cuando se produce Xuna interrupcin Xbit -ue indica un cambio en R9+MR9:, recuerda -ue X,ay -ue ponerlo a %&% por programa, este es el Xmomento Xcomen2amos guardando el contenido del acumulador Xy del S.A.>S para restaurarlos antes de salir de Xla interrupcin "es recomendable ,acer esto Xsiempre -ue se usen interrupciones# M!<H) AC>M M!<) S.A.>S,H 9A=C!& M!<H) S.A. XCopia el acumulador al registro AC>M XOuarda S.A.>S en el acumulador XPor si acaso, nunca se sabe en -ue parte de Xprograma principal salta la interrupcin XCopia el acumulador al registro S.A. XIn$ertimos el estado de RA&0 X@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9.)SC P!R.A,& O!.! S>=! 9S) P!R.A,& O!.! H CH! Xsi RA& es %&% salta la siguiente instruccin X$ete a S>=! XPon a %'% RA& "por-ue era %&%# Xya est in$ertido RA&, $ete a H CH!

S>=! 9C) P!R.A,&

XPon a %&% RA& "Por-ue era %'%#

XIa se ,a in$ertido el estado de RA& X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Xa,ora ,ay -ue restaurar los $alores del S.A.>S y Xdel acumulador antes de salir de la interrupcin0 H CH! M!<) S.A.,H M!<H) S.A.>S SHAP) AC>M,) SHAP) AC>M,H XOuarda el contenido de S.A. en el acumulador XRestaura el S.A.>S XDa la $uelta al registro AC>M X<uel$e a dar la $uelta al registro AC>M y restaura Xel acumulador "Con la instruccion SHAP) para no Xalterar el S.A.>S, la instruccin M!<) altera el Xbit 8 del S.A.>S# Xfin de la interrupcin X)in de la interrupcin X@@@@@@@@@@@@@@@@@@@@@@ I=ICI! 9A=C!' M!<;H &))H M!<H) .RIS9 9C) .RISA,& 9A=C!& XPasamos al banco ' X.odos los bits del acumulador a %'% Xconfiguramos todo el puerto 9 como entradas XRA& como salida X<ol$emos al banco &

R .)I

XConfiguracin de las interrupciones0 X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9S) I=.C!=,: 9S) I=.C!=,4 XHabilita las interrupciones globalmente XHabilita la interrupcin por cambio de puerto 9

X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Xya estn configuradas las interrupciones, a Xpartir de a,ora cuando ,aya un cambio en R9+MR9: Xsaltar la interrupcin "a la direccin &+, de Xprograma# =ADA O!.! =ADA X n este eCemplo no se ,ace nada en el programa Xprincipal, simplemente se espera a -ue salte la Xinterrupcin. ;a $erdadera utilidad de las Xinterrupciones es -ue se pueden ,acer %cosas% Xmientras sin preocuparse de la interrupcin X)I= D PR!ORAMA

=D ,. Timer - Contador T!R0

l registro .MR& puede contar ciclos de instruccin interna o pulsos de entrada por RA+ segJn el $alor del bit 5 del registro !P.I!= ".!CS#. Si este bit est a %'% .MR& cuenta pulsos por RA+ y se le llama ContadorX si el bit est a %&% cuenta ciclos de instruccin interna y se le llama .imer.

Cada ciclo de instruccin dura + $eces el ciclo del reloC del pic "para un reloC de +MH2 @@P Ciclo reloC@&,85 YSeg @@P Ciclo instruccin @ + ? &,85 @ 'YSeg# Cuando lo usamos como contador "Por RA+# podemos determinar si el incremento se ,ar por flanco ascendente o descendente con el bit + del registro !P.I!= ".!S # Podemos leer o escribir el registro .MR& en cual-uier momento. Cuando escribamos en Fl deCa de contar durante dos ciclos, cuando lo leamos no pasa nada. Podemos asignar el prescaler al .MR&, si ,acemos esto podemos elegir el factor en el -ue se $er di$idido el conteo mediante los bits del & al 8 del registro !P.I!= segJn la tabla del factor de di$isin. Por eCemplo, si elegimos un factor de di$isin de '68 tienen -ue entrar 8 pulsos para -ue .MR& se incremente en uno, si est a '6+ tienen -ue entrar +... etc. .ambiFn podemos utili2ar la interrupcin -ue se produce cuando se desborda el .MR&, es decir, cuando pasa de )), a &&,. "se configura desde el registro I=.C!=# l siguiente eCemplo usa la interrupcin por desbordamiento de .MR& para obtener una onda cuadrada a la salida R9&0

XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN XN ste programa crea una seGal cuadrada a N XN la salida R9&, para ello utili2a el .MR& N XN y la interrupcin por desbordamiento del N XN mismo. Se le asignar el prescaler con N XN un factor de di$isin de '68. De esta N XN forma las interrupciones saltarn a N XN inter$alos fiCos de tiempo. In$irtiendo N XN el estado de R9& durante las N XN interrupciones se conseguir una onda N XN cuadrada perfecta N XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !P.I!=R T> &'H XRegistro para configuracin del .MR& S.A.>S T> &4H .RIS9 T> &(H P!R.9 T> &(H I=.C!= T> &9H AC>M T> &CH S.A. T> &DH ) T> ' L T> & UD )I= 9A=C!& 9C) S.A.>S,5 UD )I= 9A=C!' 9S) S.A.>S,5 !RO &&H O!.! I=ICI! Xponemos este O!.! al principio para poder poner Xel subprograma de las interrupciones a partir de Xla direccin &+,

XComien2a la interrupcin0 X@@@@@@@@@@@@@@@@@@@@@@@@@ !RO &+H X l pic salta a esta direccin cuando se produce Xuna interrupcin 9C) I=.C!=,8 Xbit -ue indica desbordamiento de .MR&, recuerda X-ue ,ay -ue ponerlo a %&% por programa, este es Xel momento Xcomen2amos guardando el contenido del acumulador Xy del S.A.>S para restaurarlos antes de salir de Xla interrupcin "es recomendable ,acer esto Xsiempre -ue se usen interrupciones# M!<H) AC>M M!<) S.A.>S,H 9A=C!& M!<H) S.A. XCopia el acumulador al registro AC>M XOuarda S.A.>S en el acumulador XPor si acaso, nunca se sabe en -ue parte de Xprograma principal salta la interrupcin XCopia el acumulador al registro S.A.

XPara generar una onda cuadrada In$ertimos el Xestado de R9& cada $e2 -ue salta una interrupcin X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9.)SC P!R.9,& O!.! S>=! 9S) P!R.9,& O!.! H CH! Xsi R9& es %&% salta la siguiente instruccin X$ete a S>=! XPon a %'% R9& "por-ue era %&%# Xya est in$ertido R9&, $ete a H CH!

S>=! 9C) P!R.9,& XPon a %&% RA& "Por-ue era %'%# XIa se ,a in$ertido el estado de R9& X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Xa,ora ,ay -ue restaurar los $alores del S.A.>S y Xdel acumulador antes de salir de la interrupcin0 H CH! M!<) S.A.,H XOuarda el contenido de S.A. en el acumulador M!<H) S.A.>S XRestaura el S.A.>S SHAP) AC>M,) XDa la $uelta al registro AC>M SHAP) AC>M,H X<uel$e a dar la $uelta al registro AC>M y restaura Xel acumulador "Con la instruccion SHAP) para no Xalterar el S.A.>S, la instruccin M!<) altera el Xbit 8 del S.A.>S# R .)I Xfin de la interrupcin X)in de la interrupcin X@@@@@@@@@@@@@@@@@@@@@@ I=ICI! 9A=C!' 9C) .RIS9,& 9C) !P.I!=R,4 9C) !P.I!=R,& 9C) !P.I!=R,' 9C) !P.I!=R,8 XPasamos al banco ' XR9& como salida XAsignamos el preescaler a .MR& XZ X [Prescaler a '68 X6

9C) !P.I!=R,5 9A=C!&

X ntrada de .MR& por ciclo de Xinstruccin interna "se pone a contar# X<ol$emos al banco &

XConfiguracin de las interrupciones0 X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9S) I=.C!=,: 9S) I=.C!=,5 XHabilita las interrupciones globalmente XHabilita la interrupcin por desbordamiento de .MR&

X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Xya estn configuradas las interrupciones, a Xpartir de a,ora cuando cuando se desborde .MR& Xsaltar la interrupcin "a la direccin &+, de Xprograma#

=ADA O!.! =ADA

X n este eCemplo no se ,ace nada en el programa Xprincipal, simplemente se espera a -ue salte la Xinterrupcin. ;a $erdadera utilidad de las Xinterrupciones es -ue se pueden ,acer %cosas% Xmientras sin preocuparse de las interrupciones X)I= D PR!ORAMA

=D

10. ulsadores e interruptores .re&otes/ s muy normal usar pulsadores o interruptores en alguna de las entradas del pic para controlarlo. stos pulsadores no ,acen una cone1in perfecta e instantnea como podemos pensar0 un pulsador se compone de dos partes de metal -ue entran en contacto "c,oca una con la otra# al accionarlo. ste c,o-ue genera unos pe-ueG/simos rebotes -ue suceden tan rpido -ue son imperceptibles para nosotros, Sin embargo, no lo son para el PIC -ue trabaCa a esas $elocidades. sto es un problema muy comJn -ue puede $ol$ernos locos si no lo conocemos pero -ue resol$ers sin problemas cuando acabes de leer esta pgina. l siguiente diagrama muestra lo -ue pasar/a al accionar un pulsador0

;a solucin es sencilla, basta con aGadir un pe-ueGo retardo en nuestro programa desde -ue se detecta el primer pulso ,asta -ue se $uel$e a leer la entrada del pulsador. Dic,o retardo debe ser suficientemente largo para asegurar -ue cuando finalice ya se ,ayan e1tinguido los rebotes, pero tambiFn suficientemente corto para -ue sea imperceptible para nosotros. n el siguiente eCemplo se cuentan los pulsos introducidos al PIC por R9&. siguiente0 l es-uema es el

)/Cate -ue cuando se acciona el pulsador la entrada R9& se pone a %&%. Para e$itar contar los rebotes se llama a una subrutina de retardo llamada R 9!. , esta subrutina funciona bien para osciladores de +MH2. XNNNNNNNNNNNNNNNNNNNNNNNNNNNN XN l siguiente programa cuenta las N XN $eces -ue se acciona un pulsador N XN conectado a R9& y Pre$iene los N XN rebotes del mismo mediante la N XN subrutina de retardo R 9!. N XNNNNNNNNNNNNNNNNNNNNNNNNNNNN

S.A.>S .RIS9 P!R.9 C> =.A R .ARD! ) L UD )I= UD )I=

T> T> T>

&4H &5H &5H XRegistro donde contaremos XRegistro para el retardo

T> &CH T> &DH T> T> ' &

9A=C!& 9C) S.A.>S,5 9A=C!' 9S) S.A.>S,5

!RO &&H 9A=C!' 9S) .RIS9,&

XPasamos al banco ' XConfiguramos R9& como ntrada

9A=C!& C;R) C> =.A I=ICI! 9.)SS P!R.9,& CA;; S>MA' O!.! I=ICI!

X<ol$emos al banco & XPone a cero la cuenta Xsi R9& es %'% salta la siguiente instruccin X;lama a la subrutina S>MA' "por-ue R9& es %&% y, Xpor lo tanto, se ,a accionado el pulsador# X$uel$e a I=ICI!

X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X S>MA'0 Subrutina -ue suma uno al registro X C> =.A y espera a -ue se suelte el X pulsador conectado a R9&. .iene en X cuenta los rebotes S>MA' I=C) C> =.A,) CA;; R 9!. SP RA 9.)SS P!R.9,& O!.! SP RA R .>R= XIncrementa el registro C> =.A X;lama a la subrutina -ue pre$iene los rebotes XZ X [ spera a -ue se suele el pulsador para retornar X6

X )in de S>MA' X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X R 9!. 0 Subrutina -ue ,ace una pe-ueGa X tempori2acin para pre$enir X los rebotes R 9!. M!<;H &))H M!<H) R .ARD! R 9! D C)SK R .ARD!,) O!.! R 9! R .>R= XCarga el acumulador con &)), XMue$e el contenido del acumulador a R .ARD! XZ X [=o retorna ,asta -ue R .ARD! llega a cero X6

X )in de R 9!. X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ =D XIndica final del programa

11. Ta&las con la instruccin RETL0 s muy comJn utili2ar la instruccin R .;H para la creacin de tablas de $alores. sta instruccin de$uel$e un $alor en el acumulador al retornar de una subrutina, la usaremos conCuntamente con el registro PC; "ec,ale un $ista2o si no lo recuerdas#. ;a creacin de la tabla se ,ar de la siguiente forma0 .A9;A <A;!R S M!<H) R .;H R .;H R .;H PC; <A;!R& <A;!R' <A;!R8

R .;H ....

<A;!R4

Donde <A;!R&, <A;!R', <A;!R8... etc. son los $alores -ue -ueremos almacenar en la tabla. ;a estrategia a seguir para consultar algJn $alor de la tabla es cargar en el acumulador la direccin de memoria de programa donde se encunetra el $alor -ue -uieres leer y despuFs llamar a la subrutina .A9;A "con un CA;;#. I te estars preguntando como se en -ue direccin esta cada $alor, pues bien, el <A;!R& est en la direccin <A;!R S "es la eti-ueta -ue ,emos puesto a esa direccin#, el <A;!R' est en la direccin <A;!R S7', <A;!R8 est en la direccin <A;!R S78... etc. I como no ,ay como un eCemplo para $er las cosas mas claras a,/ $a uno0 l siguiente eCemplo cuenta las $eces -ue se acciona un pulsador conectado en RA& y muestra el $alor del conteo en un display de : segmentos de nodo comJn conectado al puerto 9. ;a tabla contiene los $alores necesarios para iluminar el display con cada nJmero del & al Q. A continuacin se muestran el es-uema y el programa0

XNNNNNNNNNNNNNNNNNNNNNNNNNNNN XN l siguiente programa cuenta las N XN $eces -ue se acciona un pulsador N XN conectado a RA& y muestra el N XN resultado de la cuenta en un N XN display de : segmentos de nodo N XN comJn conectado en el puerto 9 N XNNNNNNNNNNNNNNNNNNNNNNNNNNNN PC; S.A.>S .RISA P!R.A .RIS9 P!R.9 T> T> T> T> T> T> &8H &4H &5H &5H &(H &(H

C> =.A T> &CH R .ARD! T> &DH ) L UD )I= UD )I= !RO O!.! .A9;A T> T> ' &

XRegistro donde contaremos XRegistro para el retardo

9A=C!& 9C) S.A.>S,5 9A=C!' 9S) S.A.>S,5 &&H I=ICI! M!<H) PC; XDeCamos sitio a continuacin para escribir Xnuestra tabla Xcargamos el $alor del acumulador en el registro XPC;. Cuando se eCecute esta instruccin el pic Xsaltar inmediatamente a la direccin de programa X-ue le ,ayamos metido. Xen esta tabla almacenaremos los $alores -ue ,ay X-ue sacar por el puerto para -ue se muestren en Xel display los nJmeros del & al Q0 XPara mostrar el & XPara mostrar el ' XPara mostrar el 8 XPara mostrar el 4 XPara mostrar el + XPara mostrar el 5 XPara mostrar el ( XPara mostrar el : XPara mostrar el * XPara mostrar el Q XPasamos al banco ' XConfiguramos RA& como ntrada XConfiguramos el puerto 9 como salidas X<ol$emos al banco & XPone a cero la cuenta XCarga en el acumulador la direccin donde Xse encuentra el primer $alor de la tabla X;e suma el $alor de la cuenta para obtener Xla direccin del $alor -ue nos interesa X;lama a la subrutina .A9;A -ue nos de$ol$er Xel $alor correspondiente de la tabla Xen el acumulador. XSaca dic,o $alor por el puerto 9 -ue ,ar -ue se Xmuestre en el display el nJmero correspondiente Xsi RA& es %'% salta la siguiente Xinstruccin "si no se acciona el pulsador# X;lama a la subrutina S>MA' "por-ue R9& es %&% y, Xpor lo tanto, se ,a accionado el pulsador#

DISP R .;H R .;H :QH R .;H 8+H R .;H 4&H R .;H 'QH R .;H '8H R .;H &8H R .;H :*H R .;H &&H R .;H '&H

+&H

I=ICI! 9A=C!' 9S) .RISA,& C;R) .RIS9 9A=C!& C;R) C> =.A M> S.RA M!<;H DISP ADD;H C> =.A CA;; .A9;A M!<H) P!R.9 9.)SS P!R.A,& CA;; S>MA' O!.! M> S.RA

X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X S>MA'0 Subrutina -ue suma uno al registro X C> =.A. Solo cuenta pulsaciones entre X & y Q "ya -ue no se pueden mostrar mas X nJmeros en un display de : segmentos#. X DespuFs espera a -ue se suelte el pulsador X conectado a RA& S>MA' I=C) C> =.A,) XIncrementa el registro C> =.A Xa continuacin se mira si el registro XC> =.A ,a llegado a &AH, en tal caso se Xpone a cero para comen2ar de nue$o. M!<;H &AH S>9H) C> =.A,H 9.)SC S.A.>S,8 C;R) C> =.A XCarga &AH en el acumulador X;e resta C> =.A al acumulador Xmira si el resultado ,a sido Xcero "de serlo C> =.A ser/a igual a &AH# Xsi C> =.A es &AH la pone a cero XA continuacin espera a -ue se suelte el pulsador X"pre$iene los rebotes# CA;; R 9!. SP RA 9.)SS P!R.A,& O!.! SP RA R .>R= X6 X;lama a la subrutina -ue pre$iene los rebotes XZ X spera a -ue se suelte el pulsador para retornar

X )in de S>MA' X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ X R 9!. 0 Subrutina -ue ,ace una pe-ueGa X tempori2acin para pre$enir X los rebotes R 9!. M!<;H &))H M!<H) R .ARD! R 9! D C)SK R .ARD!,) O!.! R 9! R .>R= X6 XCarga el acumulador con &)), XMue$e el contenido del acumulador a R .ARD! XZ X [=o retorna ,asta -ue R .ARD! llega a cero

X )in de R 9!. X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ =D XIndica final del programa

Vous aimerez peut-être aussi