Beruflich Dokumente
Kultur Dokumente
ELECTRICA
7 – 3 Introducción a los microcontroladores y su programación
LOS MICROCONTROLADORES PIC 16F87x
Introducción
Dispositivos periféricos
-Se disponen de 5 puertas de E/S (PA, PB, PC, PD, y PE) en los modelos de 40 pines,
haciendo un total de 33 líneas para conectar periféricos externos. En los modelos de 28
pines, se disponen de 3 puertas E/S (PA, PB y PC), haciendo un total de 22 líneas E/S.
COMUNICACIÓN NO NO SI NO SI
PARALELO
BOD NO SI SI SI SI
(Detección baja
tensión)
/9 RB0/INT
MPX RB1
Puerta RB2
RB3/PGM
7
B RB4
/
/8 RB5
FSR RB6/PGC
RB7/PGD
ESTADO
8
/ RC0/TIOSO/TICK1
RC1/TIOSI/CCP2
Puerta RC2/CCP1
Decodificador de Temporizador MPX RC3/SCK/SCL
instrucciones conex. potencia
C RC4/SDI/SDA
/3 RC5/SDO
Temporizador de RC6/TX/CK
OSC1/ inicio RC7/RX/DT
CLKIN
Reloj Reset
Power-On ALU
OC2/
CLKOUT Perro guardián RD0/PSP0
/8 RD1/PSP1
/8 Puerta RD2/PSP2
Reset RD3/PSP3
Brown-Out W
D RD4/PSP4
RD5/PSP5
Depuración RD6/PSP6
en circuito RD7/PSP7
Programación
con bajo voltaje
Puerta paralela
esclava
MEMORIA DE CODIGO
07FF H
0800 H / 13
12 0
PAGINA 1
2K NIVEL 1
0FFF H
1000H
PAGINA 2
2K
17FF H
1800 H
PAGINA 3
2K NIVEL 8
12 0
1FFF H PILA LIFO
13 0 (Primer dirección
ingresada, última en salir)
Nota: Las páginas 2 y 3,
solamente están implementadas en
los modelos de 40 pines
Con los 13 bits del Contador de Programa, me permiten direccionar los cuatro bancos
de la memoria de programa. Dado que 213 = 8192 posibles combinaciones de unos y
ceros, entonces estas combinaciones resultan las direcciones de 8192 instrucciones
capaces de almacenar en cuatro bancos de 2 x 1024 = 2048 instrucciones cada uno,
haciendo un total de 4 x 2048 = 8192. Recordemos que esta capacidad de memoria de
programa, solamente la tienen los PIC de 40 pines. Los PIC de 28 pines tienen 2 bancos
de 2 K, haciendo un total de 2 x 2 x 1024 = 4096 instrucciones, lo que equivale también
a 4096 direcciones que debe direccionar el Contador de programa.
Ahora bien, estos 13 bits del Contador de programa, se encuentran alojados en dos
registros específicos. Uno es el registro PCL, que se encuentra en la memoria de datos
y guarda los 8 bits de menor peso (bits < 7:0>); éste, se puede leer y escribir. El otro, es
el registro PCH, que no puede ser leído ni escrito, pero se accede a el, por medio del
registro PCLATH, de la memoria de datos RAM.
Las instrucciones CALL y GOTO, solamente proporcionan 11 bits de la dirección a
saltar. Esto limita el salto dentro de cada banco de 2 k direcciones. Cuando se desea
salir del banco actual, hay que programar correctamente los bits PCLATH <4:3> que
selecciona el banco. En este caso, es labor del programador modificar el valor de estos
bits, cuando se trabajan con las instrucciones de salto CALL y GOTO.
PCH PCL
12 8 7 0
/5 8 PCL anterior+x
/
PCLATH
PCH PCL
12 11 10 8 7 0
PCLATH
2 Selección del
banco
/7 00 01 10 11
Dirección
Dentro del 00H 80H 100H 180H
banco
Dirección dentro
/2 del banco
Selección
del 7FH FFH 17FH 1FFH
banco
PIC16F877/ PIC16F874
MCLR/Vpp/THV 1 40 RB7/PGD
RA0/AN0 2 39 RB6/PGC
RA1/AN1 3 38 RB5
RA2/AN2/ Vref - 4 37 RB4
RA3/AN3/Vref+ 5 36 RB3/PGM
RA4/TOCKI 6 35 RB2
RA5/AN4/SS# 7 34 RB1
RE0/RD#/AN5 8 33 RB0/INT
RE1/WR#/AN6 9 32 VDD
RE2/CS#/AN7 10 31 VSS
VDD 11 30 RD7/PSP7
VSS 12 29 RD6/PSP6
OSC1/CLKIN 13 28 RD5/PSP5
OSC2/CLKOUT 14 27 RD4/PSP4
RC0/T1OSO/T1CKI 15 26 RC7/RX/DT
RC1/T1OSI/CCP2 16 25 RC6/TX/CK
RC2/CCP1 17 24 RC5/SD0
RC3/SCK/SCL 18 23 RC4/SDI/SDA
RD0/PSP0 19 22 RD3/PSP3
RD1/PSP1 20 21 RD2/PSP2
PIC16F876/ PIC16F873
MCLR/Vpp/THV 1 28 RB7/PGD
RA0/AN0 2 27 RB6/PGC
RA1/AN1 3 26 RB5
RA2/AN2/ Vref - 4 25 RB4
RA3/AN3/Vref+ 5 24 RB3/PGM
RA4/TOCKI 6 23 RB2
RA5/AN4/SS# 7 22 RB1
VSS 8 21 RB0/INT
OSC1/CLKIN 9 20 VDD
OSC2/CLKOUT 10 19 VSS
RC0/T1OSO/T1CKI 11 18 RC7/RX/DT
RC1/T1OSI/CCP2 12 17 RC6/TX/CK
RC2/CCP1 13 16 RC5/SD0
RC3/SCK/SCL 14 15 RC4/SDI/SDA
REPERTORIO DE INSTRUCCIONES
INSTRUCCIONES DE “SALTO”
+5V
10KΩ
D PIC16F876/ PIC16F873
RESET
100Ω
E1 1 MCLR/Vpp/THV RB7/PGD 28
2 RA0/AN0 RB6/PGC 27
Masa E2 3 RA1/AN1 RB5 26
4 RA2/AN2/ Vref - RB4 25
5 RA3/AN3/Vref+ RB3/PGM 24
+5V 6 RA4/TOCKI RB2 23
10K 10K 7 RA5/AN4/SS# RB1 22
8 VSS RB0/INT 21
9 OSC1/CLKIN VDD 20 +5V
10 OSC2/CLKOUT VSS 19
11RC0/T1OSO/T1CKI RC7/RX/DT 18
Masa 12RC1/T1OSI/CCP2 RC6/TX/CK 17 330Ω 330Ω
15pF 13 RC2/CCP1 RC5/SD0 16 Masa
14 RC3/SCK/SCL RC4/SDI/SDA 15
Cristal 4Mhz
D.LED1 D.LED2
15pF Masa
Masa
a) Los capacitores que acompañan al cristal de cuarzo de 4 Mhz son de 15pf en vez de
27 pF.
b) El puerto A puede actuar como entrada o salida de señales digitales pero también
puede actuar como entrada de señales analógicas y alguno de sus pines tienen una
opción más. En este caso para configurar este puerto, debemos hacerlo con los registros
TRISA (entrada/salida digitales) y ADCON1 (entradas digitales/analogicas)
c) La memoria de datos RAM tiene cuatro bancos; para movernos entre ellos, debemos
modificar los bit RP0 (5) y RP1 (6) del registro de estado (direc hex 03, STATUS).
Es el registro mas utilizado, que controla las principales funciones del microcontrolador.
Por ello, este registro se encuentra repetido en los cuatro bancos de la memoria RAM,
en las direcciones 0x03 del banco 0, 0x83 del banco 1, 0x103 del banco 2 y 0x183 del
banco 3.
7 6 5 4 3 2 1 0
IRP RP1 RP0 TO# PD# Z DC C
IRP: Este bit se usa concatenado con el bit de mayor peso (7) del registro FSR (repetido
en los 4 bancos de la memoria RAM). Se utiliza para seleccionar los bancos de
memoria, RAM en el direccionamiento indirecto.
RP1 y RP0: Estos bits se utilizan para direccionar los bancos de memoria RAM, en el
direccionamiento directo, según la siguiente tabla:
TO#: Se activa a nivel bajo al desbordarse el perro guardián. Toma el valor 1 cuando se
conecta la alimentación o al ejecutarse las instrucciones clrwdt o slepp.
PD#: Se activa a cero al ejecutarse la instrucción sleep (reposo). Se pone a 1
automáticamente cuando se conecta la tensión de alimentación, o bien al ejecutarse la
instrucción clrwdt (refresco perro guardián).
Los señalizadores TO# y PD# son importantes en el proceso de reset dado que nos
indican la causa que la ha originado y actuar en consecuencia. Estos bits no se pueden
escribir. Estos microcontroladores se resetean cuando se conecta la tensión de
alimentación (POR: Power-on Reset). También se resetean cuando la tensión de
alimentación cae por debajo de 4 volt (BOR: Brown-out Reset), si se lo autoriza
colocando un 1 en el bit BODEN, presente en la palabra configuración.
Cuando el reset se produce por POR o por BOR, ambos bit toman el valor 1, mientras
que en los demás casos dependen de la causa que ha provocado el reset.
#: Indica que los señalizadores son activos por nivel bajo.
Z: Señalizador de cero. Se pone a 1 cuando al ejecutarse una instrucción, el resultado es
cero.
DC: Acarreo/llevada en el 4º bit. Se utiliza para las operaciones con números
expresados en BCD
C: Acarreo/llevada en el 8º bit. Se pone a 1 automáticamente cuando existe acarreo en
el bit de mayor peso en las instrucciones de suma. También actúa como señalizador de
“llevada”, en las instrucciones de resta, pero en este caso la correspondencia es inversa,
es decir que si vale cero, hay “llevada”.
Los bits del registro de estado Z, DC y C no pueden ser escritos, como así también los
bits TO# y PD#. Por lo tanto cuando se trabaja con este registro para los bits que
pueden modificarse, resulta conveniente utilizar instrucciones dirigidas a bit (bsf, bcf).
Para lectura de este registro, se pueden utilizar aquellas instrucciones generales
aplicables a registros.
Por ejemplo, si ejecutáramos la instrucción “clrf STATUS”, solamente se pondrían en
cero los bits IRP, RP1 y RP0; los demás quedan inalterados, salvo el indicador de cero
Z que pasaría a valer 1.
Este registro tiene las mismas funciones que el que tiene el PIC 16F84. Sus funciones
son las siguientes:
1) Asigna el divisor de frecuencias al Timer0 (TMR0) o al perro guardián.
2) Se asigna el rango del divisor de frecuencia
3) Selecciona el tipo de reloj del TRM0, que puede ser interno (actúa como
temporizador) o externo a través del pin 6 RA4/ TOCKI (actúa como contador de
pulsos).
4) Se puede seleccionar el flanco activo del pulso en TOCKI
5) Selecciona el flanco activo para la interrupción externa.
6) Activa o desactiva las resistencias de pull-up de la puerta B
7 6 5 4 3 2 1 0
RBPO# INTDG TOCS TOSE PSA PS2 PS1 PS0
PS0, PS1, PS2: Se asigna el rango con que actúa el divisor de frecuencia
Los microcontroladores PIC 16F87X tienen diversas causas que pueden provocar una
interrupción. Para los PIC16F873/6 (28 pines) tienen 13 posibles causas de
interrupciones. Para los PIC16F874/7 (40 pines) tienen 14 posibles causas de
interrupciones. De la misma forma que con el PIC16F84, al aceptarse una interrupción,
el valor actual del contador de programa se guarda en la memoria PILA y se carga aquel
con el valor 0x0004, dirección de la memoria de programa, del Vector Interrupción.
Casi todos los recursos o periféricos de estos microcontroladores pueden causar una
interrupción, si se los programa a tal fin, mediante la programación de los bits de los
registros específicos para el control de las interrupciones.
Recordemos que en el PIC16F84 tienen 4 causas que pueden provocar una interrupción:
1) Desbordamiento del TMR0
2) Activación del pin RB0/INT
3) Cambio del estado binario en las entradas de mayor peso de la puerta B (RB4…RB7)
4) Finalización de escritura de un byte en la memoria de datos EEPROM.
Los permisos y las señalizaciones de estas interrupciones están prácticamente todos en
el registro INTCON, salvo el señalizador de fin de escritura de EEPROM (EEIFE), que
esta en el registro EECON1.
Los PIC16F87X, además de estas causas de interrupciones, tienen otras mas, siendo el
total de ellas, las siguientes:
1) Desbordamiento del TMR0
2) Activación del pin RB0/INT
3) Cambio del estado binario en las entradas de mayor peso de la puerta B (RB4.RB7)
4) Finalización de escritura de un byte en la memoria de datos EEPROM.
5) Desbordamiento del TIMER1
6) Desbordamiento del TIMER2
7) Captura o comparación en el modulo CCP1
8) Captura o comparación en el modulo CCP2
9) Transferencia en la puerta Serie Sincrónica
10) Colisión de bus en la puerta Serie Sincrónica
11) Fin de la transmisión en el USAR
12) Fin de la recepción en el USAR
13) Fin de la conversión en el Conversor A/D
14) Transferencia en la puerta paralela esclava (solamente para los PIC de 40 pines)
Es casi similar al del PIC16F84. Este registro se puede escribir y leer y se encuentra
repetido en los 4 bancos de la memoria RAM, ocupando las direcciones 0x0B, 0x8B,
0x 10B y 0x18B.Los bit de este registro tienen la misión de controlar las interrupciones
provocadas por el TMR0, cambio de estado en los pines RB4...RB7, y activación por la
entrada RB0/INT. A diferencia con el PIC anterior, solo cambia el bit PEIE (permiso de
interrupción de periféricos que no se controlan con INTCON) en lugar del EEIE
(permiso de interrupción por finalización de escritura de la EEPROM de datos).
1 ≡ permitido
0 ≡ prohibido
Este registro contiene los bits de permiso (1) o prohibición (0) de las interrupciones
provocadas por los periféricos del microcontrolador no contemplados en el registro
INTCON.
El registro PIE1 ocupa la dirección 0x8C (banco 1) de la memoria RAM. Este registro
toma validez, siempre y cuando el bit PEIE (6), del registro INTCON, valga 1.
7 6 5 4 3 2 1 0
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
1 ≡ permitido
0 ≡ prohibido
PSPIE: Permiso de interrupción para la puerta paralela esclava cuando realiza una
operación de lectura/escritura. Solo es valido en los modelos de 40 pines (16F87/4/7).
En los modelos de 28 pines (16F87/3/6), siempre vale cero.
RCIE: Permiso de interrupción para el receptor del USART cuando el buffer se llena.
Este registro, ubicado en la dirección 0x8D (banco 1), contiene los bits de permiso de
interrupciones de tres causas que no están contempladas en el registro PIE1. Los bits de
permiso de interrupciones son: Fin de escritura en la EEPROM, colisión de bus en el
modo SSP y producción de una captura o una comparación en el modo CCP2. Los bits
que no se usan, siempre se los lee con valor cero.
7 6 5 4 3 2 1 0
--- 0 ---- EEIE BCLIE ---- ---- CCP2IE
1 ≡ permitido
0 ≡ prohibido
BCLIE: Permiso de interrupción por colisión de bus en el SSP cuando dos o mas
maestros tratan de transferir al mismo tiempo.
Estos registros, PIR1 y PIR2, ubicados en las direcciones 0x0C y 0x0D del banco 0,
contienen los bits que señalizan las interrupciones en correspondencia con los bits de
permiso/prohibición que están el los registros PIE1 y PIE2, respectivamente. Estos bits
de señalización, actúan siempre, independientemente si esta permitida o prohibida la
interrupción.
1= Se produjo la causa de la interrupción.
0= no se produjo la causa de la interrupción.