Está en la página 1de 19

Un programa de ensamblado(.

ASM) tiene dos partes importantes, los


comandos del pre-procesamiento y el programa, el pre proceso es como
jueces en una carrera que dicen en sus marcas listo fuera y mas parecidos a
jueces en un raly donde existen actividades que realizar y quien orienta y
quien realiza, el programa seria como el corredor o los jugadores son quienes
hacen las operaciones, todo programa es interpretado por un compilador del
tipo macroensamblador, quien interpreta el texto y va generando un archivo,
este archivo contiene todo lo necesario para instalar en direcciones especificas
de la memoria de programa, no es una imagen solo del programa, tambin es
de toda la memoria, todo esto queda en un archivo hexadecimal (.HEX) un
ejemplo de lo que no es un programa es el siguiente:
;esta lnea no hace nada solo comenta y se llama cometarios
; esta igual comentarios que te recuerdan que queras programar en este punto
LIST P=PIC16F84 ; ESTA DIRECTIVA INFORMA AL COMPILADOR DE QUE PIC SE
TRATA
_XT_OSC EQU 0x3FFD ; indica una constante y a que es igual su valor por su
nombre
; variable _XT_OSC cuando se encuentre en el programa es
sustituido por
; el valor hexadecimal (0x) 3FFD usamos cristal resonador
_WDT_OFF
equ 0x3FFB ; deshabilitamos el contador que resetea el PIC
al llegar a un valor
; pre programado si no lo reseteamos a el el supuso
que nos
; salimos del programa, solo usar si es totalmente
necesario
_PWRTE_ON
alimentacin
_CP_OFF
programa

equ 0x3FF7 ; esperara un momento antes de conectar la


equ 0x3FFF

; Sin proteccin de la lectura de memoria de

; nos pueden piratear pero tambin podemos leer


para checar
__config
_XT_OSC & _WDT_OFF & _PWRTE_ON &
calculamos

_CP_OFF ;ok

Si bien es la forma de configurar no son instrucciones de ensamblador solo del


compilador y finalmente genera una palabra de configuracin que se guarda en
la direccin 0x2007 del programa

Un programa ensamblador no es transportable a diferentes arquitecturas, un


Pic no podra utilizar un programa escrito para x86 ni para ARM, AVR o
freescaler, y tal vez de algunas familias del mismo fabricante Microchip.
El lenguaje ensamblador utiliza nemnicos que se entienden y son mas
naturales a nuestro lenguaje, y no son solo nmeros, el lenguaje mquina que
est interpretado lenguaje binario, o hexadecimal seria muy difcil entender.
Un nemnico utiliza nombres abreviados y sus operadores tienen un orden de
precedencia es decir los resultados o destino y la fuente de los datos estn en
un lugar especfico al escribir la instruccin y debe respetar una sintaxis muy
rgida, Formato de un mnemnico:
[Etiqueta] mnemnico de la instruccin [Operando] [;Comentario]
Este formato tiene cuatro campos, pero solo el mnemnico es obligatorio
La etiqueta se emplea con bastante frecuencia como punto de entrada o
regreso. Su direccin representa una entidad a la que pueden hacer referencia
otras instrucciones, ese nombre simblico esta asociado a una direccin donde
comienza una instruccin y debe empezar con letras nunca con numero.
miresta sublw 0x7F
la etiqueta miresta servir de referencia para el macroensamblador a modo de
direccin, esto es entonces una direccin que el ensamblador asignara, y
servir para ser llamada en otra parte del programa por alguna otra
instruccin.
El mnemnico sublw hace referencia a sustraccin resta e indica que el
argumento requerido ser un dato literal.
El registro donde se realizan las operaciones el registro de trabajo W, esta
indicado en el mnemnico (subwl), por lo tanto solo acompaa a esta
instruccin en lenguaje maquina un byte mas que corresponde al dato literal o
inmediato.

El dato literal que ser cualquier valor dentro de 0 hasta FF hexadecimal, por
eso en el dato se agrega el prefijo 0x que le indica al macroensamblador, que
es en formato hexadecimal.
Utiliza 8bits para escribirlo en el programa, 0x7F es en binario 0b0111111 o
solo 127 decimal todo eso es para el programa que compila y ensambla
recordemos que el PIC tiene registros de trabajo de 8bits.

La siguiente instruccin hace uso de la etiqueta para enviar el contador del


programa a la direccin donde esta la etiqueta miresta en este caso se
convierte en un operando literal e inmediato.

miresta sublw 0x7F


nop
nop
nop
goto miresta

Donde colocar en el programa la directiva ORG


Esta sencilla directiva hace referencia a donde quedara lo que se estriba
despus de que es indicado en la compilacin del programa, no es una
instruccin del PIC es del preprocesador por ejemplo:
org 5 ; organiza desde este punto el programa

A partir de la direccin 5 se organizara lo que usted programe a continuacin


de esa manera, esta libre la parte anterior a la direccin 5 de memoria.

Un programa al encender o resetear inicia en la direccin 0 a esto se le llama


vector reset o de inicio y lo siguiente es lo mas usual para dejar libre las
primeras direcciones que se encargan de proporcionar la direccin donde esta
el programa de servicio de vector de interrupcin, un salto con GOTO es los
mas indicado como primera instruccin de un programa hacia la etiqueta inicio.
LIST

P= 16F84

RADIX HEX
INCLUDE <P16F84.INC>
ORG 0x00
goto INICIO
ORG 0x05 ; pero si no uso la interrupcin no lo
pongo
INICIO

nop

; a partir de aqu empieza el programa

nop

; este es una instruccin no

operacion
nop
goto INICIO

; regresa hasta inicio (bucle)

END

; le dice donde es el fin al compilador

Entonces la etiqueta INICIO es la direccin 5 donde esta la instruccin de no


hacer nada NOP que pierde el tiempo e incrementa el contador de programa
para cargar la instruccin siguiente, todo esto en 1 micro segundo, si usamos
un cristal de 4Mhz es muy utili para generar retardos y poder sincronizar
procesos con dispositivos externos mas lentos, como un teclado o la vista de
un display incluso un cdec interno o externo para leer datos anlogos
requiere que el micro espere perdiendo el tiempo, NOP no requiere
parmetros .

Cargar datos, para procesar guardar configurar o enviar a leer datos de


registros y puertos.En algunos micros es carga o load abreviado LD en Pic se
utiliza el nemonico MOV de mover muy parecido a X86, MOV tiene variantes
por ejemplo una carga literal de dato inmediato MOVLW 0x00 al registro de
trabajo W, seria equivalente a borrarlo CLRW pero no a MOVLW 0x01, como
limpiar es muy usado CLRW seria una forma mas rpida por no tener que
cargar de la memoria de programa un dato literal, ya esta diseada para solo
activar el clr de los flip flop del registro W, y cargar al contador de programa
con la direccin de la instruccin siguiente a ejecutar.
movlw d'100'

; carga un 100 decimal en W

movlw 0x1f

;carga un 1f hexadecimal en W

movlw b'01010101'

; carga un 01010101 en W

Si queremos usar registros que nosotros declaremos, el compilador necesita


saber donde ponerlos en una direccin, e inclusive el nombre (que no este
usado para un comando o registro)
;-----------------------------------------------------------;
Declaracin de Registros Banco 0 y Banco 1 no esta en la
memoria de programa
;

esta es la memoria de datos RAM y es diferente.

;-----------------------------------------------------------w

equ 0x0000

tmr0

equ 0x0001

status

equ 0x0003

porta

equ 0x0005

portb

equ 0x0006

eedata

equ 0x0008

eeadr

equ 0x0009

pclath

equ 0x000a

intcon
equ 0x000b ; esto son del micro y son reservados, pero si
usted no los usa no los
; tiene que mencionar, y solo con el valor de la
direccin

; sera posible usarlo, un numero es mas difcil de


recordar
; para eso es EQU igual. Porta es la direccin 5 de
la RAM
; porta equ 0x0005 le dice al compilador que cuando
encuentre la
; palabra porta esta sea sustituida por 0x0005
mivariable
ESPACIO LIBRE

equ 0x000d; ASI ES COMO DECLARA UNA VARIABLE EN

; asi hasta 0x004F en el banco 0 las direcciones de 0x50 hasta 0x7F


no hay memoria
eecon1
interna

equ 0x0088 ;estas direcciones estn en la segunda memoria

eecon2
equ 0x0089; se lee como 89 0x0009 banco 1 hasta
0x00CF esta en el pic
; se puede declarar desde 0x008d hasta 0x00CF y esa
poca es toda.

Si quisiera guardar un dato en la memoria RAM desde el registro W tenemos la


versin de MOVWF que carga en la RAM el contenido de el registro de trabajo
W, se usa la direccin del registros como operando de MOVWF
movlw 0x00

; cargar un cero en w

movwf mivariable ; se guarda en la direccin de mivariable un


CERO
otra forma
clrw
movwf mivariable

; limpia a w con cero


; guarda w limpio con cero, en la direccin de

mivariable
; dos formas de hacer lo mismo
Guardar resultados
movlw 0x07

; cargar w con 0x07

addlw 0x01 , W

; suma W+ 1, 7 +1 el resultado queda en W


; W tenia 7 y ahora 8, se puede addlw 0x01,0

cero es W
movwf mivariable

; mivariable ahora tiene 0x08 el resultado de

ADD

Cargar mediante MOV datos desde un registro definido al registro de trabajo W


movf porta,0

; origen porta, segundo parmetro 0(cero) indica

destino W

movf porta,w

; origen registro porta, destino registro W

;se copia el contenido del Puerto A al registroW


movf portb,0

; se podra escribir movf portb, w

;se copia Puerto B al registro W


movf tmr0,0

; se podra escribir movf tmr0, w


; se copia del temporizador 0 al registro W

movf eedata,0 ; se podra escribir movf eedata, w


; del registro entre memoria flash y el procesador y
es enviada al ; registro de trabajo W se lee una a
una los datos y el procesador ; accede a eedata del
dato que esta siendo sacado de flash pero no ;existe
una instruccin para hacer eso se hace mediante
banderas ;y moviendo datos
esto queda en el registro W pero en la sintaxis se incluye el (,0) para decir que
es en el registro W.

Manejo de Bits

Una de las partes mas poderosas del pic es el manejo de cada bit de manera
individual y as poder acceder a cada registro y modificar banderas que son
bits que controlan ciertas partes perifricas del pic como el acceso a los bancos
de memoria:
Bit
RAM (banco 0) direccion 03h
DC, C

STATUS

2 1

IRP, RP, RP0, /TO#, /PD#, Z,

RP0 si tiene 0, y accedemos en la direccin de memoria RAM 0x05 al puerto A


en el banco de memoria 0 que es la direccin absoluta de la memoria 0x05 y si
tiene 1 accedemos al banco de memoria 1 que seria la direccin absoluta 0x85
y no la 0x05 como nosotros ordenamos, de nada valdra direccionar una vez
mas la 0x05 porque estaramos en la direccin a partir de la 0x80 +0x05 que
es la memoria banco 1 en su posicin 0x05
En el banco 0 y en el banco 1 la direccin de STATUS es la misma, solo para
ciertos registros se repiten direcciones la informacin de 0x03 y 0x83 es lo
mismo
bcf -- bit clear limpia el contenido y pone un 0 donde se direccione
bcf status,rp0 ; nos asegura que podemos seleccionar registros en el banco
0
pero en realidad la instruccin seria bcf 0x03,0x05 ese 3 y ese 5 se declaran
al principio por el usuario o programa auxiliar como:

STATUS
RP0

equ
equ

0x03
0x05

bcf status,rp0 ser una instruccin un poco redundante cada vez que
queramos mandar algo a los puertos A puerto B para asegurar que lo
estamos haciendo.

Si quiero acceder al banco 1 a la RAM a partir la direccin 80 tendr que usar el


manejo de bits, atreves de establecer unos (Bit SET), SET indica que se
establece a 1

BST STATUS,RP0
Con esto ya es accesible el banco de memoria 1, donde estn registros que se
configurar antes de mandar los datos del PIC al mundo, aqu se configuran los
puertos A y puerto B en la direccin 0x85 registro TRIS A y 0x86 registro TRIS B
solo se configuran en estos registros, en el otro, los registros en Banco 0 se da
el manejo real de esos pines al exterior, en el banco 0 escribimos y leemos los
1 y 0 de los puertos en la direccin 0x5 y 0x06.
Configurando como salida todo el puerto A, el Puerto A direccin 0x05 solo
tiene 5Bits en un registro que se usa como de 8 pero no son utiles solo los 5
primeros menos significativos .
Bit 7 Bit 6 Bit 5
X
Y esta conectado a

X
NC

Bit 4

X
NC

Bit 3 Bit 2 Bit 1 Bit 0

A4
NC

A3
pin3

A2

A1

A0

pin2 pin1 pin16 pin15

El TRIS A se encuentra en la 0x85 pero es lo mismo que 0x05 con el bit de RP0
en 1
Bit 7 Bit 6 Bit 5
X

Bit 4

Bit 3 Bit 2 Bit 1 Bit 0

A4

A3

A2

A1

A0

Configuracin PORTA Salida


BST STATUS,RP0
movlw 0x00

; cargar un cero en w

movwf 0x85
0 en trisa

; todo el puerto se usa como salida output =

ya puedo escribir en el registro y estas cambiaran el voltaje de en los pines a


lgico 1
bcf STATUS, RP0
movlw 0x1f ; o tambin 0xFF
movwf PORTA
Bit
RAM (banco 0) direccion 03h
DC, C

STATUS

2 1

IRP, RP, RP0, /TO#, /PD#, Z,

El registro de estado tambin tiene bit PD# para decir que se ha ejecutado y
entrado al modo de bajo consumo sleep con la instruccin del mismo nombre,
se activa en 0 y solo tras la conexin a la alimentacin o ejecutando clrwdt se
pone a 1.
Bit TO# que se activa tras desbordarse el perro guardin en 0 y se pone a uno
tras conectarse a la alimentacin o despus de las instrucciones un clrwdt o
sleep.
Estos dos PD# y TO# son Bit`s en el registros que no se pueden modificar, solo
indican porque se genero un reset.
Bit`s de Acarreo(C, DC) y Cero (Z de Zero)
El Bit Z es importante para control de programa como en la comparacin de
datos y para indicar si el resultado fue cero.
El Bit de acarreo sirve para decir cuando en una operacin ocurri un resultado
en numero mas grande de 8 bits y se utiliza para agregar en la siguiente
operacin.
En la funcin de rotacin de un registro, el resultado es el bit que va dejando el
registro, y se pone en el acarreo, tambin es el lugar de donde se agregan bits
al registro. Rota usando el acarreo
Puertos A y B
En los puertos en el Pic podemos encontrar Puertos que son parte de los
registros(RAM) y al mismo tiempo son las conexiones al mundo exterior y en
algunos casos de doble propsito como salida /entrada o funcin especial de
entrada o salida de otro modulo interno interrupcin, conexin serial,
comparador, ADC, etc
Se declaran en la memoria RAM como la direccin 05 que corresponden al
puerto A este solo tiene implementado 5 bits pero se ajusta a una direccin de
un byte de los cuales los mas altos son

X X X A4 A3 A2 A1 A0
Donde
logico

X significa que no importa su condicin

A4 hasta A0 tendran 1 0

La funcin de este puerto estar determinada por el registro TRISA que esta en
la misma direccin 5 pero en otra memoria, el micro tiene o lo conforman dos
memorias RAM que forman el BANCO de memoria en el BANCO 0 esta la
direccin 5 del puerto A pero esta es la memoria 0, la direccin para TRISA es
la misma 5 pero en otra memoria en el BANCO 1 esto lo controlamos con el Bit

RP0 del registro status, un 0 en este bit direcciona la memoria 0 un 1 en RP0


direcciona la memoria 1,
RP0 nos cambia cuando estamos en la direccion 5 de los registros RAM entre
Port A y TRIS A
La direccin 5h del banco 1 se puede acceder con la direccin 85h porque la
memoria 1 empieza en la direccin 80h aun as seria lo mismo que usar la 5h
pero siempre el RP0 deber estar en 1
Configuracion pic 18

Fuses para Pic C copiler


PLL1 No PLL PreScaler
PLL2 Divide By 2(8MHz oscillator
input)
PLL3 Divide By 3(12MHz oscillator
input)
PLL4 Divide By 4(16MHz oscillator
input)
PLL5 Divide By 5(20MHz oscillator
input)
PLL6 Divide By 6(24MHz oscillator
input)
PLL10 Divide By 10(40MHz oscillator
input)
PLL12 Divide By 12(48MHz oscillator
input)
CPUDIV1
No System Clock
Postscaler
CPUDIV2
System Clock by 2
CPUDIV3
System Clock by 3
CPUDIV4
System Clock by 4
USBDIV
USB clock source
comes from PLL divide by 2
NOUSBDIV USB clock source
comes from primary oscillator
INTXT Internal Oscillator, XT used by
USB
INTHS Internal Oscillator, HS used by
USB
HS
High speed Osc (> 4mhz for
PCM/PCH) (>10mhz for PCD)
HSPLL High Speed Crystal/Resonator
with PLL enabled
XT
Crystal osc <= 4mhz for
PCM/PCH , 3mhz to 10 mhz for PCD
XTPLL Crystal/Resonator with PLL
enabled
EC_IO External clock
EC
External clock with CLKOUT
ECPIO External Clock with PLL
enabled, I/O on RA6
ECPLL External Clock with PLL
enabled and Fosc/4 on RA6

INTRC_IO
Internal RC Osc, no
CLKOUT
INTRC Internal RC Osc
NOFCMEN Fail-safe clock monitor
disabled
FCMEN
Fail-safe clock monitor
enabled
NOIESO
Internal External Switch
Over mode disabled
IESO Internal External Switch Over
mode enabled
NOPUT
No Power Up Timer
PUT Power Up Timer
BROWNOUT_SW
Brownout
controlled by configuration bit in
special file register
BROWNOUT_NOSL Brownout
enabled during operation, disabled
during SLEEP
BROWNOUT Reset when brownout
detected
NOBROWNOUT
No brownout
reset
BORV46
Brownout reset at 4.6V
BORV43
Brownout reset at 4.3V
BORV20
Brownout reset at 2.0V
BORV28
Brownout reset at 2.8V
NOVREGEN USB voltage regulator
disabled
VREGEN
USB voltage regulator
enabled
NOWDT
No Watch Dog Timer
WDT Watch Dog Timer
WDT128
Watch Dog Timer uses
1:128 Postscale
WDT64
Watch Dog Timer uses
1:64 Postscale
WDT32
Watch Dog Timer uses
1:32 Postscale
WDT16
Watch Dog Timer uses
1:16 Postscale
WDT256
Watch Dog Timer uses
1:256 Postscale

WDT512
Watch Dog Timer uses
1:512 Postscale
WDT8 Watch Dog Timer uses 1:8
Postscale
WDT4 Watch Dog Timer uses 1:4
Postscale
WDT2 Watch Dog Timer uses 1:2
Postscale
WDT1 Watch Dog Timer uses 1:1
Postscale
WDT32768 Watch Dog Timer uses
1:32768 Postscale
WDT16384 Watch Dog Timer uses
1:16384 Postscale
WDT8192
Watch Dog Timer uses
1:8192 Postscale
WDT4096
Watch Dog Timer uses
1:4096 Postscale
WDT2048
Watch Dog Timer uses
1:2048 Postscale
WDT1024
Watch Dog Timer uses
1:1024 Postscale
CCP2C1
CCP2 input/output
multiplexed with RC1
CCP2B3
CCP2 input/output
multiplexed with RB3
PBADEN
PORTB pins are
configured as analog input channels
on RESET
NOPBADEN PORTB pins are
configured as digital I/O on RESET
LPT1OSC
Timer1 configured for
low-power operation
NOLPT1OSC Timer1 configured for
higher power operation
MCLR Master Clear pin enabled
NOMCLR
Master Clear pin used
for I/O
STVREN
Stack full/underflow will
cause reset
NOSTVREN Stack full/underflow will
not cause reset
LVP Low Voltage Programming on
B3(PIC16) or B5(PIC18)

NOLVP
No low voltage
prgming, B3(PIC16) or B5(PIC18)
used for I/O
ICPRT ICPRT enabled
NOICPRT
ICPRT disabled
NOXINST
Extended set extension
and Indexed Addressing mode
disabled (Legacy mode)
XINST Extended set extension and
Indexed Addressing mode enabled
NODEBUG No Debug mode for ICD
DEBUG
Debug mode for use
with ICD
NOPROTECT Code not protected
from reading
PROTECT
Code protected from
reads
CPB Boot Block Code Protected
NOCPB
No Boot Block code
protection
CPD Data EEPROM Code Protected
NOCPD
No EE protection
WRT Program Memory Write
Protected
NOWRT
Program memory not
write protected
RTC configuration registers write
protected
NOWRTC
configuration not
registers write protected
WRTB Boot block write protected
NOWRTB
Boot block not write
protected
WRTD Data EEPROM write protected
NOWRTD
Data EEPROM not write
protected
EBTR Memory protected from table
reads
NOEBTR
Memory not protected
from table reads
EBTRB
Boot block protected
from table reads
NOEBTRB
Boot block not
protected from table reads