Manual de Programacion en codigo assembler
Instrucciones para el PIC16C/F84 por Luis Frino ADDWF
f,d Sumar w y f |
Serie antigua
de Microchips
en Castellano
Un microcontrolador es un circuito integrado que contiene toda la estructura (arquitectura) de un microcomputador, o sea CPU, RAM, ROM y circuitos de entrada y salida. Los resultados de tipo práctico, que pueden lograrse a partir de éstos elementos, son sorprendentes. Algunos microcontroladores más especializados poseen además convertidores análogo digital, temporizadores, contadores y un sistema para permitir la comunicación serial. Los PIC16C5X de Microchip Technology, son una familia de microcontroladores CMOS de 8 bits, alta velocidad, de bajo costo y excelente rendimiento. Características · Operan desde DC hasta 20 MH · Bajo consumo de potencia: 50mW a 32 Khz. y 6 mW en reposo, disipación máxima menor a 800 mw. · Utiliza memorias EPROM y PROM internas · Circuito de vigilancia (Watchdog) para recuperación por fallas de programa. · Hasta 20 líneas de entrada y salida que permiten el manejo de corrientes considerables (25mA en "sumidero" y 20 mA en "fuente") · Modo de operación para ahorro de potencia "sleep" · Fusible para protección de código · Convertidores análogo digital · Temporizadores programables · El conjunto de instrucciones está formado por 33 palabras · 512-2k x 12 de memoria EPROM de programa · 25-72 x 8 registros de propósito general (SRAM) · Direccionamientos en modos directo, indirecto y relativo para datos e instrucciones. |
En 1980 aproximadamente, los fabricantes de circuitos integrados iniciaron la difusión de un nuevo circuito para control, medición e instrumentación al que llamaron microcomputador en un sólo chip o de manera más exacta MICROCONTROLADOR.
Un microcontrolador es un circuito integrado que contiene toda la estructura (arquitectura) de un microcomputador, o sea CPU, RAM, ROM y circuitos de entrada y salida. Los resultados de tipo práctico, que pueden lograrse a partir de éstos elementos, son sorprendentes.
Algunos microcontroladores más especializados poseen además convertidores análogo digital, temporizadores, contadores y un sistema para permitir la comunicación serial.
Los
PIC16C5X de Microchip Technology, son una familia de microcontroladores CMOS
de 8 bits, alta velocidad, de bajo costo y excelente rendimiento.
PIC EPROM RAM PUERTOS I/O
16C54 512x12 32x8 13
16C55 512x12 32x8 21
16C56 1Kx12 32x8 13
16C57 2kX12 80x8 21
La estructura interna de los PIC 16C5XX se basa en registros con memoria y buses separados para las instrucciones y los datos, llamada arquitectura Harvard. La memoria y el bus de datos (RAM) son de 8 bits de ancho, mientras que la memoria EPROM y su bus tienen 12 bits.
Esta estructura emplea 2 espacios de memoria diferentes, uno para datos y otro para programas y además se utilizan 2 buses distintos: uno para el tráfico entre la CPU y los datos y otro para la comunicación entre la memoria de programa y la CPU. Esto permite que, mientras una instrucción se ejecuta utilizando el bus de datos (8 bits). La siguiente se está leyendo desde la memoria de programa y cargándose en el registro de instrucción utilizando el bus de instrucciones de 12 bits.
PIC EPROM RAM PUERTOS I/O
16C54 512x12 32x8 13
16C55 512x12 32x8 21
16C56 1Kx12 32x8 13
16C57 2kX12 80x8 21
La estructura interna de los PIC 16C5XX se basa en registros con memoria y buses separados para las instrucciones y los datos, llamada arquitectura Harvard. La memoria y el bus de datos (RAM) son de 8 bits de ancho, mientras que la memoria EPROM y su bus tienen 12 bits.
Esta estructura emplea 2 espacios de memoria diferentes, uno para datos y otro para programas y además se utilizan 2 buses distintos: uno para el tráfico entre la CPU y los datos y otro para la comunicación entre la memoria de programa y la CPU. Esto permite que, mientras una instrucción se ejecuta utilizando el bus de datos (8 bits). La siguiente se está leyendo desde la memoria de programa y cargándose en el registro de instrucción utilizando el bus de instrucciones de 12 bits.
Ilustración 2. Arquitectura interna del microcontrolador PIC
1. RTCC RELOJ DE TIEMPO REAL |
15. PUERTO B, BIT 5 |
2. FUENTE DE ALIMENTACION |
16. PUERTO B, BIT 6 |
3. NO CONECTADO |
17. PUERTO B, BIT 7 |
4. TIERRA (GND) |
18. PUERTO C, BIT 0 |
5. NC |
19. PUERTO C, BIT 1 |
6. PUERTO A, BIT 0 |
20. PUERTO C, BIT 2 |
7. PUERTO A, BIT 1 |
21. PUERTO C, BIT 3 |
8. PUERTO A, BIT 2 |
22. PUERTO C, BIT 4 |
9. PUERTO A, BIT 3 |
23. PUERTO C, BIT 5 |
10. PUERTO B, BIT 0 |
24. PUERTO C, BIT 6 |
11. PUERTO B, BIT 1 |
25. PUERTO C, BIT 7 |
12. PUERTO B, BIT 2 |
26. OSC2/CLKOUT SALIDA RELOJ |
13. PUERTO B, BIT 3 |
27. OSC1 ENTRADA OSCILADOR |
14. PUERTO B, BIT 4 |
28. MCLR (RESET) |
1. RTCC RELOJ DE TIEMPO REAL |
15. PUERTO B, BIT 5 |
2. FUENTE DE ALIMENTACION |
16. PUERTO B, BIT 6 |
3. NO CONECTADO |
17. PUERTO B, BIT 7 |
4. TIERRA (GND) |
18. PUERTO C, BIT 0 |
5. NC |
19. PUERTO C, BIT 1 |
6. PUERTO A, BIT 0 |
20. PUERTO C, BIT 2 |
7. PUERTO A, BIT 1 |
21. PUERTO C, BIT 3 |
8. PUERTO A, BIT 2 |
22. PUERTO C, BIT 4 |
9. PUERTO A, BIT 3 |
23. PUERTO C, BIT 5 |
10. PUERTO B, BIT 0 |
24. PUERTO C, BIT 6 |
11. PUERTO B, BIT 1 |
25. PUERTO C, BIT 7 |
12. PUERTO B, BIT 2 |
26. OSC2/CLKOUT SALIDA RELOJ |
13. PUERTO B, BIT 3 |
27. OSC1 ENTRADA OSCILADOR |
14. PUERTO B, BIT 4 |
28. MCLR (RESET) |
Es un registro que no está disponible en forma física, se utiliza el contenido del registro f4 (selector o FSR), para seleccionar de manera indirecta uno de los 32 registros disponibles como registro de datos o registro puntero, según el tipo de instrucción que llame a f0.
En este registro se puede leer o escribir como en cualquiera de los otros registros. Este registro puede ser incrementado por una señal externa aplicada al pin RTCC o por el reloj interno de instrucciones. Las aplicaciones más obvias de este registro son el conteo de eventos y la medición de tiempos. El incremento del registro RTCC se puede determinar por medio de un prescalador interno programable.
Un divisor de frecuencia, "PRESCALER" puede ser programado al RTCC, asignando el estado apropiado a los bits RTS, RTE, PS1, PS2, PS0 del registro option que se desccribe más adelante. El bit RTS, determina si el RTCC es incrementado externa o internamente.
Todo incremento en f1 es retardado 2 ciclos de instrucción independiente de la fuente del pulso. Válido también para instrucciones que modifican el RTCC.
El bit RTE determina si el flanco de la señal externa es de subida (RTE=0) o de bajada (RTE=1) siempre y cuando haya sido programado su incremento con señal externa.
Los bits PS2, PS1, PS0 determinan la rata de división del prescaler.
Se utiliza para direccionar las palabras de 12 bits del programa del usuario, almacenadas en la memoria ROM según el tipo de microcontrolador que se utilice. El número de bits de este registro y de la pila (STACK), es de 9 para los PIC 16C54 y 55, de 10 bits para el PIC 16C56 y 11 en el PIC 16C57, que permite direccionar hasta 2048 palabras.
Después la condición de reset el contador de programa se inicia con todos sus bits en "UNO" con cada instrucción, a menos que cambie como resultado de algunas instrucciones especiales (GOTO, CALL, RETLW, etc.)
La instrucción GOTO permite saltar a cualquier posición de programa. La instrucción CALL cambia directamente los 8 bits bajos del contador de programa (bits del PC o A 7) mientras que el noveno (bit 8 del PC) se pone en "Cero", por esta razón, todas las entradas a las subrutinas o saltos calculados están limitados a las primeras 256 posiciones de cualquier página de memoria de programa. El valor actual del PC incrementando en uno, se carga en la pila. La instrucción RETLW carga el contador de programa con el contenido de la parte alta de la pila. Si el PC es el destino de cualquier instrucción, el resultado calculado se cargará en los 8 bits bajos del contador de programa. El direccionamiento relativo se logra sumando el contenido del registro de trabajo W al contador de programa; este es ampliamente utilizado para elaborar tablas de saltos y datos.
La serie 16C5XX permite solo 2 niveles de Hardware para la pila, lo que implica que sólo se puede hacer un anidamiento de subrutinas.
Este registro contiene el estado de la ALU, del reset y la selección de páginas para programas mayores de 512 palabras (56/57). Se recomienda, utilizar solamente las instrucciones BCF, BSF y MOVWF para modificar sus bits, puestos que éstas instrucciones no afectan ningún bit de estado.
Este registro está conformado por los siguientes bits:
00: Página 0 (000-1FF)
01: Página 1 (200-3FF)
10: Página 2 (400-5FF)
11: Página 3 (600-7FF)
Mapa de memoria del microcontrolador
En el PIC 16C54/55/56 los bits 0-4 seleccionan uno de los 32 registros en el modo de direccionamiento indirecto, los bits 0-4 pueden ser utilizados como los de un registro de propósito general de 5 bits.
En el PIC 16C57 los bits 5 y 6 de FSR, seleccionan la página correspondiente de la memoria de datos.
El contenido del registro seleccionado por el FSR puede ser accedido a través del registro FO.
La distribución de los registros de propósito general son diferentes según el tipo de microcontrolador.
PIC 16C54/55/56: F08 - F1F: Son registros de propósito general.
PIC 16C57: Registros de propósito general y pueden ser accedidos independientemente del banco seleccionado, o sea con las condiciones F20-F2F, F40-F4F, FA6-F6F.
F10-F1F: Registros de propósito general del banco 0
F30-F3F: Registros de propósito general del banco 1
F50-F5F: Registros de propósito general del banco 2
F70-F7F: Registros de propósito general del banco 3
Mapa de memoria de los registros del microcontrolador
Registro
de opciones
Este registro define el valor de asignación para el divisor de frecuencia (prescaler) y la fuente de señal para el RTCC. Es un registro de 6 bits que se puede cargar con el contenido del registro W, ejecutando la instrucción "option". La condición reset pone sus bits en "unos".
En los registros de entrada - salida se puede escribir o leer, bajo un programa de control del mismo modo que en otro registro del archivo de registros, sin embargo una instrucción de lectura lee siempre el estado del PIN entrada - salida sin importar que el pin esté definido como entrada o como salida. Sobre una condición de reset todos los puertos entrada - salida son definidos como entradas (= a alta impedancia) mientras los registros de control de entrada - salida (TRIS A, TRIS B, TRIS C) son todos puestos en "1".
La ejecución de TRIS F" con los correspondientes ceros, en el registro W, es necesario para definir cualquiera de los pines de entrada - salida como salidas.
Puerto A: Registro de entrada/salida de 4 bits (RA0-RA3). Los bits 4-7 no están implementados y son leídos como "ceros".
Puerto B: Registro de entrada/salida de 8 bits.
Puerto C: Registro de entrada/salida de 8 bits para el PIC 16C57. Es un registro de propósito general para el PIC 16C54/56.
Estos registros sólo pueden ser escritos y son cargados con el contenido del registro W, ejecutando la instrucción TRIS f. Un "1" el contenido del registro de control de entrada/salida, coloca el correspondiente pin del puerto en el modo de alta impedancia, o sea de entrada.
Un "0" en el contenido del registro de control, pone el correspondiente bit como salida, con lo cual el contenido que tenía el puerto controlado es fijado en los pines del PIC 16C5XX.
La condición de reset pone todos los bits de los registros TRIS f. En "1" pero no afecta el contenido de los puertos. Los microcontroladores de la serie 16C5XX son completamente estáticos, lo que quiere decir que el contenido de los registros solamente es alterado por acción del programa o de señales externas para el caso de los puertos que estén configurados de entradas. Esto explica porque el contenido de los puertos no es alterado con la condición de reset.
Debe tenerse especial cuidado con el empleo de las instrucciones BCF y BSF, puesto que éstas instrucciones leen todo el puerto, realizan la operación sobre el bit y luego reescriben el resultado fijándolo al puerto. Esto ocasiona problemas cuando un bit definido como entrada durante este tiempo es luego cambiado al modo de salida (bi-direccional) porque el contenido del "LATCH" del puerto en tal caso puede ser desconocido.
Como
la escritura sobre un puerto ocurre al finalizar el ciclo de instrucción,
mientras que la lectura del puerto ocurre al empezar el ciclo de instrucción,
para altas frecuencias este hecho presentaría problemas. Por lo tanto se recomienda
utilizar instrucciones "NOP" para separar éstas dos instrucciones
en caso de requerirse una seguida de la otra. Lo mismo es aplicable si se
desea poner un bit de salida de un puerto a "UNO" e inmediatamente
a "CERO". Es recomendable redefinir todos los pines de entrada/salida
a intervalos regulares de tiempo.
Prescaler
Un
contador de 8 bits está disponible como prescaler (divisor de frecuencia con
contador de escala) para el RTCC o como POST-SCALER para el WATCHDOC. Estas
asignaciones son mutuamente excluyentes, esto significa que sólo se puede
asignar este contador a uno de ellos (RTCC o WDT).
Es realizado por un oscilador RC, que oscila libre e internamente y no requiere de componentes externos.
Lo anterior significa que si el reloj en los pines OSC1/OSC2 se detiene por una instrucción sleep, el WDT continua operando. La salida de WDT origina una señal de reset.
El WDT puede estar permanentemente deshabilitado programando un "CERO" en un fusible de la memoria EPROM. El período nominal del WDT es de 18 mSeg. (sin Post-scaler), este período puede variar con la temperatura y el VDD. el mayor tiempo se obtiene con un post-scaler 1:128 es de 2.5 mSeg.
El reset puede ser causado por:
Aplicación al chip, de potencia
(POWER UP)
Colocando un nivel bajo
en la entrada de MCLR
Por un rebosamiento del temporizador
del "WATCHDOG"
El microcontrolador estará en condición de "reset", mientras el temporizador de arranque (OST) esté activo, o el pin MCLR permanezca recibiendo un "CERO".
Durante la condición de reset el estado de los microcontroladores de la serie PIC 16C5XX es definido de la siguiente manera:
El oscilador está en operación o arranca en caso de ser recién energizado el chip o regresar de un estado de sleep.
Todos los puertos son configurados de entrada (TRIS CON FFH)
El contador de programa es puesto en 1FFH (54/55), 3 FFH (56) o en 7FF (57).
El registro "OPTION" es cargado con FFH y el WATCHDOG es borrado.
El WDT y el prescaler son puestos a "0".
La serie PIC16C5XX está disponible con 4 opciones diferentes de osciladores.
En los dispositivos con ventanas la configuración (option) es seleccionada por programación, en la memoria EPROM. En los dispositivos OTP el oscilador viene programado de fábrica. Recordemos que OTP significa que sólo se pueden programar una vez.
Los PIC16C5XX XT-HS o LP necesitan un cristal o resonador cerámico conectado a los pines OSC1 y OSC2 para establecer su oscilación. Estos dispositivos pueden recibir la oscilación de un dispositivo externo.
El sufijo XT, HS o LP significa:
Para aplicaciones en las cuales la temporización no es muy crítica, el uso de osciladores RC ofrece una disminución de costos.
Este modo de bajo consumo de potencia se logra una vez se haya ejecutado la instrucción SLEEP.
Si este modo está habilitado, el WDT es borrado, el bit TO es puesto en "1", el bit PD es puesto a "CERO" y el oscilador se detiene, los puertos mantienen su estado previo.
Para un menor consumo de corriente todos los pines de los puertos de entrada/salida, incluyendo el pin RTCC deben estar conectados a través de resistencias a VSS o a VDO y sin circuitería externa que requiera corriente del pin.
Instruccion |
Parámetros |
Descripción |
Ciclos |
Registros afectados |
ADDWF |
f, d |
Add W and f |
1 |
C,DC,Z |
ANDWF |
f, d |
AND W with f |
1 |
Z |
CLRF |
f |
Clear f |
1 |
Z |
CLRW |
- |
Clear W |
1 |
Z |
COMF |
f, d |
Complement f |
1 |
Z |
DECF |
f, d |
Decrement f |
1 |
Z |
DECFSZ |
f, d |
Decrement f, Skip if 0 |
1(2) |
Ninguno |
INCF |
f, d |
Increment f |
1 |
Z |
INCFSZ |
f, d |
Increment f, Skip if 0 |
1(2) |
Ninguno |
IORWF |
f, d |
Inclusive OR W with f |
1 |
Z |
MOVF |
f, d |
Move f |
1 |
Z |
MOVWF |
f |
Move W to f |
1 |
Ninguno |
NOP |
- |
No Operation |
1 |
Ninguno |
RLF |
f, d |
Rotate left f through carry |
1 |
C |
RRF |
f, d |
Rotate right f through carry |
1 |
C |
SUBWF |
f, d |
Subtract W from f |
1 |
C,DC,Z |
SWAPF |
f, d |
Swap nibbles in f |
1 |
Ninguno |
XORWF |
f, d |
Exclusive OR W with f |
1 |
Z |
Instruccion |
Parámetros |
Descripción |
Ciclos |
Registros afectados |
BCF |
f, b |
Bit Clear f |
1 |
Ninguno |
BSF |
f, b |
Bit Set f |
1 |
Ninguno |
BTFSC |
f, b |
Bit Test f, Skip if Clear |
1 (2) |
Ninguno |
BTFSS |
f, b |
Bit Test f, Skip if Set |
1 (2) |
Ninguno |
Instruccion |
Parámetros |
Descripción |
NroCic. |
Registros afectados |
ADDLW |
k |
Add literal and W |
1 |
C,DC,Z |
ANDLW |
k |
AND literal with W |
1 |
Z |
CALL |
k |
Call subroutine |
2 |
|
CLRWDT |
- |
Clear Watchdog Timer |
1 |
TO,PD |
GOTO |
k |
Go to address |
2 |
Ninguna |
IORLW |
k |
Inclusive OR literal with W |
1 |
Z |
MOVLW |
k |
Move literal to W |
1 |
Ninguna |
RETLW |
k |
Return with literal in W |
2 |
Ninguna |
SLEEP |
- |
Go into standby mode |
1 |
TO,PD |
SUBLW |
k |
Subtract W from literal |
1 |
C,DC,Z |
XORLW |
k |
Exclusive OR literal with W |
1 |
Z |