sábado, 14 de noviembre de 2015

El microcontrolador pic 16f84


Hola mundo, estreno nuevo blogg, ojalá sea del agrado de los visitantes.

El microcontrolador es un dispositivo programable que sirve para manejar otros dispositivos periféricos, (como pantallas, led, motores, etc.) ,a través de salidas digitales. También tiene entradas para verificar estados de periféricos, (tales como teclados y sensores en general). Se los consigue en cualquier tienda de electrónica.
Voy a referirme en esta entrada al microcontrolador pic 16f84, muy bueno para comenzar en el mundo de los microcontroladores, mas adelante mostraré como realizar proyectos en electrónica digital usando este micro y subiré una placa y software del grabador del micro.

Aspecto externo




Vpp: Patita por la que se aplica la tensión positiva de la alimentación.
Vss: Patita conectada a tierra o negativo de la alimentación.
OSC1/CLKIN: Patita por la que se aplica la entrada del circuito oscilador externo que proporciona la frecuencia de trabajo del microcontrolador.
OSC2/CLKOUT: Patita auxiliar del circuito oscilador.
MCLR#: Esta patita es activa con nivel lógico bajo, lo que se representa con el símbolo #. Su activación origina la reinicialización o Reset del PIC. También se usa esta patita durante la grabación de la memoria de programa para introducir por ella la tensión, Vpp, que está comprendida entre 12 y 14 V DC.
RAO - RA4: Son las 5 líneas de E/S digitales correspondientes a la Puerta A. La línea RA4 multiplexa otra función expresada por TOCKI. En este segundo caso sirve para recibir una frecuencia externa para alimentar al temporizador interno TMR0.
RBO - RB7: Estas 8 patitas corresponden a las 8 líneas de E/S digitales de la Puerta B. La línea RBO multiplexa otra función, que es la de servir como entrada a una petición externa de una interrupción, por eso se la denomina RBO/INT.


Conexionado básico de los periféricos

Se muestra la conexión básica: la alimentación de 5V, el cristal de 4 Mhz, un led y un pulsador conectados a una salida y una entrada respectivamente y la conexión del botón de reset con un pulsador a MCRL#.



Adentro del PIC



La memoria de datos y la de instrucciones están separadas (arquitectura Harvard). Permitiendo entre otras cosas que el tamaño de la palabra de instrucciones (14b) sea distinto al tamaño de palabra de la memoria de datos (8b).

La memoria de Programa

El contador de programa (PC), puede almacenar hasta 2K de memoria de programa, sin embargo en el pic 16f84 se implementa hasta 1K. (De 0000 hasta 03FF). En el 16c84 el tipo de memoria es EEPROM, el 16f84 utiliza memoria flash. En el gráfico se muestra la memoria de programa, el contador de programa que la direcciona y la pila de 8 niveles que guarda las direcciones para volver desde llamadas a subrutinas (CALL) o interrupciones.

La palabra de configuración

Ocupa la dirección 0x2007 de la memoria de programa. Accesible solo durante la grabación.
CP: bits de protección de la memoria de código.
0: protegida: el programa no se puede leer evitando copias, tampoco se puede sobreescribir. Además se evita que se pueda escribir la EEPROM de datos. Por último, si se modifica de 0 a 1, se borra completamente la memoria de datos.
1: no protegida
PWRTE#: Retrasa 72 ms la puesta en marcha o reset que se produce al conectar la alimentación al pic, para garantizar la estabilidad de la tensión aplicada.
0: desactivado
1: activado
WDTE: Activación del perro guardián
1: activado
0: desactivado
FOSC1 – FOSC2: Selección del oscilador utilizado
1 – 1: Oscilador RC
1 – 0: Oscilador HS
0 – 1: Oscilador XT
0 – 0: Oscilador LP

Palabras de Identificación (ID)
Son 4 posiciones reservadas de la memoria de programa ubicadas en las direcciones 0x2000 – 0x2003, que no son accesibles en el funcionamiento normal del microcontrolador y sólo pueden ser leídas y escritas durante el proceso de grabación. Sólo se utilizan los 4 bits de menos de cada palabra de identificación (ID), en donde se almacena un valor que puede consistir en un número de serie, códigos de identificación, numeraciones secuenciales o aleatorias, etc.


Memoria de datos

En el pic16f84 tenemos 12 registros de propósito específico y 68 de propósito general. Con dos bancos (0 y 1), aunque para los registros de propósito general  solo son operativos los del banco 0, pues los del banco 1 están mapeados sobre el primero. En el caso de los registro de propósito específico, la mayoría están duplicados sobre el banco 1.



Descripción de los registros de propósito específicos

PCLATH [0x0A] + PCL [0x05]
El PCL junto con los 5 bits de menos peso del PCLATH conforman el contador de programa
FSR [0x04] + INDF [0x00]
El FSR indica una dirección de memoria de datos para direccionamiento indirecto. Se usa junto con el registro INDF que contiene el valor almacenado en la dirección apuntada por el FSR.
ESTADO [0x03]

C: Acarreo/llevada en el bit de más peso
1: Cuando este señalizador vale 1 indica que se ha producido acarreo en el bit de más peso
del resultado al ejecutar las instrucciones addwf y addlw.
0: No se ha producido acarreo. C también actúa como señalizador de «llevada» en el caso de la instrucción de resta, como subwf y sublw. En este caso la correspondencia es inversa (si vale 1 no hay llevada y si vale 0 sí).
DC: Acarreo/llevada en el 4.- bit
Igual significado que C pero refiriéndose al 4.- bit. De interés en operaciones en BCD.
Z: Cero
1: El resultado de una instrucción lógico-aritmética ha sido 0.
0: El resultado de una instrucción lógico-aritmética no ha sido 0.
PD#: «Power Down»
1: Se pone automáticamente a 1 después de la conexión de la alimentación al microcontrolador o al ejecutar la instrucción clrwdt.
0: Se pone automáticamente a 0 mediante la ejecución de la instrucción sleep.
TO#: «Time Out»
1: Se pone a 1 después de la conexión de la alimentación o al ejecutarse las instrucciones c1rwdt y sleep.
0: Se pone a 0 cuando se produce el desbordamiento del Perro Guardián (Watchdog).
RP1 - RPO: Selección de banco en direccionamiento directo
Como el PIC 16X84 sólo tiene dos bancos, únicamente emplea el bit RPO, de forma que cuando vale 1 se accede al banco 1 y cuando vale 0 se accede al banco 0. Después de un Reset RPO=0.
IRP: Selección del banco en direccionamiento indirecto
Este bit junto con el de más peso del registro FSR sirven para determinar el banco de la memoria de datos seleccionado en el modo de direccionamiento indirecto. En el PIC16X84 al disponer de dos bancos no se usa este bit y debe programarse como 0.


TMRO [0x01]

Actúa de dos maneras diferentes:
1. Como contador de sucesos, que están representados por los impulsos que se aplican a la patita RA4/TOCKI. Al llegar al valor FF se desborda el contador y, con el siguiente impulso, pasa a 00, advirtiendo esta circunstancia activando un señalizador y/o provocando una interrupción.
2. Como temporizador, cuando se carga en el registro que implementa al recurso un valor inicial se incrementa con cada ciclo de instrucción (Fosc/4) hasta que se desborda, o sea, pasa de FF a 00, y avisa poniendo a 1 un bit señalizador y/o provocando una interrupción. Funciona como un contador ascendente de 8 bits. Cuando funciona como temporizador conviene cargarle con el valor de los impulsos que se quiere temporizar, pero expresados en complemento a 2. De esta manera, al llegar el número de impulsos deseado se desborda y al pasar por 00 H se activa el señalizador TOIF y/o se produce una interrupción.
Para calcular los tiempos a controlar con TMRO se utiliza la siguiente fórmula práctica:

Temporización = 4 . Tosc . (256 - Valor cargado en el TMRO) . (rango del divisor)

El valor del rango del divisor se carga en el registro OPTION.

OPTION [0x81]



PUERTA-A [0x05] PUERTA-B [0x06] – TRIS-A [0x85] TRIS-B [0x86]

Cada línea de E/S puede configurarse independientemente como entrada o como salida, según se ponga a 1 o a 0, respectivamente, el bit asociado del registro de configuración de cada puerta (TRIS-A y TRIS-B). Se llaman PUERTA-A y PUERTA-B los registros que guardan la información que entra o sale por la puerta.

Interrupciones
El vector de interrupción se halla situado en la dirección 0x0004 de la memoria de programa. El bit GIE del INTCON se pone a 0 para prohibir interrupciones durante la RSI y luego se pone automáticamente a 1 al volver al programa con la instrucción retfie. Antes del retorno conviene borrar el señalizador de la causa de interrupción que se ha atendido, porque si bien los señalizadores se ponen a 1 automáticamente en cuanto se produce la causa que indican, la puesta a 0 se hace por programa.
Las causas de interrupción son cuatro:

1. Activación de RB0/INT
2. Desbordamiento de TMR0
3. Cambio de estado de RB4:RB7
4. Fin de escritura de EEPROM de datos.

INTCON [0x0B]



GIE: Permiso global de interrupciones
1: Permite todas las interrupciones cuyos bits de permiso individuales también lo permitan.
0: Prohíbe todas las interrupciones.
EEIE: Permiso de Interrupción por fin de la escritura en la EEPROM
1: Permite se origine una interrupción cuando termina la escritura de la EEPROM de datos.
0: Prohíbe que se produzca esta interrupción.
TOIE: Permiso de Interrupción por desbordamiento del TMRO
1: Permite una interrupción al desbordarse el TMR0.
0: Prohíbe esta interrupción.
INTE: Permiso de Interrupción por activación de la patita RBO/INT
1: Permite la interrupción al activarse RBO/INT.
0: Prohíbe esta interrupción.
RBIE: Permiso de Interrupción por cambio de estado en RB7:RB4
1: Permite esta interrupción.
0: Prohíbe esta interrupción.
T0IF: Señalizador de desbordamiento del TMRO
1: Se pone a 1 cuando ha ocurrido el desbordamiento.
0: Indica que el TMRO no se ha desbordado.
INTF: Señalizador de activación de la patita RBO/INT
1: Se pone a 1 al activarse RBO/INT, al recibir un flanco activo desde el exterior.
0: Indica que RBO/INT no ha recibido un flanco activo.
RBIF: Señalizador de cambio de estado en las patitas RB7:RB4
1: Pasa a 1 cuando cambia el estado de alguna de estas 4 líneas.
0: No ha cambiado el estado de RB7:RB4.

Reset
Cuando se produce un reset el programa inicia en el vector 0x0000. Las causas de reset son:
1. Conexión de la alimentación
2. Desbordamiento del perro guardián.
3. Activación de MCRL#

Muestro las instrucciones en assembler para la programación del pic16f84.

Instrucciones en assembler


Sintaxis
Operación
Formato 14 bits
Señalizadores
Especiales
retfie
Retorno de interrupcion (GIE=1)
00 0000 0000 0000
---
return
Retorno de subrutina
00 0000 0000 0100
---
sleep
Pasa al modo de reposo
00 0000 0110 0011
TO#, PD#
clrwdt
Borra o refresca el perro guardian
00 0000 0110 0100
---
nop ---
No opera
00 0000 0xx0 0000
---
Manejar registros
movwf f
Mueve w a f
00 0000 1fff ffff
---
clrw ---
Borra w
00 0001 0xxx xxxx
Z
clrf f
Borra f (pone todos los bits a 0)
00 0001 1fff ffff
Z
subwf f,d
Resta w a f
00 0010 dfff ffff
C, DC, Z
decf f,d
Decrementa f
00 0011 dfff ffff
Z
iorwf f,d
OR entre w y f
00 0100 dfff ffff
Z
andwf f,d
AND w con f
00 0101 dfff ffff
Z
xorwf f,d
XOR de w con f
00 0110 dfff ffff
Z
addwf f,d
Suma w y f
00 0111 dfff ffff
C, DC, Z
movf f,d
Mueve f
00 1000 dfff ffff
Z
comf f,d
Complementa f
00 1001 dfff ffff
Z
incf f,d
Incrementa f
00 1010 dfff ffff
Z
decfzf
Decrementa f y si es 0 brinca
00 1011 dfff ffff
---
rrf f,d
Rota f a la derecha a traves de C
00 1100 dfff ffff
C
rlf f,d
Rota f a la izquierda a traves de C
00 1101 dfff ffff
C
swapf f,d
Intercambia nibbles
00 1110 dfff ffff
---
incfsz f,d
Incrementa f y si es 1 brinca
00 1111 dfff ffff
---
Manejar bits
bcf f,b
Borra bit de f
01 00bb bfff ffff
---
bsf f,b
Pone a 1 bit de f
01 01bb bfff ffff
---
btfsc f,d
Explora un bit de f y brinca si vale 0
01 10bb bfff ffff
---
btfss f,d
Explora un bit de f y brinca si vale 1
01 11bb bfff ffff
---
Saltos
call k
Llamada a subrutina
10 0kkk kkkk kkkk
TO#, PD#
goto k
Salto incondicional
10 1kkk kkkk kkkk
---
Manejar operandos inmediatos k
movlw k
Mueve a w un valor inmediato
11 00xx kkkk kkkk
---
retlw k
Retorno de subrutina y carga w=k
11 01xx kkkk kkkk
---
iorlw k
OR inmediato con w
11 1000 kkkk kkkk
Z
andlw k
AND inmediato con w
11 1001 kkkk kkkk
Z
xorlw k
XOR inmediato con w
11 1010 kkkk kkkk
Z
sublw k
Resta w de un inmediato
11 110x kkkk kkkk
C, DC, Z
addlw k
Suma inmediata con w
11 111x kkkk kkkk
C, DC, Z

Ok! es todo por ahora :-)

No hay comentarios:

Publicar un comentario