Documentos de Académico
Documentos de Profesional
Documentos de Cultura
lenguaje ensamblador.
El modo de direccionamiento es la forma en la que se obtienen el o los datos que van a ser
utilizados en la instrucción. Existen 4 modos de direccionamiento:
Inherente, literal, directo e indirecto.
Modo de direccionamiento inherente: en este modo o bien la instrucción no tiene
operando o bien el operando viene especificado en el propio código de operación de la instrucción.
RESET ; Realiza un reset por software (los operandos son todos los registros afectados
por el reset)
DAW ; Ajuste decimal del acumulador (el operando es el acumulador). Formato BCD
NOP ; No realiza ninguna operación (no hay operando)
Modo de direccionamiento literal: en este modo el valor del operando viene indicado de
forma explícita en la instrucción.
MOVFF 0x011,0x120 ;
Mediante la combinación del BSR y el valor de 8 bits indicado en la instrucción
MOVLW 0xB4
MOVLB .1
MOVWF 0x21,1
MOVLW 0x74
MOVWF 0x06,0 ; También es válido MOVWF 0x60,A
MOVLB .2
BSF 0x31,6
Los registros INDFx son registros virtuales, aunque tienen una dirección asignada
en la zona de SFR’s, físicamente se corresponden con la dirección de memoria
apuntada por el correspondiente FSRx.
Además de los INDFx existen otros registros virtuales que permiten acceder el
dato apuntado por los FSRx, permitiendo operaciones adicionales:
MOVLW .25 ; 25 → W
MOVLW n ; n→W
CPFSGT cnt, A ;compara “cnt” con “n” y salta si: cnt > n
; Si se cumple la condición NO ejecuta sig. Instrucción
Bits de configuración
Son los que controlan el comportamiento del microcontrolador. Los tres básicos
son:
ORG
0x0000 ;localidad
cero goto main
La palabra reservada END termina con todos los CODE. Se utiliza para
finalizar el código. Solo se pone una vez y hasta el final del programa.
Sectores de memoria
UD
ATA_AC
S DATO1
RES 1
DATO2 RES 1
DATO3 RES 1
Constantes
UNO EQU 1
DOS EQU 2
TRES EQU 3
;****************************************************************
********
; Autor: Francisco Javier García Olmos *
; Fecha: 2 de Enero de 2012 *
; Plantilla para trabajar con BOOTLOADER en Ensamblador *
;****************************************************************
********
LIST P=18F4550, F=INHX32
#include <P18F4550.INC>
;****************************************************************
***********
;Bits de configuración
CONFI PLLDIV = 5
G
CONFI CPUDIV = OSC1_PLL
CONFI USBDIV = 2
CONFI FOSC = HSPLL_HS
CONFI FCMEN = OFF
CONFI IESO = OFF
CONFI PWRT = OFF
CONFI BOR = ON
CONFI BORV = 3
CONFI VREGEN = ON
config WDT = OFF
config WDTPS = 32768
config MCLRE = ON
config LPT1OS = OFF
config PBADEN = OFF
config CCP2MX = ON
config STVREN = ON
config LVP = OFF
config ICPRT = OFF
config XINST = OFF
config CP0 = OFF
config CP1 = OFF
config CP2 = OFF
config CP3 = OFF
config CPB = OFF
config CPD = OFF
config WRT0 = OFF
config WRT1 = OFF
config WRT2 = OFF
config WRT3 = OFF
config WRTB = OFF
config WRTC = OFF
config WRTD = OFF
config EBTR0 = OFF
config EBTR1 = OFF
config EBTR2 = OFF
config EBTR3 = OFF config EBTRB
= OFF
;**********************************************************************
*****
;**********************************************************************
*****
; Definición de
variables
prioridad UDATA
RESET_VECTOR CODE
0x0000
goto main
bra ISRH
ISRL
CODE
0x102
ISRH:
ISRL:
main:
clrf WREG
; *** La función principal va
aquí *** ciclo
goto
cicl
END
Instrucción NOP
Esta instrucción se utiliza para que el microcontrolador no realice
operación alguna.
Se utiliza para hacer retardos de tiempo equivalentes a cuatro ciclos del
oscilador principal.
Su sintaxis es:
NOP
No realiza operación alguna.
MOVLW 0x0F
MOVWF ADCON1
MOVLW 0xF0
MOVWF DATO1
trabajo:
MOVF INTCON, W
DATO1.
Ejemplo: mover el contenido del registro PORTB a un registro de memoria
llamado
CLRF WREG
Instrucción SET
La instrucción SET se utiliza para colocar todo el registro con uno, como
si colocáramos 0xFF al registro.
MOVLW 0xFF
GOTO y Etiquetas
Para usar una etiqueta y GOTO necesitamos colocar sangrías (tecla
tabulador) y dejar las etiquetas sin sangría y las instrucciones con sangría. Las
etiquetas se colocan con nombre y puede o no llevar dos puntos al final, pero
los dos puntos se recomiendan para funciones o subrutinas. Las etiquetas no
se pueden repetir dentro de un programa, hay que cambiar el nombre en caso
de que tengamos dos con el mismo, si no, provocará un error en el
compilador.
El GOTO se usa para dirigirse a una etiqueta colocando enfrente el nombre.
Ejemplo:
Instrucción BCF
La instrucción BCF coloca un bit en cero de un registro específico. El
conteo de bits es desde del cero hasta el siete. Su sintaxis es la que a
continuación se muestra:
También podemos usar el nombre del bit, para eso, consultar el manual
del microcontrolador y algunos de ellos serán explicados en este documento.
Instrucción BSF
Es exactamente igual que BCF solo que este coloca en uno el bit
indicado del registro deseado.
RLNCF REGISTRO,
DESTINO
Donde DESTINO puede ser 0 o 1. Si es cero, se guarda en el registro
W, si es uno, se guarda en el mismo registro (REGISTRO).
Instrucción RRCF
Esta instrucción realiza un giro a la derecha de bits del contenido de
cualquier registro pasando por la bandera Carry del registro STATUS. La
instrucción que realiza la misma operación sin que pase por la bandera Carry
del registro STATUS es RRNCF. Con esta instrucción el contenido será el
mismo, pero desplazado a la derecha. Su sintaxis es:
RRCF REGISTRO, DESTINO
Instrucción COMF
Realiza el complemento de un registro y lo puede guardar en el mismo
registro o en el registro W. Su sintaxis es:
SWAPF REGISTRO, 1
Ahora registro contendrá 53h.
Instrucción CALL
Esta instrucción manda a llamar a una subrutina. Las subrutinas son
aquellas etiquetas especiales y terminan en la palabra reservada RETURN.
OPERACION:
RETURN ;regresa al main
main:
CALL OPERACION ;llama a la subrutina OPERACION
;sigue el programa
Instrucción RETURN
Esta instrucción se utiliza para regresar de una subrutina a la instrucción
siguiente de la rutina principal. Solo se coloca RETURN al final de la subrutina.
Véase el ejemplo anterior.
Si queremos devolver algún valor en el registro de trabajo podemos
finalizar la subrutina con la palabra reservada RETLW. Su sintaxis es:
RETLW LITERAL
Donde LITERAL puede ser cualquier valor dentro del rango 0 a 255.
Este valor será guardado en el registro W.
Instrucción RETFIE
Esta instrucción se utiliza para finalizar una subrutina de interrupción. Si
se finaliza la subrutina de interrupción de alta prioridad, se coloca FAST frente a
la palabra reservada RETFIE.
Instrucción RESET
Realiza un RESET desde el software. Se realiza exactamente lo mismo
que si se presionara el botón MCLR en la tarjeta de pruebas del PIC.
Comparadores
Instrucción TSTFSZ
Esta instrucción comprueba que un registro sea cero; si es verdadero,
salta una instrucción. Su sintaxis es:
TSTFSZ REGISTRO
Instrucción CPFSEQ
Esta instrucción compara el registro W con cualquier otro registro. Salta
si el contenido de los registros es idéntico. Su sintaxis es:
CPFSEQ REGITRO
Ejemplo: Comparar PORTA con W.
CPFSEQ PORTA
;no son identicos
;son idénticos
Instrucción CPFSGT
Compara si un registro con el registro W. Salta si el contenido del registro
es más grande que el contenido de W. Su sintaxis es:
CPFSGT REGISTRO
Instrucción CPFSLT
Compara un registro con el registro W. Salta si el contenido del registro
es más pequeño que el contenido de W. Su sintaxis es:
CPFSLT REGISTRO
Instrucción BTFSC
Verifica si un bit específico de un registro es cero, en caso de que sea
verdadero, salta una instrucción.
Ejemplo: Verificar que el bit RB4 del registro PORTB sea cero.
Instrucción BTFSS
Es idéntico que la instrucción anterior. Verifica que un bit específico de
un registro sea uno, en caso de que sea verdadero, salta una instrucción.
Ejemplo: Verificar que el bit RB5 del registro PORTB sea uno.
GOTO
verdadero
Operadores Lógicos
Operación AND
Se puede realizar de dos maneras: ANDWF y ANDLW. La primera
realiza la operación AND entre un registro y el registro W; la segunda, realiza la
operación AND entre el registro W y una literal (un número). Sus sintaxis
respectivas son:
ANDWF REGISTRO, DESTINO
Donde DESTINO puede ser 0 o 1. Si es cero, se guarda en W, si es
uno, se guarda en el mismo registro.
ANDLW LITERAL
Donde LITERAL es un número del 0 al 255.
Operación OR
Igual que la instrucción anterior, se puede realizar de dos maneas:
IORWF o con la instrucción IORLW. La primera realiza al operación OR entre un
registro y el registro W, la segunda realiza la operación OR entre el registro W y
una literal. Sus sintaxis respectivas son:
IORWF REGISTRO, DESTINO
IORLW LITERAL
Donde LITERAL puede ser cualquier número del 0 al 255.
Operación XOR
La operación XOR al igual que las anteriores tiene dos formas de
hacerse entre registros y una a bit. Primero veamos la operación XOR a
registros.
Se puede realizar de dos maneras: XORWF o XORLW. La primera
realiza la operación XOR entre el registro W y cualquier otro registro, la segunda
realiza la operación XOR entre un registro y una literal. Sus sintaxis respectivas
son:
XORWF REGISTRO, DESTINO
Donde destino puede ser 0 o 1. Si es cero, se guarda en W, si es uno,
se guarda en el mismo registro.
XORLW LITERAL
Donde LITERAL puede ser cualquier número del 0 al 255.
Hay un caso particular en donde se puede realizar la operación XOR a
un bit. Lo que realiza esta instrucción es cambiar el estado de un bit, si es cero,
lo cambia a 1, si es uno lo cambia a 0. Puede ser también visto como una
negación o una operación toggle (refiriéndose a flip-flops). Esta instrucción es
BTG. Su sintaxis es:
BTG REGISTRO, BIT
Donde REGISTRO es cualquier registro y BIT, es el número de bit entre el 0 y el
7. Básicamente se puede usar para realizar parpadeos o cambios de estado en
un registro.
Operadores aritméticos
Operador NEGF
Este operador sirve para convertir un número contenido en un registro a
negativo o viceversa. Su sintaxis es:
NEGF REGISTRO
Donde REGISTRO es cualquier registro que contiene un número entre el
-128 a 127.
Suma o adición
Para realizar la suma o adición se suelen usar dos instrucciones:
ADDWF para hacer la adición entre el registro W y otro registro o ADDLW para
hacer la suma del registro W con una literal. Sus sintaxis respectivas son:
ADDWF REGISTRO, DESTINO
Donde REGISTRO es cualquier registro y DESTINO puede ser un valor
0 o 1. Si es cero, se guarda el resultado en W, si es uno se guarda el resultado
en el mismo registro.
ADDLW LITERAL
Donde LITERAL es cualquier número entre el 0 y el 255.
En ambos casos si la suma supera el 255 se encenderá las banderas
de Carrier y Overflow del registro STATUS.
Resta o sustracción
Para realizar la suma o sustracción, se suelen usar dos instrucciones:
SUBWF para hacer la sustracción entre el registro W y cualquier otro registro o
SUBLW para hacer la resta del registro W con una literal. Sus sintaxis
respectivas son:
SUBWF REGISTRO, DESTINO
Donde REGISTRO es cualquier registro y DESTINO toma el valor de 0 o
1. Si es cero, se guardará el resultado en el registro W, si es uno, se guardara el
resultado en el mismo registro.
SUBLW LITERAL
Donde literal es cualquier número entre el 0 y el 255.
Multiplicación
La multiplicación se realiza con dos instrucciones: MULWF para realizar
la multiplicación entre el registro W y cualquier otro registro o MULLW para
realizar la multiplicación entre el registro W y una literal. Sus sintaxis
respectivas son:
MULWF REGISTRO
MULLW LITERAL
Donde LITERAL puede ser cualquier número del 0 al 255. Registro
puede ser cualquier registro de estado o memoria.
Incrementos y decrementos
Incremento
Los incrementos lo que realizan es sumar uno a un determinado
registro. Una vez que llegue a 255 el siguiente incremento causará que el
contenido del registro sea cero, y se encenderá la bandera de overflow del
registro STATUS. La palabra reservada para realizar un incremento se utiliza la
palabra reservada INCF. Su sintaxis es la siguiente:
INCF REGISTRO
Donde registro es cualquier registro de memoria.
Para evitar que estemos comprobando el error de OVERFLOW en la
bandera STATUS, tenemos una instrucción que lo hace por nosotros y cuando
esto sucede, salta una instrucción. Esta instrucción tiene la palabra reservada
INCFSZ que compara cuando el registro vuelve a ser cero y como mencioné
anteriormente, salta la siguiente instrucción. INCFSNZ realiza lo mismo pero
salta la siguiente instrucción si no es cero. Sus sintaxis respectivas son las
siguientes:
INCFSZ REGISTRO
;No hay overflow
;Hay overflow
INCFSNZ REGISTRO
;Hay overflow
;No hay overflow
Decrementos
Los decrementos lo que hacen es restar uno a un determinado registro
hasta llegar a cero. La palabra reservada para realizar un decremento es DECF
y su sintaxis es la siguiente:
DECF REGISTRO
Donde REGISTRO es cualquier registro de memoria.
DECFSNZ REGISTRO
;es cero
;no es cero
PROGRAMACIÓN BÁSICA DEL PIC18F4550
Vamos a ver tres registros básicos del PIC18F4550, los cuales son WREG,
TRIS y PORT.
Registro WREG
El registro WREG se utiliza para guardar datos temporales en RAM para
operaciones y el intercambio de datos entre las mismas operaciones. Se puede
utilizar para regresar datos de subrutinas y de tablas.
Registros TRIS
Los registros TRIS sirven para configurar puertos, lo explicaré más
adelante. Hay cinco, que son el número de puertos que tiene el PIC18F4550,
los cuales son TRISA, TRISB, TRISC, TRISD y TRISE. Todos son de 8 bits,
excepto TRISE que es de 4 bits (nibble bajo) los demás no tienen efecto.
Registros PORT
Los registros PORT sirven para leer y escribir puertos, y también lo
explicaré más adelante. Hay cinco, que son el número de puertos que tiene el
PIC18F4550, los cuales son PORTA, PORTB, PORTC, PORD y PORTE. Todos
son de 8 bits excepto PORTE que es de 4 bits y se lee como cero el nibble alto
del registro.
Configurar puertos
MOVLW
0x00
MOVWF
TRISA
MOVLW 0xFF
MOVWF TRISB
MOVLW 0xFF
MOVWF PORTD ;se encienden todos los pines del puerto D
LEER:
MOVWF ADCON1
SETF PORTA
ciclo
GOTO ciclo
END
Solución 1.2
main:
MOVLW H'C0'
MOVWF TRISA
MOVLW H'3F'
MOVWF PORTA
ciclo
GOTO ciclo
END
Solución 2.1
main:
CLRF WREG
MOVLW H'0F'
MOVLW H'10'
MOVWF PORTA
ciclo
GOTO ciclo
END
Solución 2.2
main:
CLRF WREG
MOVLW H'0F'
Ciclo
GOTO ciclo
END
main:
CLRF WREG
MOVLW H'0F'
ciclo
MOVLW H'55'
CPFSEQ PORTB
GOTO comprueba2
MOVLW H'01'
MOVWF PORTC
GOTO ciclo
comprueba2
MOVLW H'AA'
CPFSEQ PORTB
GOTO apagapuerto
MOVLW H'02'
MOVWF PORTC
GOTO ciclo
apagapuerto
CLRF PORTC
GOTO ciclo
END
Notemos que cada vez que realizamos un programa más avanzado, va
aumentando su tamaño. Todo es dependiendo del objetivo a alcanzar. Hay que
tener mucha lógica para realizar un programa para microcontrolador.