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