Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ensamblador
para PIC
desde 0
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, ver el archivo adjunto. Es la 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.
(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.
Los microcontroladores PIC, poseen tres tipos de memorias.
* 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 :mrgreen: Es un chiste).
* Memoria de datos de uso general
Es la memoria RAM del PIC. Recordemos, que los registros estn sobre la memoria
RAM y la memoria de uso general, comienza despus de los registros.
* Memoria de datos EEPROM
Es la memoria EEPROM que puede almacenar datos mas de 40 aos sin energa y
1.000.000 de ciclos de escritura y lectura
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.
Vemos ahora en detalle el registro STATUS (est adjuntado)
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).
Los analizamos desde el ms significativo (MSB) hasta el menos significativo (LSB).
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
01
10
11
=
=
=
=
Banco 0
Banco 1
Banco 2
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.
1 = Despus de que despierta (power up) o por la instruccin CLRWDT, se pone a 1
0 = Se pone a 0 cuando se ejecuta la instruccin SLEEP
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.
1 = La operacin aritmtica o lgica di como resultado 0
0 = La operacin aritmtica o lgica no di como resultado 0
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).
1 = Hubo un acarreo del 4to bit menos significativo al 5to bit.
0 = No hubo un acarreo del 4to bit menos significativo al 5to bit.
BIT 0
Se llama C carry/borrow. Es afectado por las mismas instrucciones que afectan al
bit DC.
1 = Hubo un accareo del bit ms significativo (Bit 7) o sea cuando se exede de
H'FF'
0 = No hubo accareo 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.
Las instrucciones, estn divididas en tres grupos. Los cuales son:
OPCODE (Cdigo)
DESTINATION (Destino)
FILE REGISTER ADDRESS (Direccin del archivo de registro)
OPCODE (Cdigo)
BIT ADDRESS (Bit de direccin)
FILE REGISTER ADDRESS (Direccin del archivo de registro)
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.
Tercer grupo Literal and Control
Cada instruccin de este grupo, est compuesta por:
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).
Est adjuntado las 35 instrucciones agrupadas por los tres grupos
Si alcanzan a ver en la imagen, vern que algunas instrucciones afectan al registro
STATUS y otras no.
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 REGISTRO afecta.
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
Suma un valor designado por el programador al registro W
Ejemplo
Cdigo:
ADDLW
.128
Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'
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
ADDWF
TEMP,F
Z Se pone a 1 si la operacin es 0
DC Se pone a 1 si hubo un acarreo del bti 3 al 4
C Se pone a 1 si hubo desbordamiento, o sea, cuando se supera H'FF'
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
Z Se pone a 1 si la operacin es 0
BCF
Pone a 0 el bit de un registro. El bit debe ser indicado por el programador.
Ejemplo:
Cdigo:
BCF
TEMP,2
BSF
TEMP,0
BTFSC
BCF
BSF
TEMP,5
PORTA,0
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
Para recordar Bit Test es chequear File Skip es salto Clear
No afecta a ningn Bit del registro Status.
BTFSS
Salta una lnea si el bit de un registro es 1. EL bit debe ser indicado por el
programador.
Ejemplo:
Cdigo:
BTFSS
ADDWF
ANDWF
TEMP,3
PORTC
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.
Para recordar Bit Test es chequear File Skip es salto Set
No afecta a ningn Bit del registro Status.
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
GOTO
INICIO
Para recordar GO TO es ir a.
No afecta a ningn bit del registro Status.
Extendiendo la explicacin.
Vamos a hablar del PC para entender bien sobre estas instrucciones. La excelente
explicacin que continua, por desgracia no es ma (ojal fuera mi explicacin), son
de las personas Maunix y BrunoF (del foro todopic)
En la siguiente imagen, vemos el diagrama de bloques del PC o CP.
1.
STACK = vaco
PC = 0x00A0
PCLATH = 0b000011000
Ejecutas un CALL 0x230
2. El STACK tiene en su posicin 0 la direccin 0x00A0.
PC = 111000110000
3. Se ejecuta la subrutina y en ese punto el PC ya qued en
PC = 111000110111
4. Viene un RETURN.
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.
Bien:
Mejor:
org 0x000 ;Esto es pgina0
pagesel cruzo ;automaticamente seleccionar banco
call cruzo
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
Ya que la subrutina cruzo se encuentra en la pgina1.
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
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
Antes de la instruccin W vale B'00000111'. Despus de la instruccin W vale
B'00000000'.
Para recordar CLeaR es limpiar Work es trabajo.
Afecta a:
Z Se pone a 1
CLRWDT
Borra al WDT. La forma en que lo hace, pone en 0 al mismo.
Ejemplo:
Cdigo:
CLRWDT
Antes de la instruccin WDT vale B'11111110'. Despus de la instruccin vale
B'0000000'.
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
Realiza el complemento de un registro.
Cdigo:
COMF
TEMP,F
Z Se pone a 1 si la operacin da 0
DECF
Decrementa en una unidad, o lo que es lo mismo, resta 1 el contenido de un
registro
Cdigo:
DECF
DECENA,W
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
GOTO
BCF
TEMP
LOOP
PORTB,0
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.
No afecta ningn bit del registro STATUS.
INCF
Incrementa en 1, o suma 1, el contenido de un registro elegido por el programador.
Cdigo:
INCF
INDF,F
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
GOTO
INCF
CONTADOR
VOLVER
PORTA
Para recordar INCrement es incremento File es registro Skip es salto Zero es cero.
No afecta ningn bit del registro STATUS.
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
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
RETARDO,W
Z Se pone a 1 si la operacin es 0
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
NOP
Para recordar No es no y OPeration es operacin.
No afecta ningn bit del registro STATUS.
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
Para recordar REturn es retornar From es de la IntErrupt es interrupcin.
No afecta ningn bit del registro STATUS.
Por ahora no. Hay mucho por aprender en la programacin ASM. Como armar un
programa, concejos a la hora de hacerlo.
Utilizacin de las rutinas y como armar libreras, luego como adjuntarlas a nuetro
nuevo programa, etc.
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'
PAGESELW
TABLA
VOLVER AL LUGAR CORRECTO
MOVFW
contador
LEER EN LA TABLA POR EJEMPLO 3
CALL
TABLA
TABLA
CALL
LCD_DATO
MOSTRA AL LCD
NOP
;
;
TABLA
ADDWF
PCL,F
CONTENIDO DE W POR EJEMPLO 3
RETLW
'1'
RETLW
'2'
RETLW
'3'
RETLW
'T'
;CARGA A W LA POCICIN A
;LLAMA A LA RUTINA
;LLAMA A LA RUTINA PARA
CON
CON
CON
CON
1
2
3
4
ASCII
ASCII
ASCII
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.
Para recordar RETurn es retornar Literal es literal W es el registro de trabajo W
No afecta ningn bit del registro STATUS.
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
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
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.
Supongamos que tenemos lo siguiente:
BIT C = 0
TEMP = B'00010000'
BIT C = 1
TEMP = B'00010000'
MOVLW B'10001001'
MOVWF temp
BCF
STATUS,C
RLF
temp,F
;PONEMOS A 0 AL BIT C
;ROTAMOS A LA IZQUIERDA
TEMP = B'00010010'
BIT C = 1
MOVLW B'00000001'
MOVWF temp
BCF
STATUS,C
RLF
temp,F
;PONEMOS A 0 AL BIT C
;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
Pone al microcontrolador en bajo consumo.
Cdigo:
SLEEP
Para recordar SLEEP es dormir.
Afecta a:
TD se pone a 1
PD se pone a 1
SUBLW
Resta el contenido de W con un literal de hasta 8 bit (.255). El resultado se guarda
en W.
Cdigo:
SUBLW
.20
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
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:
SWAPF STATUS,W
XORLW
B'11000101'
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
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 de Microchip 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.
He aqu la plantilla que tambin est adjuntado.
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
Cuarta lnea:
;
;--------------------------------------------------------------;VARIABLES.
;--------------------------------------------------------------;
Este no es ms que un pequeo encabezado. El ensamblador omitir estas lneas y
solo porque empieza con ";". Recuerden que, toda lnea que empieze con ";" es
comentario y el ensamblador la omitir.
Justo por debajo de este encabezado, penemos las variables. a que le llamo
variables? a pociciones de memorias o nombre de bit que yo quiera darle
personalmente.
Por ejemplo, dentro del archivo P16F877A.INC a la pocicin de memoria 0x05 le
llama PORTA pero si yo quero llamarlo PUERTO_A, es qu dnde le indico al
ensamblador.
Cmo se hace?
Es muy fcil y con la instruccin "EQU"
PUERTO_A EQU H'05'
Si al Bit RA6 lo quero llamar LED6 lo hacemos as:
LED6 EQU 6
Supongamos que quiero encender el LED 6 que est en el Puerto a bit 6, y este se
activa con un 1 lgico, ponemos esta instruccin:
BSF PUERTO_A,LED6
Y el ensamblador lo traducir as: BSF 0X05,0X06
Quinta lnea:
CBLOCK H'20'
ENDC
A estas dos lneas las unifique porque van juntas. Entre ellas van los nombres de
cada pocicin de la RAM que nosotros querramos nombrar, o cada Registro que
querramos renombrar.
Recuerden que los registros estn implementados en la RAM y que la pocicin de la
RAM que puede utilizar el usuario para guardar cosas, empieza desde una pocicin
que est indicada en el datasheet. Para el caso de 16F877 empieza desde la
pocicin 0x20 como lo ven en la figura siguiente.
(Ver archivo adjunto)
La directiva CBLOCK H'20' indica que empezamos a nombrar pociciones de
memoria desde la ubicacin 0x20. Por ejemplo
CBLOCK H'20'
temperatura
demora1
demora2
ENDC
La pocicin 0x20 se llama temperatura, la pocicin 0x21 se llama demora1 y as
sucesivamente. Tambien existe otra forma de nombrar o renombrar pociciones de
memoria o registro, y ya lo vimos que es con la directiva EQU. por ejemplo:
temperatura EQU H'20'
demora1 EQU H'21'
demora2 EQU H'22'
Sexta lnea:
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIN
INTERRUP
He unificado estas lneas porque por lo general as se escribe en la mayora de
nuestros programas. Vemos con ms detalles estas lneas.
RESET ORG H'00'
Aqu es en dnde empieza el CP cuando se enciende al PIC. Y estos se debe, porque
cuando hay un reset por el pin MCLR o un reset interno producido por, encendido
del PIC o, por ejemplo, del perro guarda, el vector reset se ubica en la pocicin
0x00 de la memoria de programa.
Como pueden apreciar, hemos llamado a la pocicin 0x00 con el nombre de RESET,
ya que la primer columna es una etiqueta. Las etiquetas sirven para nombrar
pociciones de memoria de programa.
ORG H'00' indica que se empieza a escribir desde la pocicin 0x00 por lo que la
siguiente instrucin, quedar alojada en la pocicin 0x00. ORG es una directiva, y
solo sirve para el ensamblador. Esta lnea, SIEMPRE debe estar y no se puede
modificar, salvo la etiqueta.
Siguiente lnea es GOTO INICIO, esta instruccin queda alojada en la pocicin 0x00
y es un salto a la etiqueta INICIO. Este salto tiene que estar, porque en las
siguientes pociciones de memoria de programa, est la interrupcin, externa e
interna del PIC. Por eso es necesario hacer el salto.
Siguiente lnea nos encontramos con ORG H'04', como se dieron cuenta, es una
directiva. Esta pocicin de memoria, indica el vector de interrupcin. Cuando estn
habilitadas las interrupciones y una de ella se activa, el CP apuntar aqu, a la
pocicin 0x04.
Siguiente lnea nos encontramos con la etiqueta INTERRUP. Si trabajamos con las
interrupciones, aqu es donde escribiremos lo que necesitamos hacer con ellas.
Sptima lnea:
;
INICIO
;
Vemos la etiqueta INICIO. Aqu vendr el CP cuando alla un reset gracias al GOTO
INICIO ubicado en la pocicin 0x00 de la memoria de programa. De esta manera,
saltamos un montn de instrucciones que no debemos ejecutar antes. Como por
ejemplo las interrupciones si hubiese.
Por ende, a partir de esta etiqueta, estar nuestro programa principal.
Configuraremos los puertos, las insterrupciones y empezaremos a darle trabajo al
CP.
Octava lnea:
END
Esta es una directiva y solo sirve para el ensamblador indicando que despus de
esta directiva, se termin el programa. Instruciones que estn por debajo de esta
lnea, no sern tenido encuenta. Y esta directiva es obligatoria colocarla.
Funcion SUBLW
Excelente trabajo!. Me venia cabeceando con mil cosas que no lograba comprender
y con este tutorial se fue aclarando y aclarando.
Hay algo que aun no comprendo.
Con las operaciones de SUBxx y el resultado es negativo comprendo lo del acarreo,
pero el valor que adopta el registro como es?
Lo pongo en un ejemplo
Si W= .10
SUBLW .5
(Continuara)