Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
PIC 16F877
1
1 Caractersticas relevantes del PIC16F877
1. Variantes principales
Rango de voltaje
Tipo de memoria
Estndar (4.5 a 6 volts) Extendido (2.5 a 6 volts)
EEPROM, OTP PIC16CXXX PIC16LCXXX
ROM PIC16CRXXX PIC16LCRXXX
Flash PIC16FXXX PIC16LFXXX
2
1.1.1. Empaquetados
3
1.1.2. Configuration word (2007H)
13 12 11 10 9 8 7 6 5 4 3 2 1 0
CP1 CP0 DEBUG - WRT CPD LVP BODEN CP1 CP0 #PWRTE WDTE FOSC1 FOSC0
1.1.3. Oscilador
Los PIC de rango medio permiten hasta 4 diferentes modos para el oscilador. El usuario
puede seleccionar alguno de estos 4 modos programando 2 bits de la palabra de
configuracin del dispositivo denominados: FOSC1 y FOSC0, ubicados en un registro
especial de configuracin en la localidad 2007H de la memoria de programa.
Observacin: Algunos PICs poseen un modo de oscilacin que les permite usar una
resistencia y un capacitor interno calibrados para 4 Mhz.
2. Tipos de Osciladores
Los tres modos LP, XT y HS usan un cristal o resonador externo, la diferencia sin embargo
es la ganancia de los drivers internos, lo cual se ve reflejado en el rango de frecuencia
admitido y la potencia consumida. A continuacin se describe los diferentes tipos de
osciladores:
a. Cristal externo: En los tres modos mostrados en la tabla anterior se puede usar un
cristal o resonador cermico externo. En la siguiente figura se muestra la conexin
de un cristal a las patitas OSC1 y OS2 del PIC.
5
Este modo slo se recomienda cuando la aplicacin no requiera una gran
precisin en la medicin de tiempos.
c. Oscilador externo. Tambin es posible conectar una seal de reloj generada mediante
un oscilador externo a la patita OSC1 del PIC. Para ello el PIC deber estar en uno de
los tres modos que admiten cristal (LP, XT o HS). La conexin se muestra en la siguiente
figura:
d. Oscilador interno de 4Mhz. En los PICs que poseen este modo de oscilacin, (modo
INTRC) el PIC usa un arreglo RC interno que genera una frecuencia de 4 Mhz con un
rango de error calibrable de 1.5%. Para calibrar el error de oscilacin se usan los
bits CAL3, CAL2, CAL1 Y CAL0 del registro OSCCAL.
En resumen, los modos XT, LP o HS, el cristal o resonador se conecta entre las patillas
OSC1/CLKIN y OSC2/CLKOUT, pero tambin permite conectar un oscilador externo a la
patilla OSC1/CLKIN. En la siguiente Figura se muestra los modos de configuracin del
oscilador principal del sistema:
6
Conexin del Cristal o Oscilador en modo RC Conexin de Oscilador
Resonador en modo (HS, XT o externo en modo (HS, XT o
LP) LP)
Capacitores recomendados
Modo Frecuencia tpica
C1 C2
LP 32 khz 33 a 68 pf 33 a 68 pf
200 khz 15 a 30 pf 15 a 30 pf
XT 200 khz 47 a 68 pf 47 a 68 pf
1 Mhz 15 a 30 pf 15 a 30 pf
4 Mhz 15 a 30 pf 15 a 30 pf
HS 4 Mhz 15 a 30 pf 15 a 30 pf
8 Mhz 15 a 30 pf 15 a 30 pf
20 Mhz 15 a 30 pf 15 a 30 pf
7
1.2 El Reset
Con la lectura de los bits #TO y #PD del registro de STATUS y los bits POR y BOR del
registro PCON (83h) sabremos en todo momento quin y cmo se produjo un reset.
Llevando a cero la patilla #MCLR se puede generar un reset. Si no se desea ningn sistema de
reset externo, esta patilla se puede conectar directamente a la alimentacin o a travs de una
resistencia.
Cuando se conecta la tensin de alimentacin a los circuitos, sobre todo cuando la fuente de
alimentacin tiene grandes condensadores de filtrado, la salida de tensin continua tarda en
crecer desde cero hasta alcanzar el mximo valor; una vez se hayan sobrepasado los 1, 7 V y
8
antes de llegar a la mxima tensin, en estos pocos milisegundos el microcontrolador tiene
tiempo para ejecutar algunas miles de instrucciones, pero antes de que comiencen a ser
ejecutadas hay que estar seguro de que el resto de los componentes que constituyen el diseo se
han terminado de inicializar. Es aqu donde se aprovechan las ventajas del Power-On Reset y si
se ha habilitado, las del temporizador Power-Up Timer (PWRT), bit configurable en la
programacin del microcontrolador) que aade 72 milisegundos adicionales al impulso interno
de reset. Para la mayora de los casos con el POR y el tiempo aadido por el PWRT ser ms
que suficiente para que, tanto la tensin de alimentacin como el resto de los circuitos, se hayan
estabilizado. No obstante, si se desea que el microcontrolador permanezca inactivo hasta que la
tensin de alimentacin est muy prxima a su mximo valor, no queda ms remedio que,
adems de habilitar el PWRT, se instale un circuito externo de reset con tensin de disparo
ajustable, tres resistencias y un transistor as lo garantizan (ver el esquema de la Figura anterior).
Los circuitos internos de reset tambin tienen un circuito de control (OST, Oscillator Start-up
Timer) que aade un retardo de 1.024 ciclos del reloj externo despus de los 72 ms.
proporcionados por el PWRT. Este retardo asegura que el oscilador externo ha terminado de
estabilizarse antes de que la CPU comience a ejecutar instrucciones.
Otro de los modos de reset es el Brown- Out Reset que tiene un comportamiento muy similar al
POR, slo que los mrgenes de tensin son diferentes, en este caso se sitan entre 3,8 V y 4,2 V,
en realidad lo que trata de detectar, es que la tensin de alimentacin no tenga fallos o pequeas
cadas de voltaje durante periodos de tiempo muy cortos.
No sustituye a los circuitos de reset es una forma muy eficaz de controlar los pequeos fallos que
se pueden producir en la alimentacin, bien por cortes rpidos de la tensin de entrada, o bien
porque se ha producido un pico de corriente muy elevado y la fuente de alimentacin no ha sido
capaz de proporcionarlo y ha cado su tensin.
En el diagrama de bloques del circuito de reset dentro del chip de la siguiente Figura se
pueden ver, los circuitos PWRT y OST, el primero est formado por un contador de 10 bits que
se encarga de contar 1.024 impulsos de reloj interno formado por una red RC (este oscilador no
tiene nada que ver con el oscilador principal). Este es el circuito encargado de proporcionar los
72 milisegundos de retardo; una vez hayan transcurrido se habilita un segundo contador (OST)
tambin de 10 bits, que se encarga de contar 1.024 impulsos del oscilador externo; suficientes
ciclos para que al finalizar la cuenta el oscilador ya est totalmente estabilizado.
9
1.3. Caractersticas generales del PIC16F877
La siguiente es una lista de las caractersticas que comparte el PIC16F877 con los dispositivos
ms cercanos de su familia:
1. CPU:
- Tecnologa RISC
- Slo 35 instrucciones que aprender
- Todas las instrucciones se ejecutan en un ciclo de reloj, excepto los saltos que requieren
dos
- Frecuencia de operacin de 0 a 20 MHz (200 nseg de ciclo de instruccin)
- Opciones de seleccin del oscilador
2. Memoria:
- Hasta 8k x 14 bits de memoria Flash de programa
- Hasta 368 bytes de memoria de datos (RAM)
- Hasta 256 bytes de memoria de datos EEPROM
- Lectura/escritura de la CPU a la memoria flash de programa
- Proteccin programable de cdigo
- Stack de hardware de 8 niveles
3. Reset e interrupciones:
- Hasta 14 fuentes de interrupcin
- Reset de encendido (POR)
- Timer de encendido (PWRT)
- Timer de arranque del oscilador (OST)
- Sistema de vigilancia Watchdog timer.
10
4. Otros:
- Modo SLEEP de bajo consumo de energa
- Programacin y depuracin serie In-Circuit (ICSP) a travs de dos patitas
- Rango de voltaje de operacin de 2.0 a 5.5 volts
- Alta disipacin de corriente de la fuente: 25mA
- Rangos de temperatura: Comercial, Industrial y Extendido
- Bajo consumo de potencia:
Menos de 0.6mA a 3V, 4 Mhz
20 A a 3V, 32 Khz
menos de 1A corriente de standby (modo SLEEP).
5. Perifricos:
PIC16F873 PIC16F874
Perifrico Caractersticas
PIC16F876 PIC16F877
3a5
Puertos PortA,B,C PortA,B,C,D,E con lneas digitales programables individualmente
Paralelos
Contador/Temporizador de 8 bits con pre-escalador de
Timer0 Timer0
8 bits
3 Timers Timer1 Timer1 Contador/Temporizador de 16 bits con pre-escalador
Temporizador de 8 bits con pre-escalador y post-
Timer2 Timer2
escalador de 8 bits y registro de periodo
Captura Captura 16 bits, 1.5 nseg de resolucin mxima
2 mdulos
Comparacin Comparacin 16 bits, 200 nseg de resolucin mxima
CCP
PWM PWM 10 bits
1 Conversor
AN0,...,AN4 AN0,...,AN7 de 10 bits, hasta 8 canales
A/D
SSP SSP Puerto Serie Sncrono
Puertos
USART/SCI USART/SCI Puerto Serie Universal
Serie
ICSP ICSP Puerto serie para programacin y depuracin in circuit
Puerto
Paralelo PSP PSP Puerto de 8 bits con lneas de protocolo
Esclavo
11
12
1.5. Descripcin de la CPU
1. Ciclo de instruccin
El registro Program Counter (PC) es gobernado por el ciclo de instruccin como se muestra en
la siguiente figura. Cada ciclo de instruccin la CPU lee (ciclo Fetch) la instruccin guardada
en la memoria de programa apuntada por PC y al mismo tiempo ejecuta la instruccin
anterior, esto debido a una cola de instrucciones que le permite ejecutar una instruccin
mientras lee la prxima:
Como puede verse, cada ciclo de instruccin (Tcy = 4Tosc) se compone a su vez de cuatro
ciclos del oscilador (Tosc= 1/Fosc)). Cada ciclo Q provee la sincronizacin para los
siguientes eventos:
Debido a esto cada ciclo de instruccin consume 4 ciclos de reloj, de manera que si la
frecuencia de oscilacin es Fosc, Tcy ser 4/Fosc.
13
PCL = El byte de orden bajo
PCH = El byte de orden alto
Registro W. Registro de 8 bits que siempre es uno de los operandos y puede guardar
resultados temporales de las operaciones realizadas por la ALU.
14
1 = Acarreo en la suma
0 = No acarreo en la suma
En la resta es al contrario
Notacin:
# = Negacin
R = Bit leble, W= Bit Escribible, U= No implementado (se lee como 0)
-n = Valor despus del Reset de encendido
Banderas
- Z. Este bit se pone (=1) para indicar que el resultado de la ltima operacin
aritmtica o lgica fue cero, de lo contrario se limpia (=0)
- DC. Acarreo/ prstamo proveniente del cuarto bit menos significativo. Funciona
igual que el bit C, pero para operaciones de 4 bits.
Las restas se realizan sumando el complemento a dos del segundo operando, por ejemplo,
para los datos 4FH y 25H:
15
1.6. Conjunto de Instrucciones de Rango Medio
En la siguiente tabla se resumen las 35 instrucciones que reconoce la CPU de los PIC de
medio rango, incluyendo su mnemnico, tiempo de ejecucin, cdigo de mquina y
afectacin de banderas:
16
1. Descripcin de algunas instrucciones
Ejemplo 1
Para realizar la suma y la resta mencionadas en la seccin anterior (4Fh+25h y 4Fh-25h) se
pueden usar las siguientes instrucciones:
Suma MOVLW 0x4F ;carga el primer sumando en W
ADDLW 0x25 ;suma W+25h y guarda el resultado en W
...
Ejemplo 2
Se anota como comentario a un lado de cada instruccin como queda el contenido de W, del
registro 20h y de las banderas C, DC y Z:
inicio MOVLW 0xF4 ;W=F4h, 0x20= ??, C=?, DC=?, Z=?
ADDLW 0x0B ;W=FFh, 0x20= ??, C=0, DC=0, Z=0
MOVWF 0X20 ;W=FFh, 0x20=FFh, C=0, DC=0, Z=0
INCF 0x20,1 ;W=FFh, 0X20=00h, C=0, DC=0, Z=1
INCF 0X20,0 ;W=01h, 0x20=00h, C=0, DC=0, Z=0
COMF 0X20,1 ;W=01h, 0x20=FFh, C=0, DC=0, Z=0
XORWF 0x20,1 ;W=01h, 0x20=FEh, C=0, DC=0, Z=0
MOVF 0x20,0 ;W=FEh, 0x20=FEh, C=0, DC=0, Z=0
Cada instruccin en lenguaje de mquina (binario) del PIC contiene un cdigo de operacin
(opcode) el cual puede ser de 3 a 4 o 6 bits, dependiendo del tipo de instruccin.
A continuacin se describe el formato para cada tipo de instruccin de los PIC de rango
medio:
17
El bit d especifica el destino del resultado de la operacin:
d = 0: destino W
d = 1: destino f
f = direccin de 7 bits del archivo de registros.
b : Especificacin en tres bits del bit sobre el que se va a operar f = direccin de 7 bits del
archivo de registros.
c. Operaciones con literales y de control
Formato para literales:
Los PIC tienen dos tipos de memoria: Memoria de Datos y Memoria de programa, cada bloque
con su propio bus: Bus de datos y Bus de programa, para poder permitir el acceso simultneo a
estos dos bloques; por lo cual cada bloque puede ser accedido durante un mismo ciclo de
oscilacin.
Los PIC de rango medio poseen un registro Contador del Programa (PC) de 13 bits, capaz de
direccionar un espacio de 8K x 14 posiciones de memoria de tipo FLASH, como todas las
instrucciones son de 14 bits, esto significa un bloque de 8k instrucciones. Acceder a una posicin
de memoria no implementada, provoca la lectura o escritura de la posicin de memoria
envolvente.
18
El bloque total de 8K palabras x 14 bits de memoria de programa est subdividido en 4
pginas de 2K x 14. En la siguiente figura se muestra esta organizacin.
1. Vector de Reset
Cuando ocurre un reset el contenido del PC es forzado a cero, sta es la direccin donde la
ejecucin del programa continuar despus del reset, por ello se le llama direccin del
vector de reset.
2. Vector de interrupcin
El registro PCLATH no es modificado en esta circunstancia, por lo cual habr que tener
cuidado al manipular el registro PC (saltos y llamadas a subrutina) dentro de la Rutina de
Atencin a la Interrupcin.
El registro contador del programa (PC) especifica la direccin de la instruccin que la CPU
buscar (fetch) para ejecutarla.
19
El PC consta de 13 bits, separados en dos partes: como se muestra en la figura siguiente:
El byte de orden bajo es llamado el registro PCL, mientras que el byte de orden alto es
llamado registro PCH. Este ltimo contiene los bits PC<12:8> y no se puede leer o
escribir directamente Todas las actualizaciones al registro PCH deben ser hechas a travs
del registro PCLATH.
20
4. Paginacin
Para saltar entre una pgina y otra, los bits ms significativos del PC debern ser
modificados. Debido a que las instrucciones GOTO y CALL slo pueden direccionar un
bloque de 2K (pues usan una direccin de 11 bits) deben existir otros dos bits que
acompleten los 13 bits del PC para moverse sobre los 8K de memoria de programa.
Estos dos bits extra se encuentran en un SFR denominado PCLATH (Program Counter
Latch High) en sus bits PCLATH<4:3>. Por esto antes de un GOTO o un CALL el usuario
deber asegurarse que estos bits apunten a la pgina deseada.
5. Memoria de Stack
21
RETLW o RETFIE el contenido de la posicin actual del stack es colocado en el PC y el
apuntador de stack es decrementado en 1.
La memoria de datos RAM consta de dos reas mezcladas y destinadas a funciones distintas:
Los SFR son localidades asociadas especficamente a los diferentes perifricos y funciones de
configuracin del PIC y tienen un nombre especfico asociado con su funcin. Mientras que los
GPR son memoria RAM de uso general.
1. Bancos de memoria
Direccionamiento
RP1:RP0 Banco
Indirecto (IRP)
0 0 0
0
0 1 1
1 0 2
1
1 1 3
Cada banco consta de 128 bytes (de 00h a 7Fh). En las posiciones ms bajas de cada banco
se encuentran los SFR, y arriba de stos se encuentran los GPR. Toda la memoria de
datos est implementada en Ram esttica.
Los Registros de Funciones Especiales (SFR) son registros usados por la CPU y los mdulos
perifricos para controlar el funcionamiento deseado del dispositivo. Estos registros estn
realizados como RAM esttica. Estos Registros SFR estn reflejados en varios bancos para
reducir el cdigo y tener un acceso ms rpido.
22
Los correspondientes a la CPU, y
Los que controlan los perifricos.
Un listado de los Registro Especiales de los PIC 16F87X se muestra en Anexo 3 Registro
Especiales de los PIC16F87x.
3. Direccionamiento Directo
4. Direccionamiento indirecto
El registro INDF mismo al leerse de manera indirecta (con FSR=0) producir un cero. Y
al escribirse de manera indirecta no es afectado.
23
las localidades de la memoria RAM desde 20h a 2Fh.
Ejemplo 3.
Limpiar un bloque de memoria de datos desde la localidad 20h a la localidad 2Fh
CLRF STATUS ;Selecciona Banco cero
MOVLW 0X20 ;carga valor de apuntador a RAM
MOVWF FSR ;inicializa apuntador
Ejemplo 4.
Switcheo entre bancos de memoria RAM
CLRF STATUS ;Limpia registro STATUS (Banco 0)
BSF STATUS,5 ;RP0=1, (Banco 1)
BSF STATUS,6 ;RP1=1, (Banco 3)
BCF STATUS,5 ;RP0=0, (Banco 2)
24
5. El Archivo de Registros
Aunque el archivo de registros en RAM puede variar de un PIC a otro, la familia del
PIC16F87x coincide casi en su totalidad. En la siguiente figura se muestra a detalle el
mapa de este archivo de registros y su organizacin en los cuatro bancos que ya se
describieron.
Cada uno de los registros de propsito especial, est asociado a un dispositivo interno del
cc. En el siguiente captulo se tratar con detalle el uso de cada uno de estos dispositivos y
de los registros asociados a l.
25
2. Programacin del PIC16F877 en Assembler
2.1 Palabra de Configuracin (FUSES)
Luego de hacer un programa es lgico que se quiera grabar en el PIC para poder probar su
funcionamiento, para esto existen infinidad de grabadores y softwares que permiten hacer esta
tarea. Una vez grabado el programa muchas veces no funciona la aplicacin y en muchos casos
se debe a que no se configura antes el software para grabar el PIC, esta configuracin se trata de
los FUSES.
Bueno, los PIC's incluyen en una posicin reservada de memoria (2007H) la famosa Palabra de
Configuracin y a la cual solo se accede durante la grabacin. El cmo configuremos este
registro determinar las caractersticas de funcionamiento del PIC. En la siguiente figura se
muestra l Palabra de Configuracin:
13 12 11 10 9 8 7 6 5 4 3 2 1 0
CP1 CP0 DEBUG - WRT CPD LVP BODEN CP1 CP0 #PWRTE WDTE FOSC1 FOSC0
bit 13-12:
bit 5-4: CP1:CP0: Bits de proteccin del cdigo de la memoria Flash de programa (2)
11 = Sin proteccin de cdigo
10 = 1F00h a 1FFFh cdigo protegido (PIC16F877, 876)
10 = 0F00h a 0FFFh cdigo protegido (PIC16F874, 873)
01 = 1000h a 1FFFh cdigo protegido (PIC16F877, 876)
01 = 0800h a 0FFFh cdigo protegido (PIC16F874, 873)
00 = 0000h a lFFFh cdigo protegido (PIC16F877, 876)
00 = 0000h a 0FFFh cdigo protegido (PIC16F8741873)
26
1 = Patillas RB3/PGM tienen funciones PGM , bajo voltaje de programacin
habilitado
0 = RB3 es digital I/O, HV habilitado, #MCLR se emplea para programacin
Nota
(1)= Al habilitar el Brown-out Reset se habilita automticamente el temporizador Power-up
(PWRT) .Habilitando el Power-up Timer se habilita al mismo tiempo el Brown-out
Reset
(2)= Los dos pares de bit CP1:CP0 tienen que tener el mismo valor para habilitar el
esquema de la proteccin del cdigo listado.
WRT: Permiso para escritura en Modo FLASH. Se usa cuando en nuestro programa accedemos
a la memoria de datos EEPROM.
LVP: Bit de Permiso para Programacin en Bajo Voltaje. Se usa con algunos modelos de PIC's
sobretodo con los LF que trabajan con voltajes de 3V hasta 6V.
WDTE: Bit de Permiso del Timer del Perro Guardin. Se activa cuando se usa el Perro
Guardin o WDT en nuestras aplicaciones, se ver ms adelante.
27
FOSC1-FOSC0: Sirve para elegir el tipo de Xtal que usamos. LP (Baja potencia, de 35 a
200kHz), XT (Estndar, de 100kHz a 4MHz), HS (Alta Velocidad, ms de 4MHz), RC
(Cuando usamos una Resistencia y un Condensador en vez de un Xtal).
2. En el cdigo de programa. Es este caso se debe agregar una lnea de cdigo, con la
Directiva de Ensamblador __CONFIG, como se indica a continuacin:
De esta manera se asegura de tener configurados los FUSES usemos el software que usemos
(Ese cdigo hace lo mismo que la configuracin en WinPIC800 que mostramos arriba).
;==========================================================================
;
; Configuration Bits
;
;==========================================================================
28
_DEBUG_ON EQU H'37FF'
_DEBUG_OFF EQU H'3FFF'
_WRT_ENABLE_ON EQU H'3FFF'
_WRT_ENABLE_OFF EQU H'3DFF'
_CPD_ON EQU H'3EFF'
_CPD_OFF EQU H'3FFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'
Algunos fuses que son comunes a todos los PICS, se muestran a continuacin:
DA abcdef
DW 0x39, 0x45B
DT Genera una serie de instrucciones RETLW, una por cada expresin que acompaa a
la directiva.
DT 1, 2, 3, 5, 7
FILL 0x190F, 5
RES 64
_ _CONFIG 0x3F43
_ _IDLOCS 1234
2. Directivas de Control
CBLOCK 0x20
A, B, C, D ;A = 0x20, B=0x21, C=0x22, D=0x23
ENDC
30
EQU esos smbolos no pueden luego cambiar de valor (son constantes). Sintaxis distinta,
pero igual efecto.
CONSTANT longitud=0x10
longitud EQU 0x10
SET esos smbolos pueden cambiar de valor (son variables). Sintaxis distinta, pero igual
efecto.
VARIABLE BUFFER=0x20
BUFFER SET 0x20
#DEFINE Se emplea para definir una etiqueta para una tira de caracteres siempre que
aparezca la etiqueta, se sustituye directamente por la tira.
#UNDEFINE bit_0
ORG Sita el cdigo que se vaya generando despus a partir de la posicin especificada.
ORG 0x100
END
INCLUDE c:\mplab\PIC16F877.INC
INCLUDE <PIC16F877.INC>
PROCESSOR 16F877
IF expresin
Grupo de directivas e instrucciones que se ensamblan si es cierta la expresin
ENDIF
p.e. IF versin==1
MOVLW 0x0A
MOVWF PORTB
ENDIF
IFDEF etiqueta
Puede sustituir en las dos directivas anteriores IF expresin
Se ensambla si est definida la etiqueta
#DEFINE DE_B_a_A 1
.
p.e.
IFDEF DE_B_a_A
MOVF PORTB,w
MOVWF PORTA
ELSE
MOVF PORTA,W
MOVWF PORTB
ENDIF
32
IFNDEF etiqueta
Puede sustituir en las dos directivas anteriores IF expresin
Se ensambla si no est definida la etiqueta
WHILE expresin
Grupo de instrucciones y directivas que se ensamblan mientras la expresin sea cierta
ENDW
p.e. VARIABLE i
i=0
WHILE i < CONTADOR
RETLW i
i+=1
ENDW
4. Macros
Una macro es un conjunto de instrucciones que pueden ser insertadas en el cdigo fuente
mediante una simple llamada a macro.
Una macro debe ser definida primero antes de poder ser llamada en el cdigo fuente
siguiente.
Una macro puede llamar a otra macro o a s misma de manera recursiva
ENDM
Utilizacin de una macro (llamada):
Etiqueta_de_Macro arg1, arg2, arg3
p.e. Definiciones:
Banco_0 MACRO
bcf STATUS,RP0
bcf STATUS,RP1
ENDM
Banco_1 MACRO
bsf STATUS,RP0
bcf STATUS,RP1
ENDM
Utilizacin:
movlw 0xF0
Banco_1
movwf TRISB
Banco_0
33
Para mayor informacin ver Anexo2 MPASM, el ensamblador de Microchip, o el
archivo mpasm2005.pdf.
Un programa est constituido por una lista de instrucciones en secuencia, cada una de las cuales
identifican unvocamente las funciones de base que los PIC estn en grado de desarrollar. Cada
instruccin est representada por un cdigo operativo ( en ingls operation code o ms
brevemente opcode ) a 14 bit y es almacenada en una posicin de memoria EEPROM. Un
ejemplo de opcode en anotacin binaria se muestra a continuacin:
0100H
o
H0100
o
0x0100
Que representan exactamente el mismo valor pero en forma ms breve. La letra H al final del
valor 0100, indica el tipo de notacin (hexadecimal). El mismo valor puede ser representado en
assembler con la notacin 0x100 derivada del lenguaje C o H0100. Estos cdigos,
completamente privados de sentido para un ser humano, son los nicos que el PIC estan en grado
de entender.
La primera convencin es aquella de asociar a cada opcode ( en total 35 para l PIC16F87x ) una
sigla mnemnica es decir, una sigla que ayude a recordar el significado de la instruccin.
Por ejemplo, el opcode 0100H corresponde a la instruccin mnemnica CLRW que es la forma
breve de la instruccin CLEAR W REGISTER, es decir, encera el registro W.
Otras convenciones permiten definir las variables, las constantes, las etiquetas (label) de
referencia a las direcciones de memoria, etc. El conjunto de estas convenciones facilita la
escritura de un programa para los PIC que viene implemento en lenguaje assembler. Un
programa escrito en lenguaje assembler puede ser escrito en un PC utilizando cualquier
procesador de palabra o editor en grado de generar archivos de tipo ASCII. Un archivo ASCII o,
mejor dicho, un archivo de texto que contenga un programa en assembler es llamado source o
fuente assembler.
Una vez preparado el source assembler, es necesario un programa que traduzca las instrucciones
mnemnicas y todas las otras formas convencionales con las cuales fue escrito el source en una
serie de nmeros ( los opcode ) reconocibles directamente por el PIC. Este programa se llama
compilador assembler o assemblador.
34
En la figura siguiente viene esquematizado el flujo de operaciones y el archivo (file) que se
genera para pasar de un source assembler a un PIC programado.
LIST
; P16F877.INC Standard Header File, Version 1.00 Microchip Technology, Inc.
NOLIST
; This header file defines configurations, registers, and other useful bits of
; information for the PIC16F877 microcontroller. These names are taken to match
; the data sheets as closely as possible.
;==========================================================================
;
; Revision History
;
;==========================================================================
;1.12 01/12/00 Changed some bit names, a register name, configuration bits
; to match datasheet (DS30292B)
;1.00 08/07/98 Initial Release
;==========================================================================
;
; Verify Processor
;
;==========================================================================
IFNDEF __16F877
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
;==========================================================================
;
; Register Definitions
;
;==========================================================================
W EQU H'0000'
F EQU H'0001'
36
PCLATH EQU H'000A'
INTCON EQU H'000B'
PIR1 EQU H'000C'
PIR2 EQU H'000D'
TMR1L EQU H'000E'
TMR1H EQU H'000F'
T1CON EQU H'0010'
TMR2 EQU H'0011'
T2CON EQU H'0012'
SSPBUF EQU H'0013'
SSPCON EQU H'0014'
CCPR1L EQU H'0015'
CCPR1H EQU H'0016'
CCP1CON EQU H'0017'
RCSTA EQU H'0018'
TXREG EQU H'0019'
RCREG EQU H'001A'
CCPR2L EQU H'001B'
CCPR2H EQU H'001C'
CCP2CON EQU H'001D'
ADRESH EQU H'001E'
ADCON0 EQU H'001F'
;==========================================================================
;
; RAM Definition
;
40
;==========================================================================
__MAXRAM H'1FF'
__BADRAM H'8F'-H'90', H'95'-H'97', H'9A'-H'9D'
__BADRAM H'105', H'107'-H'109'
__BADRAM H'185', H'187'-H'189', H'18E'-H'18F'
;==========================================================================
;
; Configuration Bits
;
;==========================================================================
LIST
Durante la compilacin del source, el compilador assembler genera una serie de archivos con
nombre idntico al source pero con extensin distinta, a continuacin se indica algunos de ellos:
.HEX es el archivo que contiene los cdigos operativos para enviar al PIC a travs del
programador.
Los archivos .LST y .ERR vienen utilizados para el control de lo realizado en la compilacin.
Solo el archivo .HEX viene utilizado realmente para programar el PIC.
41
2.4. Anlisis de un problema sencillo
1. leer NOMBRE
2. leer NOTA
3. no hay mas notas (nota<0), ir al punto 7
4. acumular las notas
5. incrementar el nmero de notas
6. ir al punto 2
7. calcular la MEDIA
8. imprimir NOMBRE
9. imprimir MEDIA
INICIO
contador0
media0
Leer: nombre
Leer: nota
mediamedia+nota
contadorcontador+1
SI
nota>=0
NO
mediamedia/contador
Imprimir:
nombre
media
FIN
42
3. Ejemplos de aplicacin del microcontrolador PIC 16F877 para
realizar la lectura y escritura de puertos de E/S digitales
3.1. Ejemplo. Construccin de un simple secuenciador a LED
Realizar un circuito para hacer encender en forma secuencial un diodo LED, cuya frecuencia de
intermitencia es determinada por una subrutina que introduce un retardo software, es decir, un
retardo basado en el tiempo de ejecucin de un ciclo continuo de instrucciones.
INICIO
LED1
Delay
LED0
SI
LED=1
NO
LED1
43
Delay
cont00
cont10
cont0cont0-1
SI
cont0<>0
NO
cont1cont1-1
SI
cont1<>0
NO
FIN
;**************************************************
; Pic by example
; LED.ASM
;
; (c) 1999, Sergio Tanzilli
; (picbyexample@picpoint.com)
; http://www.picpoint.com
;**************************************************
;Constantes
LED EQU 0
44
;Declaracin de Variables
Cont0 EQU 20H
Cont1 EQU 21H
;Reset Vector
;Start point at CPU reset
ORG 00H
bsf STATUS,RP0
bcf STATUS,RP1
movlw 11111110B
movwf TRISB
bcf STATUS,RP0
bsf PORTB,LED
MainLoop
call Delay
btfsc PORTB,LED
goto SetToZero
bsf PORTB,LED
goto MainLoop
SetToZero
bcf PORTB,LED
goto MainLoop
;Subroutines
;Software delay
Delay
clrf Cont0
clrf Cont1
DelayLoop
decfsz Cont0,1
goto DelayLoop
decfsz Cont1,1
goto DelayLoop
return
END
Se va analizar lnea por lnea el contenido del source LED.ASM, desde de la primera lnea de
cdigo.
45
o PROCESSOR es una directiva del compilador assembler que permite definir para cul
microprocesador se escribi el source. Las directivas no son instrucciones mnemnicas que
el compilador traduce en el respectivo opcode, pero si, simples indicaciones que se entrega al
compilador para determinar el funcionamiento durante la compilacin. En este caso se debe
informar al compilador que las instrucciones entregadas al source son las relativas a un
PIC16F877:
PROCESSOR 16F877
Las directivas del compilador tienen sentido solo durante la compilacin del source, por lo
tanto un PIC no podr nunca seguir una directiva.
o La directiva RADIX sirve para informar al compilador que los nmeros reportados sin
notacin, deben entenderse como nmeros decimales. Es decir, si se quiere especificar, por
ejemplo el nmero hexadecimal 10 (16 decimal) no se puede escribir solamente 10, porque
sera interpretado como 10 decimal, pero s 10H o tambin, 0x10 o tambin, H10.
RADIX DEC
o INCLUDE es otra directiva que indica al compilador incluir en el source un segundo archivo
(file) denominado P16F877.IN. El compilador se limitar a sustituir la lnea que contiene la
directiva INCLUDE con el contenido del archivo indicado y a efectuar por lo tanto la
compilacin como si fuera tambin parte del source.
INCLUDE "P16F877.INC"
o La directiva EQU es muy importante porque permite definir las constantes simblicas al
interno del source. En particular la palabra LED de ahora en adelante en el source ser
equivalente al valor 0. La finalidad principal de la existencia de la directiva EQU es la de
poder hacer los source ms legibles y de permitir cambiar los valores constantes en un nico
punto del source.
LED EQU 0
Declaracin de Variables
La directiva EQU tambin se utiliza para la declaracin de variables, porque las etiquetas
asignadas a las direcciones de memoria se utilizan como punteros. La direccin desde
empieza a definirse el rea de datos al interno del PIC es 20H para el PIC16F877, es decir,
un rea en la cual almacenar variables durante la ejecucin del programa. Esta rea coincide
con el rea RAM del PIC definida por Microchip como el rea de los FILE REGISTER.
Los file register son localizaciones RAM disponibles por el usuario. Esta direccin de inicio
es fija y no puede ser cambiada respecto a las localizaciones precedentes que son ocupadas
por otros registros especializados para uso interno.
46
Cont0 EQU 20H
Cont1 EQU 21H
Las labels Cont0 y Cont1 son marcas que en el resto del source asumir los valores de la
direcciones en las cuales fueron colocados, donde Cont0 y Cont1 son nombres escogidos
por el programador. Los nombres de las labels (etiquetas) pueden ser cualquiera a excepcin
de las palabras reservadas al compilador (tales como las instrucciones mnemnicas y las
directivas).
Una label se distingue de una constante simblica porque su valor viene colocado en fase de
compilacin y no asignado por el programador estticamente.
CBLOCK 20H
Cont0
Cont1
ENDC
Donde CBLOCK y ENDC son directivas que definen el inicio y fin del bloque de la
definicin de las variables. Y 20H es la direccin de la memoria RAM donde comienza la
declaracin de las variables Cont0 y Cont1.
o ORG es una directiva que hace referencia a una direccin en el rea de programa (en la
EEPROM) y no en el rea de datos. A partir de este punto, se empieza a insertar las
instrucciones mnemnicas que el compilador deber convertir en las oportunas opcode para
el PIC.
ORG 00H
El primer opcode seguido por el PIC despus del reset es el almacenado en la localizacin 0,
correspondiente al valor 00H insertado en la ORG.
o bcf en este caso la instruccin mnemnica bcf significa BIT CREAR FILE REGISTER es
decir, pone un 0 (condicin lgica baja) uno de los bit contenidos en la localizacin de la
RAM especificada.
- RPO y RP1 son parmetros que tambin vienen definidos en el file P17F877.INC con
los valores 05H y 06H, que corresponden al nmero del bit que se quiere poner en 1 y 0,
respectivamente. Cada file register tiene una longitud de 8 bit y la numeracin de cada
uno parte de 0 (bit menos significativo) hasta llegar a 7 (bit ms significativo).
47
Las siguientes instrucciones coloca un 1 en el quinto bit y un 0 en el sexto bit del file register
STATUS, siendo esta operacin necesaria para acceder a los file register TRISA y TRISB,
que se encuentran en el banco 1 de la memoria de datos:
o Para utilizar el puerto B del PIC, se hara movlw esta instruccin significa: MOVE
LITERAL TO W REGISTER, es decir mueva un valor constante al acumulador. En este
caso el valor constante de almacenar en el acumulador es 11111110B, es decir, un valor
binario de 8 bit donde el bit ms a la derecha representa el bit 0 o el bit menos significativo.
movlw 11111110B
Luego con la instruccin movwf que significa: MOVE W TO FILE REGISTER, es decir
mueva el valor del acumulador al registro. En este caso transfiere el valor contenido en el
acumulador (inicializado oportunamente con la instruccin movlw 11111110B) al registro
TRISB.
movwf TRISB
- TRISB es un registro que tambin es definido a travs de una directiva EQU, cuya
funcin es definir el funcionamiento de cada lnea de I/O del puerto B. En particular cada
bit con 1 del registro TRISB determina un ingreso en la respectiva lnea del puerto B
mientras cada 0 determina una salida.
En la siguiente tabla viene reportada la configuracin que asumirn los pines del puerto B del
PIC, despus de la ejecucin de esta instruccin:
Ntese como el valor 0 en el bit 0 del registro TRISB determina la configuracin en la salida
de la respectiva lnea del PIC. En la aplicacin actual esta lnea viene utilizada para activar el
LED que va a prender y apagar.
o bcf esta instruccin significa BIT CLEAR FILE REGISTER, es decir, encera el bit indicado
por el parmetro. Del punto de vista funcional esta instruccin se escogi para tener el acceso
48
a los registros internos del banco 0 en vez de los registros internos del
banco 1 de los cuales hacen parte TRISA Y TRISB.
o bsf esta instruccin significa BIT SET FILE REGISTER, es decir, setea el bit indicado por el
parmetro. En este caso se tiene acceso al LED conectado a la lnea RB0 para ponerle a 1.
- LED es el nmero de la lnea que debe poner en 1. Si recordamos bien, al inicio del
source la constante LED est definida igual 0, por lo tanto, la lnea interesada ser RB0.
o MainLoop es una label o mejor una referencia simblica hacia una direccin de memoria. El
valor de la label se calcula en fase de compilacin en base al nmero de instrucciones, a las
directivas ORG y a las otras instrucciones que de alguna manera ocupan espacio en la
memoria del PIC. En este caso, se cuentan las instrucciones a partir de la ltima directiva
ORG, y el valor que ser asignado a MainLoop es 08H.
En realidad el valor que asumen las label no tiene mucha importancia, puesto que su
finalidad es de evitar conocer la posicin precisa de los opcode en la memoria del PIC,
permitiendo de todas maneras diferenciar una determinada posicin de memoria.
En este caso la label MainLoop viene utilizada como punto de inicio de un ciclo (de ingles
loop) de encendido y de apagado del LED, es decir, una parte de cdigo que vendr repetida
cclicamente al infinito. Por lo tanto, ms adelante se encontrar una referencia a esta label.
MainLoop
o call Esta instruccin determina una llamada (del ingls call ) y una subrutina que empieza en
correspondencia con la label Delay.
Las subrutinas son de las partes del programa especializadas para efectuar una funcin
especfica. Cada vez que sea necesaria esta funcin es suficiente llamarla con una sola
instruccin, en vez de repetir cada vez todas las instrucciones necesarias para efectuarla. En
este caso la subrutina introduce un retardo igual al tiempo de encendido y apagado del LED.
call Delay
o btfsc el significado de esta instruccin es BIT TEST FLAG, SKIP IF CLEAR, es decir,
controla el estado de un bit interno de un registro y salta a la instruccin sucesiva si el valor
de tal bit es cero. En este caso, el bit a controlar corresponde a la lnea de output (salida) a
que est conectado el LED, por medio de este test se puede determinar por lo tanto si el
LED est iluminado o apagado e intervenir, es decir, si el LED est iluminado se apagar, si
est apagado se prender.
btfsc PORTB,LED
49
o goto esta instruccin es un salto incondicional ( del ingls GO TO, ir ) a la etiqueta
SetToZero donde se encontrar las instrucciones para apagar el LED. Esta instruccin
vendr saltada de la instruccin sucesiva si el LED esta ya apagado.
goto SetToZero
o Las dos siguientes instrucciones apagan el LED y reenvan el programa al inicio del ciclo de
prendido y apagado.
bsf PORTB,LED
goto MainLoop
SetToZero
bcf PORTB,LED
goto MainLoop
Esta subrutina introduce un retardo de alrededor de un segundo y puede ser llamada todas las
veces en la source, a travs de la instruccin call Delay.
En la prctica el retardo viene obtenido siguiendo miles de instrucciones que no hacen nada. Este
tipo de retardo se llama retardo software o retardo a programa. Es el tipo de retardo ms simple
de implementar y puede ser utilizado cuando no se necesita que el PIC haga otras tareas mientras
adelanta el retardo.
Delay
clrf Cont0
clrf Cont1
DelayLoop
decfsz Cont0,1
goto DelayLoop
decfsz Cont1,1
goto DelayLoop
retlw 0
END
Delay y DelayLoop son dos etiquetas. Delay identifica la direccin de inicio de la subrutina y
viene utilizado para las llamadas del cuerpo principal del programa. DelayLoop viene llamado
internamente de la subrutina y sirve como punto de ingreso para el ciclo ( del ingls loop ) de
retardo.
Las instrucciones:
clrf Cont0
clrf Cont1
50
CLEAR FILE REGISTER enceran los dos sitios de RAM de las direcciones 20H y 21H,
referenciada por las labels Cont0 y Cont1.
decfsz Cont0, 1
goto DelayLoop
Qu ordena la ejecucin desde el principio del ciclo de retardo. Una vez alcanzado el cero con el
contador Cont0 se ejecutan las instrucciones:
decfsz Cont1,1
goto DelayLoop
Qu decrece el registro Cont1 hasta que ste tambin alcance el cero. El registro Cont1 en
particular sar decrementado de uno cada 256 decrementos de Cont0.
return
Para terminar END es una directiva que indica al compilador el final del source assembler.
1. Por una sola vez se debe crear en el disco duro un directorio de trabajo en el cual de ahora en
adelante se almacena todos los source, por ejemplo el nombre puede ser:
C:\PICPRG
2. Instalar el software necesario para compilar los sources, en este caso el paquete de Microchip
MPLAB X que est disponible la direccin: http://www.microchip.com.
4. En el IDE del MPLAB X desde la barra de men principal run la opcin Build Main
Project, ejecutar el programa MPASM, en el cual se configura el tipo de PIC a ser
compilado.
5. En el IDE del MPLAB X la ventana output se obtiene la siguiente salida, si no existe ningn
error:
51
BUILD SUCCESSFUL (total time: 501ms)
Loading code from D:/ PICPRG /Led.X.production.hex...
Loading completed
LED.HEX
LED.LST
LED.ERR
LED.COD
Para programar el PIC se utiliza solo el archivo LED.HEX que contiene el archivo compilado en
formato Intel Hex 8.
La programacin de los chips se puede realizar con cualquier programador, para lo cual es
necesario el software respectivo, por lo que se recomienda hacer referencia a la respectiva
documentacin.
52
3.2. Ejemplo. Realizar el "secuenciador de luces"
INICIO
Shift0x01
PORTBShift
C0
ShiftRotar a Izq.
SI
Shift<4>=0
NO
ShiftIntercabia Nibbles
Delay
53
El Diagrama de Flujo de la subrutina Delay, es la misma que la del ejemplo anterior,
Secuenciador LED.
;**************************************************
; Pic by example
; SEQ.ASM
;
; (c) 1999, Sergio Tanzilli (tanzilli@picpoint.com)
; http://www.picpoint.com/picbyexample/index.htm
;**************************************************
PROCESSOR 16F877
RADIX DEC
INCLUDE "P16F877.INC"
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
;Declaracin de Variables
Cont0 EQU 20H
Cont1 EQU 21H
Shift EQU 22H
;Reset Vector
;Program start point at CPU reset
ORG 00H
bsf STATUS,RP0
bcf STATUS,RP1
movlw 11110000B
movwf TRISB
bcf STATUS,RP0
movlw 00000001B
movwf Shift
MainLoop
movf Shift,W
movwf PORTB
bcf STATUS,C
rlf Shift,F
btfsc Shift,4
swapf Shift,F
call Delay
54
goto MainLoop
; Subroutines
Delay
clrf Cont0
clrf Cont1
DelayLoop
decfsz Cont0,1
goto DelayLoop
decfsz Cont1,1
goto DelayLoop
return
END
Las lneas de I/O utilizadas son RB0 para el primer led, RB1 para el segundo, RB2 para el
tercero y RB3 para el cuarto. Estos sern por lo tanto configurados como salidas al inicio del
programa:
movlw 11110000B
movwf TRISB
los bit menos significativo correspondientes a las lneas RB0,1,2,3 son puestos en cero para
definir las lneas de salida.
En el rea de memoria del REGISTER FILE (que en el source inicia con la directiva ORG 20H
), adems, a las dos labels referenciadas por la etiquetas Cont0 y Cont1, se tiene la label Shift
que se utiliz para determinar la secuencia de encendido del led. La directiva a introducir es:
Antes de ejecutar el ciclo principal ( label MainLoop ) se inicializa el nuevo registro Shift a
00000001B con las siguientes instrucciones:
movlw 00000001B
movwf Shift
En este punto, en el ciclo principal del programa transfiere el valor almacenado en el registro
Shift al puerto B, obteniendo el encendido del primer led, con las siguientes instrucciones:
movf Shift, W
movwf PORTB
luego efectuar el Shift a la izquierda del valor contenido en Shift, con las siguientes
instrucciones:
bcf STATUS, C
rlf Shift, F
55
La primera instruccin sirve para poner en cero el bit CARRY del REGISTRO DE ESTADO. La
instruccin RLF Rotate Left F through Carry ( gira a la izquierda a travs del bit carry ) corre un
bit a la izquierda el valor almacenado en el registro Shift introduciendo en la posicin ocupada
por el bit 0 el valor del bit de Carry. Para lograr que el bit introducido sea siempre cero debe
ejecutarse antes de la RLF la instruccin BCF STATUS, C para encerar este bit.
En este punto el registro Shift valdr 00000010B, por lo tanto, en el ciclo sucesivo, una vez
transferido tal valor al puerto B se obtendr el off del LED1 y el on del LED2 y as
sucesivamente para los ciclos siguientes.
Cuando el bit 4 de Shift valga 1, los cuatro se han encendido al menos una vez y es necesario
empezar de nuevo del LED1. Las siguientes instrucciones desarrollan este tipo de control :
btfsc Shift, 4
swapf Shift, F
La instruccin BTFSC Shift, 4 controla si el bit 4 del registro Shift vale 1. Si es as, ejecuta la
instruccin SWAPF Shift, F, de lo contrario la salta.
La instruccin SWAP (del ingls cambia) en la prctica cambia los cuatro bit ms
significativos contenidos en el registro Shift con los cuatro menos significativos. Del valor
inicial del registro Shift igual a 00010000B obtenido despus de varias repeticiones del ciclo
MainLoop se obtiene el valor 00000001B, que es en prctica el reinicio del primer led.
56
3.3. Ejemplo. Convertir un nmero Binario a BCD de 0 a 255.
34(D) = 00100010(B)
para lo cual se debe separar los dgitos decimales, mediante la divisin por 10.
34 10
4 3
Decenas (Cociente) = 3
Unidades (Residuo) = 4
obtenindose:
3 4
Pero con el PIC16F877 no se puede realizar las operaciones de multiplicacin y divisin, por lo
tanto la divisin se puede realizar por restas sucesivas, como se indica a continuacin:
4 es el residuo
3 cuentas de las restas sucesivas es el cociente
Por ltimo, para cantidades con centenas, se debe tener en cuenta que el contador de las restas
sucesivas al llegar a 10, corresponde a una centena y el contador debe inicializarse a cero para
contar las decenas.
57
INICIO
numero#numero
decena0
centena0
unidadnumero
numeronumero-10
SI
numero>=10
NO
NO
decena=10
FIN
SI
decena0
centenacentena+1
Pero, tomar en cuenta que la resta es similar a la suma, se debe apreciar que, el contenido
de registro W acta como sustraendo y, el operando, como minuendo. Igualmente hay
que apreciar que el flag CARRY se debe interpretar de forma inversa a como se hace con
la suma (a 0hay llevada).
58
;**************************************************
; Binario a BCD de 0 a 255
; Ejemplo23.asm
; abril 2015
;
;**************************************************
PROCESSOR 16F877
RADIX DEC
INCLUDE "P16F877A.INC"
;XT oscillator
;Disable watch dog timer
;Enable power up timer
;Disable code protect
;Declaracin de Variables
numero EQU 20H
unidad EQU 21H
decena EQU 22H
centena EQU 23H
;Reset Vector
;Program start point at CPU reset
ORG 00H
movlw 11111111B
movwf TRISC ;Configura el puerto C como entrada
movlw 00000000B
movwf TRISB ;Configura el puerto B como salida
movlw 11110000B
movwf TRISA ;Configura el nible bajo del puerto A como salida
Principal
;movf PORTC,W ;Mueve el contenido del puerto C al registro W
movlw 125 ;Es un ejemplo
movwf numero ;Almacena W en la variable numero
movlw 00000000B
movwf decena ;Encera la variable decena
movwf centena ;Encera la variable centena
repetir
movf numero,0 ;Guardo el valor de numero en unidad
movwf unidad
movlw 10
subwf numero,F ;numero = numero - 10
59
movlw 10
subwf decena,0
btfss STATUS,Z ;Si decena = 10
goto repetir
movlw 00000000B
movwf decena ;Encera la variable decena
incf centena,F ;Incremento en 1 la centena
goto repetir
result
swapf decena,0 ;Envio los valores de las decenas y numero es al puerto B
iorwf unidad,0
movwf PORTB ;Muestra decenas y unidades
END
60