Professional Documents
Culture Documents
realiza el CP o un
paso que realiza el CP. A diferencia de otros lenguajes, como por ejemplo el C, una lnea de instruccin, puede llevar uno
o mas pasos que el CP debe realizar. Ms adelante entendern el porqu.
A esto ltimo dicho, nos explica el porqu de un programa escrito en ASM (assembler) lleva menos lnea de instruccin
que el mismo programa realizado en otro lenguaje. Esto se traduce que, cuanto menos lneas de cdigo, menor consumo
de la memoria de programa.
Nota: Entendemos por el mismo cdigo, al realizar un software para realizar una dicha tarea. Una tarea que debe realizar
nuestro microcontrolador, puede ser escrito en diferentes lenguajes, y es el programa que se utiliz quien lo traduce a
formato hex (1 y 0).
Ahora, Qu es el CP?
El CP o PC es el Contador de Programa. Es el encargado de leer cada instruccin y realizar la accin solicitada por el
software.
Para dar un ejemplo un poco ms claro, digamos que el CP, es una persona. Esta persona se le da un papel que tiene
diferentes tareas a realizar. Estas tareas, estn una debajo de la otra y lee lnea por lnea y hace lo que le dice esa lnea.
Cada lnea, posee una instruccin que se debe hacer. Cuando termin de hacer esa instruccin, continua con la lnea de
abajo.
El CP, har esas tareas sin negarce y lo har fielmente a lo que est escrito. Por lo que, si hace una tarea mal, es porque le
pusimos una o ms instrucciones mal.
Si bien, el CP har lo que nosotros le pidamos, el CP nos pide que respetemos algunas cosas. Estas cosas, dependern de
cada microcontrolador y que debemos saber para poder programar en forma correcta al PIC.
* La primer columna se llama ETIQUETA y sirve para darle el nombre a una pocicin de la memoria del programa al
que se necesita apuntar. Los que no se den cuenta, ya lo haran.
* La segunda columna, se llama INSTRUCCIN y lo que justamente hace, es una instruccin a realizar por el CP.
* La tercera columna, se llama OPERANDO y es el operando de una instruccin, o sea, de la segunda columna. Hay
instrucciones que no tienen operando y las veremos ms adelante.
* Y la cuarta columna, se llama OBSERVACIONES y sirve solo para el programador, o sea, el usuario que est
programando el PIC. En otras palabras, a nosotros. Siempre comienza con ; (punto y coma)
Si no sirve para el PIC, Para qu complicarla ms? Todo lo contrario, es para alludar al programador de que no se olvide
que intent hacer.
Todos los lenguajes, desde los ms bsicos, hasta los ms avanzados, tienen esta caractersticas ya que en el, pondremos
que es lo que queremos hacer o explicar el programa.
Si bien, estas observaciones se utilizan en la cuarta columna, no es obligacin colocarla en esta columna, si no que puede
ir al margen de la planilla en dnde estamos programando. Y es aqu dnde explicaremos la porcin de una rutina para
entenderlo ms adelante.
;OBSERVACIONES
;OBSERVACIONES
;OBSERVACIONES (y la cantidad que necesitemos)
Los registros, son pociciones de memoria el cual se utilizan para ir configurando el pic mientras se corre el programa,
cambiar de bancos para acceder a otras partes de memorias, son banderas que nos van diciendo que est pasando con
distintas operaciones, son habilitaciones o desabilitaciones para mdulos que trae el PIC. Por ejemplo, conversor
Analgico/Digital, PWM.
Estos registros, tienen una ancho de bit de acuerdo al PIC, que hay de 8 bit, 16 bit y 32 bit. Excepto la palabra
configuracin y que la veremos mas adelante. El tamao de los registro depende del tipo de microcontrolador.
Cada registro, posee un nombre, y cada bit o un grupo de bit, se puede utilizar para lo descripto anteriormente
(habilitar/desabilitar, etc).
A continuacin, veremos una pocicin de la RAM y sus 4 bancos. Este, es del PIC16F877
Como notarn, en las cuatro columnas, hay nombres. Estos nombres son todos los registros que posee este PIC. Vern que
hay registros que se repiten. No quiere decir que estan duplicados, triplicados o cuatriplicados, si no que se puede acceder
a ellos no importa en que banco estemos trabajando. (Ya lo entendern, no se preocupen).
Cada vez que se programe el PIC y se necesite trabajar con uno de estos registros, se debe acceder al banco que est dicho
nombre. Es por eso, que esta tabla es muy importante a la hora de trabajar.
Aprovechando que sub esta tabla del pic, cuando dea ejemplo de programacin, ser sobre este pic.
Microchip provee en forma gratuita estos datasheet. Y hay uno por cada PIC. Por lo que si no tienen este datasheet,
descargenlo de la pgina de Microchip. Cuando empezemos a programar, lo necesitarn.
Uno de los registros muy utilizado, es el registro de trabajo W, el cual, se utiliza para mover un dato/valor de un registro a
otro, cargar valores en un registro, y con la ayuda de la ALU puede hacer operaciones matemticas.
El registro W no est implementado en la memoria ram, ni en la posicin 0x00 ni en otra posicin. W es un registro
independiente que tiene un bus directo con la ALU (un camino privado). La ALU es la nica entidad que puede leer o
escribir este registro de trabajo.
El direccionamiento indirecto hace uso de los registros FSR e INDF. INDF es completamente ajeno a W. Un
direccionamiento indirecto usa el registro FSR como apuntador al contenido de otros registros. Cualquier instruccin que
hace uso de INDF (0x00) como direccin invoca un direccionamiento indirecto.
* Memoria de Programa
Es la ubicacin fsica dnde se guarda el firmware que hemos creado, o sea, nuestro programa. Y tiene un ciclo
de 100.000 de lectura y/o escrituras antes de estropearce y es del tipo FLASH (pero este es flaco Es un chiste).
El PIC 16F877, tiene una memoria de programa de 8Kb por un ancho de 14 Bits, o sea que cada pocicin de memoria
tiene 14 bit (B'11111111111111', o H'3FFF') Cada lnea de instruccin ocupa una pocicin en la memoria de programa, asi
que, podemos poner hasta 8.192 instrucciones.
La RAM de uso general (mas los registros) trae 368 bytes con un ancho de 8 bit (B'11111111', o H'FF'). Esto quiere decir,
que tenemos 368 pociciones para nuestro uso.
La EEPROM trae 256 bytes con un ancho de 8 bits. Tenemos 256 pociciones para nuestro uso.
Registro STATUS
Si entendieron hasta ac, se acordar que los registros poseen un ancho de 8 bit. Cada bit, puede contener un 1 o 0.
Este registro, tiene 3 Bit dedicado para las operaciones matemticas, 3 bit dedicado al cambio de banco de memoria y 2
bit dedicado para saber que o quin produjo un Power Up (despertar del micro). Y se puede leer y escribrir en l (cambiar
datos).
BIT 7:
Se llama IRP y sirve para el direccionamiento indirecto para cambiar el banco de memoria.
1 = Banco 2 y 3
0 = Banco 0 y 1
BIT 6 y BIT 5
Se llaman RP1 y RP0 respectivamente. Sirve para el direccionamiento directo para cambiar de banco de memoria.
00 = Banco 0
01 = Banco 1
10 = Banco 2
11 = banco 3
BIT 4
Se llama TO (neg). Este bit se utiliza para saber quin despert al PIC.
1 = Despus que despierta (power up) o por las instrucciones CLRWDT o SLEEP, se pone a 1 este bit.
0 = Se pone a 0 cuando el wachtdog o en castellano perro guardan (WDT) despierta al PIC.
BIT 3
Se llama PD (neg). Este bit se utiliza para saber si el pic estaba durmiendo.
BIT 2
Se llama Z y al igual que los dos bytes anteriores, es una bandera. Nos indica el resultado de una operacin aritmtica y
lgica.
BIT 1
Se llama DC. Digit carry/borrow (dgito llevar/prestar). Es afectado por las instrucciones ADDWF; ADDLW; SUBLW;
SUBWF (Para la resta, la polaridad es inversa).
BIT 0
Se llama C carry/borrow. Es afectado por las instrucciones ADDWF; ADDLW; SUBLW; SUBWF (Para la resta, la
polaridad es inversa).
1 = Hubo un acarreo del bit ms significativo (Bit 7) o sea cuando se exede de H'FF'
0 = No hubo acarreo del bit ms significativo
Cada instruccin tiene una ancho de 14 Bits, es por eso que la memoria de programa tiene el mismo ancho. Justamente
para poder alojar cada instruccin.
OPCODE (Cdigo)
DESTINATION (Destino)
El OPCODE o cdigo, es el cdigo de cada instruccin y que es nica para cada instruccin. Est formada por los bit del
13 al 8.
El DESTINATION o el destino, indica en dnde se va a guardar el dato.Por ejemplo, si hacemos una suma, tenemos dos
opciones dnde guardarlo, una puede ser el registro W y la otra opcin puede ser otro registro cualquiera o una pocicin
de la RAM. Est formada por el bit 7.
La constante que nos indica esto es la letra d. Si esta letra es 0, la operacin se guardar en el registro W. EN cambio si
vale 1, la operacin se guardar en el registro o pocicin de memoria que estemos trabajando al momento de usar una
instruccin.
Hay instrucciones, como veremos ms adelante, que no es necesario indicar dnde queremos guardar la operacin, ya que
se hace en forma automtica. Y hay otras instrucciones que si no se indica el destino, nos puede dar un error al compilar o
el compilador lo eligir el y por ende, nos puede ejecutar mal el programa.
Y por ltimo, tenemos el FILE REGISTER ADDRESS que se carga con la direccin del registro a ser guardado. Est
formada por los bit 6 al 0. La constante que nos indica esto, es la letra f
OPCODE (Cdigo)
OPCODE es igual al primer grupo. Est formado por los bits 13 al 10.
El BIT ADDRESS, se utiliza para direccionar la operacin. Est formado por los bits 9 al 7. Como pueden observar, se
sacrific bit del opcode para drcelo al bit address. La constante que nos indica esto es la letra b
Y por ltimo tenemos FILE REGISTER ADDRESS, que es igual al primer grupo. Est formado por los bit 6 al 0. Igual
que en el primer grupo. la constante que nos indica esto es la letra f.
OPCODE
LITERAL
OPCODE es igual que en el primer grupo. Est compuesta por los bits 13 al 8. Exepto para las instrucciones CALL y
GOTO que est compuesta por los bit 13 al 11 (prestar mucha atencin a esto, cuando veamos estas dos instrucciones
entendern la importancia).
Y el LITERAL que puede ser un valor, por ejemplo para sumar, para restar, para cargar al registro W, en fin, un nmero
decimal, binario o hexadecimal. O puede ser una valor de direccin a dnde apuntar para las instrucciones CALL y
GOTO.
Est compuesta por los bits 7 al 0. Exepto para las instrucciones CALL y GOTO que est compuesta por los bit 10 al 0
(prestar mucha atencin a esto, cuando veamos estas dos instrucciones entendern la importancia).
Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro STATUS y otras no.
Tambien es importante saber que se puede escribir o que no en cada una de ellas asi como tener un cierto estandar de
como escribir cada una
Etiequetas: Estas pueden iniciar con letra (minuscula o mayuscula) y despues pueden incluir numeros y ciertos caracteres
como -, _ y al final pueden cerrar con dos puntos ( : )
Yo en lo personal las etiquetas las inicio enmayuscula y de ahi pura minuscula sobre todo apra diferenciarlas a primera
vista de los operandos como ADCON y demas que deben ser escritos en mayusculas (Bueno en sus librerias estan en
mayusculas)
La instruccion se peude escribir como a uno se le antoje, pero es bueno mantener un estadanr (o mayusculas o minusculas)
el operando si lo tienes limitado y observaciones haz lo que quieras (omite caracteres fuere de ASCII como o letras
acentuadas)
Las instrucciones
Les voy a arruinar el momento de alegra. Las instrucciones hay que estudiarlas de memoria. Si, leyeron bien,
de memoria. Lo que tienen que saber sobre las instrucciones, es como se escriben, que hace cada instruccin y lo ms
importante que bit del REGISTROafecta.
Vamos a ir vindolo por orden alfabtico. Y otra cosita ms, como es de esperarce, estn en INGLES o son abreviaturas
pero en INGLES.
Recordemos que: .123 o D'123' es en decimal; 0x7B o 7Bh o H'7B' es en Hexadecimal; B'01111011' es en binario.
ADDLW
Ejemplo
Cdigo:
ADDLW .128
Si W tena cargado un valor = .5, despus de la instruccin W tiene cargado el valor .133
Afecta a:
Z Se pone a 1 si la operacin es 0
ADDWF
Suma el valor del registro W con el valor de un registro cualquiera. El destino de esta suma, lo elige el programador.
Ejemplo:
Cdigo:
ADDWF TEMP,W
Si W tena guardado .133 y la pocicin de la RAM llamada TEMP tena el valor cargado con .2, W vale .135 y TEMP
contina valiendo .2
Cdigo:
ADDWF TEMP,F
NOTA: Para indicar la direccin de dnde se guarda, tambin se puede poner 0 o 1 en vez de W o F. 0, corresponder
guardarlo en el registro W y 1 en el registro TEMP (para este caso).
Afecta a:
Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
ANDWF
Realiza la operacin AND entre W y un registro designado por el programador. El destino de esta operacin lo elije el
programador.
Ejemplo:
Cdigo:
ANDWF TEMP,F
Si antes de la instruccin W vale B'11100011' y TEMP vale B'00111010' Despus de la instruccin TEMP vale
B'00100010' y W vale B'11100011'
Afecta a:
Z Se pone a 1 si la operacin es 0
BCF
Ejemplo:
Cdigo:
BCF TEMP,2
Antes de la instruccin TEMP vale B'11111111'. Despus de la instruccin TEMP vale B'11111011'
BSF
Ejemplo:
Cdigo:
BSF TEMP,0
Antes de la instruccin TEMP vale B'01110110'. Despus de la instruccin TEMP vale B'01110111'
BTFSC
Salta un lnea si el bit de un registro es cero. El bit debe ser indicado por el programador.
Ejemplo:
Cdigo:
BTFSC TEMP,5
BCF PORTA,0
BSF PORTB,0
Caso 1:
TEMP vale B'00011110'. El CP analizar solo el Bit 5 del registro TEMP, como es 0, salta la instruccin BCF
PORTA,0 y ejecuta la siguiente lnea que es BSF PORTB,0 y continua haciendo la instruccin.
Caso 2:
TEMP vale B'00111000'. El CP analizar solo el Bit 5 del registro TEMP, como es 1 no salta la instruccin y
har la instruccin BCF PORTA,0 y luego continua con la instruccin BSF PORTB,0
BTFSS
Salta una lnea si el bit de un registro es 1. EL bit debe ser indicado por el programador.
Ejemplo:
Cdigo:
BTFSS TEMP,3
ADDWF PORTC
ANDWF NODO
Caso 1:
TEMP vale B'01101100'. El CP analizar solo el Bit 3 del registro TEMP, como es 1, salta la instruccin ADD
PORTC y ejecuta la siguiente lnea que es ANDWF NODO y continua haciendo la instruccin.
Caso 2:
TEMP vale B'11110000'. El CP analizar solo el Bit 3 del registro TEMP, como es 0 no salta la instruccin y
har la instruccin ADD PORTC y luego continua con la instruccin AND NODO.
Normalmente, continuando las instrucciones BTFSS y/o BTFSC va un GOTO o CALL pero no la he puesto
porque an no se explicaron estas instrucciones.
CALL
Se digire a una direccin de la memoria de programa designado por el programador. En otras palabras, se utiliza
para dirigirce a una rutina o tarea. Su principal ventaja es que una vez que finaliz la tarea, vuelve al punto
siguiente desde dnde se llamo.
Ejemplo :
Cdigo:
CALL ESC_PORTB
Para recordar, CALL es llamada.
---------------------------------------------------------------------------------------------------------------------------------------
------
Hacemos una exepcin con respecto a ver las instrucciones por orden alfabtico y veremos la instruccin
GOTO.
---------------------------------------------------------------------------------------------------------------------------------------
------
GOTO
Se digire a una direccin de la memoria de programa designado por el programador. En otras palabras, se utiliza
para saltar instrucciones que no queremos que se ejecuten. A diferencia de la instruccin CALL, no hay forma
de volver cuando se ejecuta la instruccin.
Ejemplo:
Cdigo:
GOTO INICIO
Para recordar GO TO es ir a.
Extendiendo la explicacin.
Vamos a hablar del PC para entender bien sobre estas instrucciones. La exelente explicacin que continua, por
desgracia no es ma (ojal fuera mi explicacin), son de las personas Maunix y BrunoF (del foro todopic)
El PC es de 13 bits en este caso(8kwords). 14 son los bits de cada "word" o instruccin que se graban en cada
posicin de la FLASH (memeria de programa).
El PC se reparte en: sus 8 bits de menor peso en el registro PCL, y los 5 restantes en el registro PCLATH.
Los pics al tener un set de instrucciones reducido no puede en una sola instruccin meter todos los bits
necesarios para direccionar toda su memoria.
EL program counter son 2 registros, el PChigh y PCLow . Cuando haces un CALL o un GOTO, solo se rellenan
11 bits (los 8 del PClow y 3 del PChigh) y los restantes 2 los rellenas con el PCLATH (para completar los
13bits).
El STACK (pila) tiene toda la direccin, no solo parcial. Si haces un call desde la pagina 0 a la pgina 3 y
luego un return el cdigo SI volver a la pgina 0, pero el PCLATH sigue apuntando a la pgina 3, entonces si
usas otro goto o call, debes tener en cuenta de modificar el PCLATH.
En un return o retfie la microelectronica del PIC, pega la direccin del PC que estaba guardada.
1.
STACK = vaco
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230
4. Viene un RETURN.
La microelectrnica del PIC copiar el stack tal cual en el program counter + 1
Valor STACK 0x00A0 + 1 --> PC = 0x00A1
5. EL cdigo sigue ejecutandose en la pgina 0 pero hay que tener en cuenta que el PCLATH apunta a la pgina
3 por ello si hars otro CALL o GOTO, debers cambiar de nuevo el PCLATH si la subrutina no est en la
pgina 3.
Vamos a entrar a todo detalle en el Program Counter(PC) para que se vayan todas las dudas ya que es muy
importante. Vayamos al tema tema del PC, computed goto(lo que algunos llaman "tabla"), call, returns y goto.
El Program Counter(PC) est conformado en esta familia de uC(y refiriendonos a la familia 16F, las otras
poseen ms o menos bits implementados) por 13 bits repartidos entre dos registros: PCH y PCL.
El PCL es legible/escribible directamente a traves del registro fsico PCL(valga la redundancia). En cambio, el
PCH no es directamente accesible. No puede ser ledo, y slo puede se grabado mediante un buffer que contiene
el valor temporalmente(oh! aqu aparece nuestro famoso PCLATH). Entonces, recordar: El PCLATH es slo un
buffer temporal que almacena los 5 bits de mayor peso del PC para ser escritos cuando se ejecute una
instruccin que lo requiera.
Ahora, hay dos situaciones posibles en las que el PC debe ser cargado de manera distnta: una es cuando
queremos trabajar con tablas y otra cuando realizamos un call o un goto que no est en el msmo banco.
La tabla es una situacin de uso del PC en la que se afecta directamente al registro PCL. Cuando se afecte
directamente al PCL mediante una instruccin, es necesario que el usuario asegure que PCLATH tenga sus 5
bits pre-cargados adecuadamente.
Hago un ejemplo:
Mal:
org 0x000
movlw 0x01
call tabla
org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....
Bien:
org 0x000
movlw 0x03
movwf PCLATH
movlw 0x01
call tabla
org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....
Mejor:
org 0x000
pageselw tabla
movlw 0x01
call tabla
org 0x300
tabla
addwf PCL,F
retlw 0x03
retlw 0x01
retlw 0x0F
.....
Pageselw es una instruccin del MPASM que genera dos instrucciones: un movlw literal y un movwf PCLATH.
El valor del literal es automticamente seleccionado por el ensamblador segn la etiqueta(o posicin de
memoria) que se le especifique. En el caso anterior pageselw tabla generara estas dos instrucciones:
movlw 0x03
movwf PCLATH
Si no aseguramos que los 5 bits del PCLATH estn correctamente seteados al momento de afectar al PCL
mediante alguna instruccin(generalmente es la addwf, pero puede usarse subwf y muchas otras) entonces el
programa saltar a una posicin indeseada.
2da situacin: CALL y GOTO
En esta familia de uC, cada instruccin es codificada en 14 bits. En el caso de las instrucciones CALL y GOTO,
su estructura es la siguiente:
F2 F1 F0 K10 K9 K8 K7 K6 K5 K4 K3 K2 K1 K0
Donde las F indican cul instruccin es la que debe ejecutarse(100 para la CALL 101 para la GOTO), y las k
corresponden a la direccin a la cual queremos llamar(con un CALL) o saltar(con un GOTO).
Aqu se ve claramente un problema. Podemos ver que un CALL o un GOTO slo almacena 11 bits de la
direccin a la cual debe ir. 11 bits es un mximo 2048 posiciones. Qu pasa cuando un uC posee ms de 2k de
memoria Flash entonces? Por ejemplo, un 16F877A posee 8k de memoria Flash. Cmo hara para llamar a una
subrutina que est ms all de la posicin 2047 de la flash?
La solucin nuevamente se encuentra en el PCLATH(y es nuevamente el usuario el que tiene el deber de pre-
cargar el valor adecuado).
Entonces, dijimos que el PC contiene 13 bits de longitud. 13 bits son hasta 8kwords(una word es en esta familia
un conjunto de 14 bits que conforman una instruccin la cual se aloja en la memoria FLASH del uC). Un CALL
o un GOTO slo contienen los 11 bits de menor peso de la direccin a la cual ir, por lo que los 2 bits restantes
debern ser pre-cargados en los bits 4 y 3 del registro PCLATH por el usuario programador.
Cuando se ejecuta una instruccin CALL o GOTO, es imprescindible que el registro PCLATH est
correctamente precargado. La instruccin a la que el uC ir estar conformada por 13 bits y ellos sern:
Cabe mencionar que el uC carga a PC<10:0> con el valor pasado por los 11 bits de K, y a PC<12:11> con el
valor de los bits PCLATH<4:3>. El registro PCLATH no es modificado de ninguna manera. Slo se leen esos
dos bits.
Por ejemplo, en un uC de 8kWords hay 4 pginas. Una pgina cada 2048 words. Si se est en una pgina y se
quiere ir a otro es necesario precargar antes dichos bits del PCLATH para poder hacerlo.
Si ocurre al menos uno de esos dos casos, es suficiente con asegurar que los bits PCLATH<4:3> se encuentren
ambos en cero.
Mal:
Bien:
Mejor:
Pagesel es una instruccin del MPASM que genera dos instrucciones: un bcf/bsf PCLATH,3 y un bcf/bsf
PCLATH,4. El software ensamblador selecciona automticamente la instruccin bcf o bsf segn el banco en el
cual se encuentra la etiqueta(o posicin de memoria) que se le especifique. En el caso anterior pagesel cruzo
generara estas dos instrucciones:
bsf PCLATH,3
bcf PCLATH,4
Finalmente, cuando se ejecuta una instruccin CALL, se carga en el STACK el valor de la posicin actual ms
1(es decir, se guarda en el STACK el valor PC+1). Se guardan los 13 bits, por lo que durante las instrucciones
RETURN,RETLW y RETFIE no es necesario precargar al PCLATH.
Para ms informacin, ver el esquema seccin 2.3 del datasheet de los PIC16F87XA que habla de cmo cargar
al PC segn cada situacin.
CLRF
Borra el contenido de un registro seleccionado por el programador. La forma en que lo hace, pone en 0 los 8 bit del
registro. Este registro, puede ser cualquiera de la pocicin de la RAM.
Ejemplo:
Cdigo:
CLRF PORTB
Antes de la instruccin PORTB vale B'11000111'. Despus de la instruccin PORTB vale B'00000000'
Afecta a:
Z Se pone a 1
CLRW
Borra al registro W. La forma en que lo hace, pone en 0 los 8 bit del registro.
Ejemplo:
Cdigo:
CLRW
Afecta a:
Z Se pone a 1
CLRWDT
Ejemplo:
Cdigo:
CLRWDT
Para recordar CLeaR es limpiar Watch Dog es perro guardian Timer es contador.
Afecta a:
TO (neg) Se pone a 1
PD (neg) Se pone a 1
NOTA: El WDT o el contador perro guardian, sirve para destrabar al PIC. Cada vez que se desborda, o sea, cada
vez que pasa de H'FF' a H'00', produce un reset, y como es un reset, se dirige a la pocicin 0h de la memoria de
programa.
La forma de trabajar con el, es ir poniendo en lugares estratgicos la instruccin ya explicada, de esta manera
evitamos el desborde del contador. Si el CP se traba en algn bucle o algo similar, al no limpiar el contador, el
WDT desbordar y llevar al CP a la pocicin 0h de la memoria de programa.
Muchas veces se evita de usar esta herramienta por no tener que calcular por todo el programa dnde y cuando
limpiar al WDT. Es recomendable su uso.
COMF
Cdigo:
COMF TEMP,F
Si TEMP tena guardado B'00111101' luego de ejecutar la instruccin TEMP vale B'11000010'. Notese, que aqu tambin
podemos elegir el destino y esto nos deja guardarlo en el registro W si as lo requerimos.
Afecta a:
Z Se pone a 1 si la operacin da 0
DECF
Cdigo:
DECF DECENA,W
Si antes de la instruccin DECENA vale .255, despus de la instruccin W vale .254 y DECENA vale .255 Si por el
contrario, hubieramos elegido el destino F, despus de la instruccin DECENA vale .254
Afecta a:
Z se pone a 1 si la operacin es 0
DECFSZ
Decrementa en uno, o lo que es lo mismo, resta en 1 el contenido de un registro y cuando este vale 0, el CP salta una
instruccin
Cdigo:
LOOP DECFSZ TEMP
GOTO LOOP
BCF PORTB,0
El CP descontar en 1 el registro TEMP y evala el valor, si no es cero, ejecuta lnea siguiente que es GOTO LOOP, el
cual se dirige de nuevo a la lnea LOOP DECFSZ TEMP el cual volver a descontar en 1 y evalua el valor, si es cero
salta la lnea GOTO LOOP y ejecuta la instruccin BCF PORTB. Esta ltima lnea, el programador pondr la instruccin
que necesite ejecutar.
Este pequeo programa que acabamos de ver, es un temporizador o un retardo que tardar en salir del bucle dependiendo
de la frecuencia de reloj y el valor cargado en TEMP.
NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se exprese, como en este caso, el MPLAB
dar por sentado que el resultado se guardar en el registro F y no en W.
Para recordar DECrement es decremento File es registro Skip es salto Zero que es cero.
INCF
Cdigo:
INCF INDF,F
Si antes de la instruccin INDF vale H'29', despus de la instruccin INDF vale H'2A'. Notese que tambin podemos
elgeir el destino. Si hubieramos elegido W, despus de la instruccin W vale H'2A' y INDF vale H'29'.
Afecta a:
Z se pone a 1 si el resultado es 0
INCFSZ
Incrementa en 1, o suma en 1, el contenido de un registro elegido por el programador y cuando este es 0, el CP salta una
instruccin.
Cdigo:
VOLVER INCFSZ CONTADOR
GOTO VOLVER
INCF PORTA
El CP incrementar en 1 el registro CONTADOR y evala el valor, si no es cero, ejecuta lnea siguiente que es GOTO
VOLVER, el cual se dirige de nuevo a la lnea VOLVER INCFSZ CONTADOR el cual volver a incrementar en 1 y
evalua el valor, si es cero salta la lnea GOTO VOLVER y ejecuta la instruccin INCF PORTA. Esta ltima lnea, el
programador pondr la instruccin que necesite ejecutar.
Este pequeo programa que acabamos de ver, es un temporizador o un retardo que tardar en salir del bucle dependiendo
de la frecuencia de reloj y el valor cargado en CONTADOR. Normalmente, se utiliza el retardo con DECFSZ pero este
tambin es vlido.
NOTA: Esta instruccin, tambin hay que elegirle el destino. En el caso que no se exprese, como en este caso, el MPLAB
dar por sentado que el resultado se guardar en el registro F y no en W.
Para recordar INCrement es incremento File es registro Skip es salto Zero es cero.
IORLW
Realiza la operacin OR entre W y un literal elegido por el programador. El resultado se guarda en W. La operacin es W
OR L.
Si antes de la instuccin W vale B'01110100' y el literal elegido es B'00011111', despus de la instruccin W vale
B'01111111'.
Para recordar Inclusive es inclusivo OR es la operacin binaria OR Literal es literal W es el registro trabajo.
Afecta a:
Z se pone a 1 si la operacin da 0
IORWF
Realiza la operacin lgica OR entre el registro W y un registro elegido por el programador. La operacin es W OR F.
Cdigo:
IORWF PORTC,F
Si antes de la instruccin W vale B'01111111' y PORC vale B'00001111' despus de la instruccin PORTC vale
B'01111111' y W vale B'01111111'. Notese que podemos elegir el destino y la otra opcin, como ya se dieron cuenta por
las instrucciones pasadas, puede ser W.
Para recordar Inclusive es inclusivo OR es la operacin binaria OR W es el registro trabajo y File es registro.
Afecta a:
Z se pone a 1 si el resultado es 0
MOVLW
Carga al registro W con un literal elegido por el programador para luego hacer una operacin matemtica o moverlo a otro
registro como veremos ms adelante. Sin duda alguna, una de las instrucciones ms usadas en la programacin ASM.
Cdigo:
MOVLW .255
MOVF
Cdigo:
MOVF RETARDO,W
Si antes de la instruccin W vale H'2A' y RETARDO vale H'FF', despus de la instruccin W vale H'FF'. Notese que aqu
podemos elegir el destino, y tenemos la posivilidad de elegir el destino al propio registro RETARDO. Al principio parece
innecesario, pero se puede tomar como una verificacin, ya que se ve afectado el registro STATUS bit Z.
Afecta a:
Z Se pone a 1 si la operacin es 0
Anteriormente, habamos dicho que esta instruccin se la puede tomar como vereficacin, para saber si se guard con el
mismo valor que tena, el bit Z se pone a 1 si el valor es igual al que tena cargado.
MOVWF
Mueve el contenido del registro W a un registro cualquiera elegido por el programador. Sin duda alguna, esta instruccin,
es otra muy usada en la programacin ASM
Cdigo:
MOVWF ADCON0
Si antes de la intruccin W vale B'10000001' y ADCON0 vale 0x0, despus de la instruccin ADCON0 vale 0x81.
NOP
Cdigo:
NOP
RETFIE
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se encontraba el CP antes de atender la
interrupcin. Al mismo tiempo, pone a 1 el bit GIE para activar de nuevo las interrupciones.
Cdigo:
RETFIE
RETLW
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se encontraba el CP desde dnde se llam a
la subrutina y al retornar, lo hace con un literal cargado en W especificado por el programador. Esta instruccin, se utilizan
en las tablas (para ms detalle, ver la explicacin del GOTO y CALL).
Ejemplo:
Cdigo:
RETLW 'L'
Cdigo:
PAGESELW TABLA ;CONFIGURA AL PCLATH PARA VOLVER AL LUGAR CORRECTO
MOVFW contador ;CARGA A W LA POCICIN A LEER EN LA TABLA POR EJEMPLO 3
CALL TABLA ;LLAMA A LA RUTINA TABLA
CALL LCD_DATO ;LLAMA A LA RUTINA PARA MOSTRA AL LCD
NOP
;
;
TABLA ADDWF PCL,F ;SUMA AL PCL CON EL CONTENIDO DE W POR EJEMPLO 3
RETLW '1' ;RETORNA CON 1 ASCII
RETLW '2' ;RETORNA CON 2 ASCII
RETLW '3' ;RETORNA CON 3 ASCII
RETLW 'T' ;RETORNA CON 4 ASCII
Este es un ejemplo sencillo de como utilizar RETLW. Para interpretar este cdigo empezamos desde PAGESELW,
supongamos que el CP est en esta instruccin (que est explicado que hace) luego pasa a la instruccin MOVFW
contador y suponemos que tiene cargado 3 en decimal, por lo que W pasar a tener 3 en decimal. El CP continua con
CALL TABLA, el CP saltar por encima a todas las dems instrucciones y se dirige a la etiqueta TABLA y ejecuta la
instruccin ADDWF PCL,F En el cdigo hablamos que le suma 3 al PCL, por lo que saltar al RETLW '3' cargando a
W con el cdigo ASCII 3. Retorna justo debajo del CALL TABLA, o sea retorna a CALL LCD_DATO y ejecuta la
rutina correspondiente, cuando termina, regresa al NOP (que puede ser cualquier instruccin que necesite el programador.
Si en cambio, contador hubiera tenido cargado 4 en decimal cuando llegue a la tabla y le sume al PCL este apuntar a
RETLW 'T' cargando en W el cdigo correspondiente ASCII.
RETURN
Carga al CP con el valor de la parte alta de la pila para volver al lugar dnde se encontraba el CP cuando se llam a la
rutina o subrutina.
La diferencia con RETLW es que RETURN regresa sin cambiar a W. Este se utiliza para terminar una rutina y no se
necesite ningn dato. Por ejemplo en la rutina CALL LCD_DATO no nos sirve que vuelva con ningn valor ya que es
una rutina para enviar datos a un LCD, asi que esta rutina tendr implementada RETURN
Por ejemplo:
Cdigo:
RETURN
RLF
Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino de la operacin se puede elegir.
Cada rotacin equivale a multiplicar por 2 si el bit C del registro STATUS es 0.
Ejemplo:
Cdigo:
RLF PORTC,F
Si antes de la instruccin PORTC vale B'00001000', despus de la instruccin vale B'00010000'. Si se hubiera elegido
como destino W, PORTC despus de la instruccin continua valiendo B'00001000' y W vale B'00010000'
Afecta a:
RRF
Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino de la operacin se puede elegir.
Cada rotacin equivale a dividir por 2 si el bit C del registro STATUS es 0.
Ejemplo
Cdigo:
RRF PORTB,F
Si antes de la instruccin PORTB vale B'10000000' despus de la instruccin PORTB vale B'0100000'. Si se hubiera
elegido como destino W, PORTB despus de la instruccin continua valiendo B'10000000' y W vale B'01000000'
Afecta a:
A la hora de utilizar estas dos instrucciones, hay que prestarle atencin al bit C del registro STATUS. La razn de esto, es
porque la rotacin se hace atravz del bit C.
BIT C = 0
TEMP = B'00010000'
Ejecutamos la instruccin RRF y TEMP vale B'00001000'. O si ejecutamos la instruccin RLF TEMP vale B'00100000'
BIT C = 1
TEMP = B'00010000'
Ejecutamos la instruccin RRF y TEMP vale B'10001000'. O si ejecutamos la instruccin RLF TEMP vale B'00100001'
Vemos como rota los bit dependiendo del valor del bit C. Pero anteriormente, avamos dicho que estas dos instrucciones
afectan al bit C. La actualizacin del bit C, lo hace despus de la rotacin. Lo vemos con un ejemplo:
Cdigo:
MOVLW B'10001001'
MOVWF temp
BCF STATUS,C ;PONEMOS A 0 AL BIT C
RLF temp,F ;ROTAMOS A LA IZQUIERDA
TEMP = B'00010010'
BIT C = 1
Cdigo:
MOVLW B'00000001'
MOVWF temp
BCF STATUS,C ;PONEMOS A 0 AL BIT C
RLF temp,F ;ROTAMOS A LA IZQUIERDA
TEMP = B'00000010'
BIT C = 0
Algo que me haba olvidado de mencionar pero que MIGSANTIAGO del foro de TODOPIC estuvo atento es que ests
dos instrucciones, nos sirve para enviar datos en forma serial utilizando el bit C que lo veremos ms adelante.
Recordemos que, para utilizar estas instrucciones para multiplicar o dividir, debemos asegurarnos de que el bit C, est en
0.
SLEEP
Cdigo:
SLEEP
Afecta a:
TD se pone a 1
PD se pone a 1
SUBLW
Cdigo:
SUBLW .20
Si antes de la instruccin W vale .23 despus de la instruccin W vale .3 Para saber si el resultado es negativo o positivo,
hay que chequear el bit C del registro Status. Si hay acarreo, el resultado es negativo, y por el contrario, si no hay acarreo
es positivo.
Afecta a:
Z se pone a 1 si el resultado es 0
DC se pone a si hay acarreo del bit del 4 al 5 bit del registro (recordemos que en la resta, es distinto a la suma,
por eso, se pone a 0 si hubo acarreo).
C se pone a 0 si hubo acarreo (recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 si hubo
acarreo).
SUBWF
Resta el contenido de un registro seleccionado por el programador con el contenido del registro W. La frmula es F - W =
d. d es la direccin elegida por el programador en dnde se guardar el resultado que puede ser el registro W o el registro
elegido por el programador.
Ejemplo:
Cdigo:
SUBWF MINUENDO,W
Si antes de la instruccin W vale .55 y MINUENDO vale .56, despus de la instruccin, MINUENDO vale .56 y W vale .
1
Afecta a:
Z se pone a 1 si el resultado es 0
DC se pone a 0 si hubo un acarreo del 4 bit al 5 bit (recordemos que en la resta, es distinto a la suma, por eso, se
pone a 0 si hubo acarreo).
C se pone a 0 si hubo acarreo del 7 bit. (recordemos que en la resta, es distinto a la suma, por eso, se pone a 0 si
hubo acarreo).
SWAPF
Intercambia los bits de un mismo registro elegido por el programador. Los 4 bit de menor peso, pasan a ser lo 4 bits de
mayor peso, y los 4 bits de mayor peso, pasan a ser los 4 bits de menor peso. El destino puede ser seleccionado.
Cabe pensar que puede ser una instruccin de muy poco uso, pero todo lo contrario si se utilizan con las interrupciones.
Microchips recomienda su utilizacin a la hora de salvar el contexto y restaurarlo en una interrupcin ya que no modifica
el registro STATUS. Cuando trabajemos con la interrupciones, se ver que es muy recomendable salvar el registro
STATUS y W en la RAM para luego restaurarlos. Si utilizamos la instruccin MOVF, es afectado el bit Z, perdiendo su
estado original en el momento de la interrupcin. Esto se soluciona, utilizando la instruccin SWAPF. No se preocupen si
no lo entiende por ahora. Lo entenderan cuando veamos ejemplo de interrupciones.
Ejemplo:
Citar
SWAPF STATUS,W
Si antes de la instruccin W bale H'55' y el registro STATUS vale B'00100100', despus de la instruccin el registro
STATUS vale H'24' y el registro W vale B'01000010'
XORLW
Realiza la operacin lgica XOR entre un literal o valor y el registro W. El resultado queda guardado en el registro W.
Ejemplo:
Cdigo:
XORLW B'11000101'
Afecta a:
Z se pone a 1 si la operacin es 0
XORWF
Realiza la operacin XOR entre un registro elegido por el programador y el registro W. La operacin es F XOR W = d. El
resultado se puede elegir dnde ser guardado.
Ejemplo:
Cdigo:
XORWF PORTB,F
Si antes de la instruccin PORTB vale B11111110' y W vale B'00000001', despus de la instruccin W vale .1 y PORTB
vale B'11111111'.
Para recordar XOR es la operacin lgica XOR W es el registro W y File es el registro elegido.
Afecta a:
Z se pone a 1 si la operacin es 0
Una vez que vimos todas las instrucciones y asumiendo que ya se la saben de memoria (tiempo tuvieron de sobra) y si no
lo han echo, es hora de hacerlo, empezemos a escribir programas muy sencillos. Pero cmo?. Si se estn asiendo esta
pregunta, es hora de leer desde el primer mensaje. Tienen que acordarce las pociciones de las cuatro columnas.
Recuerden que vamos a escribir los programas en el MPLAB, por lo que si an no lo tienen, es hora de descargarlo de la
pgina deMicrochip en forma gratuita e instalarlo en la PC. Lamentablemente, este programa trabaja solo bajo windows,
por los que tienen mac o Linux, no lo prodrn hacer si no es por un emulador de windows y an as, no se si funcione
correctamente.
Empezaremos bien desde el principio y para ello, voy a explicar cosas nuevas. Todo programa tiene un encabezado que se
repite en cada programa nuevo y que vara segn el PIC a utilizar y las prestaciones del programa a escribir. Muchas de
las personas crean plantillas nuevas para ahorrarce el trabajo. Yo soy una de ellas y aqu les doy una plantilla que pueden
utilizar sin problemas y modificarlas segn su necesidad.
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIN
INTERRUP
;
INICIO
;
END
Primera lnea:
LIST P=16F877A
Esta lnea, sive solo para el MPLAB y le indica que el PIC a utilizar es el 16F877A. Se debe actualizar segn sea
necesario.
Segunda lnea:
INCLUDE <P16F877A.INC>
Esta lnea sirve a la hora de compilar ya que dentro de este archivo que viene incluido dentro del MPLAB, le indica al
ensamblador dnde estn ubicados cada registro y el nombre de cada bits del PIC a utilizar as, nos ahorra de hacerlo
nosotros mismos. Si desean abrir el archivo, lo pueden hacer con el notepad o cualquier editor de texto. Se debe actualizar
segn sea necesario.
Tercera lnea:
Linea muy importante pero se puede omitir. Aqu se configura la palabra de configuracin del PIC y que est en el
datasheet del pic correspondiente.
En mi caso, yo la omito y luego lo configuro desde el ICPROG a la hora de pasar el archivo .hex al pic. Es por eso que
esta lnea est incompleta para el pic a utilizar pero completa para el PIC 16F84.
Vemos en ms detalle esta lnea: __CONFIG Directiva para el ensamblador de que debe generar la palabra de
configuracin correspondiente de acuerdo a: