Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 2. Arquitectura Del PIC
Tema 2. Arquitectura Del PIC
Contenido:
1. Recursos
2. Organización de la memoria de datos
3. Registro
4. Registro de funciones especiales (SFR)
5. El registro STATUS (parte I Direccionamiento)
6. Direccionamiento de la memoria de datos RAM
7. Memoria de programa
8. Contador de programa (PC)
9. Pila (stack)
10. El registro STATUS (parte II Banderas)
11. Aspecto Físico del microcontrolador PIC16F877
12. Puertos
13. Alimentación eléctrica del PIC
14. Palabra de Configuración
15. Oscilador
16. Sistema mínimo (conexión electrónica del PIC)
Comentario:
Existe otro microcontrolador llamado PIC16F877A el cual se le agrego la terminación ‘’A’’ este
se diferencia con el PIC16F877.
La diferencia entre ambos micro radica en el modulo de convertidor analógico digital (CAD) que
se estudiara mas adelante.
Del resto ambos micro son similares en recursos por lo que se puede usar cualquiera de los dos
sin ningún problema.
Es importante aclarar esto ya que a los dos micro se los trata por igual pero a la hora de
programarlo hay que especificar si se trata del PIC16F877 o del PIC16F877A
La memoria de datos RAN esta dividida en cuatro bancos de 128 byte cada uno como se
muestra a continuación
Comentario:
Registro
Un registro es un grupo de bit.
En este caso los registros de este microcontrolador son grupo de 8bit, es decir de 1Byte (un
Byte es igual a 8bit).
Los registros son una estructura de datos, esta formados por un vector de 8 elementos,
donde cada elemento representa el estado lógico de un bit (cero o uno)
Los registros van desde el bit 0 hasta el bit 7 (8bit en total incluyendo el 0)
Los SFR (Registros de funciones especiales ) tienen asociado un nombre proporcionado por
el fabricante (los nombres están en letras mayúsculas). A su vez cada bit del registro tienen
un nombre también. Ejemplo de un SFR (ver memoria de datos RAM pagina 4)
STATUS
PORTA
TRISA
ADCON1
Cada uno de los bit de un registro solo puede tener un valor lógico binario, es decir tomara el
valor 0 (cero, bajo) u 1 (uno, alto) según sea el caso.
Cada bit representa un estado lógico y dependiendo del valor (0 u 1) en el caso de los SFR
realizara una función especificada por el fabricante.
Ejemplo 1:
STATUS
7 6 5 4 3 2 1 0
1 1 1 1 0 0 0 0
Aquí podemos observar que el nombre del registro es STATUS y que los bit < 0 al 3 > tienen un
estado lógico cero (bajo) y que los bit <4 al 7> tienen un estado lógico uno (alto). Este registro
se encuentra repetido en los 4 bancos de la memoria RAM, en la dirección:
Ejemplo 2:
PORTA
7 6 5 4 3 2 1 0
0 0 1 1 0 0 1 0
El nombre del registro es PORTA y en este caso los bit <7,6,3,2,0> toman el estado lógico bajo
(un cero) mientras que los bit <5,4,1> están en estado lógico alto (uno). El registro PORTA esta
ubicado en la posición 05h del banco 0
Ejemplo 3:
TRISA
7 6 5 4 3 2 1 0
1 x 0 1 0 1 1 0
El registro se llama TRISA . Se observa que el bit <6> tienen una x (don’t care -no importa-) eso
significa que no sabemos cual valor toma ese bit (puede ser un cero o uno) en los bit <7,4,2,1>
toma el estado lógico uno y los demás están a cero. Esta ubicado en la posición 85h del banco
numero 1 del la memoria de datos RAM
Nota: recuerde que los SFR tienen nombres proporcionados por el fabricante (siempre en
letras mayúsculas) mientras que los GPR el nombre es asignado por el programador.
• Directo
• Indirecto
El direccionamiento directo se realiza a través del registro STATUS con los bit RP1 y RP0 <6,5>
mientras que el indirecto con el bit IRP <7> del registro STATUS mas el registro FSR
Se requieren 9 bit para direccionar la memoria RAM de datos , esos bit están distribuidos de la
siguiente manera:
**Nota: Los bit se suelen indicar encerrados entre los signos mayor y menor .
Comentario:
Esto pareciera complicado pero no lo es. El micro tiene que ubicar los datos de la memoria de alguna
forma a través de una dirección única; Según la imagen de arriba esa es la manera en que este
microcontrolador en especifico lo hace.
Solo hay que saber lo siguiente… como la memoria de DATOS RAM es de 368 Bytes eso significa que
se necesitan x cantidad de bit para direccionar esta parte de la memoria. Si utilizáramos 8 bit ocurriría
lo siguiente
28 = 256
Como se pueden dar cuenta con 8 bit podemos direccionar solo 256 posiciones, pero 8 bit no es
suficiente para movernos en el rango requerido que es 368. En cambio con 9 bit
29 = 512
Bueno en este caso 9 bit nos permite direccionar 512 posiciones. Pero este micro solo se usaran las
368 primeras posiciones (porque la memoria es de 368 Byte), el resto que sobran no son utilizados.
En conclusión se requieren 9 bit para direccionar la memoria RAM de datos. Y en la imagen de arriba
explica como están distribuidos esos 9 bit según el tipo de direccionamiento (directo o indirecto)
STATUS
7 6 5 4 3 2 1 0
Como pueden observar, cada bit tiene un nombre. Los bit <0,1,2> tienen por nombre C, DC, Z
respectivamente.
La función de los bit <6,5> Se utiliza principalmente para seleccionar el banco de la memoria de
datos RAM a través de los bit 5 y 6 (RP0 yPR1) según la tabla 1 (ver tabla)
Si queremos acceder al banco 1 hay que colocar el bit RP0=1 y el bit RP1=0 tal como se muestra a
continuación.
STATUS
7 6 5 4 3 2 1 0
Utilizando las instrucciones adecuada podemos hacer que el bit <5> RP0 tome el valor lógico alto
(uno), y que el bit <6> RP1 tome el valor lógico bajo (cero) de esa manera le estaremos indicando a
la CPU que direccione la memoria hacia el banco 1.
Memoria de programa
Pagina 0
2K
07FFh
0800h
Pagina 1
2K
0FFFh
1000h
Pagina 2
2K
17FFh
1800h
Pagina 3
2K
1FFFh
Pila
Una pila (stack en inglés) es una lista ordenada o estructura de datos que permite
almacenar y recuperar datos. En este caso almacena direcciones .
Este microcontrolador puede almacenar 8 direcciones en la pila.
Los 8 niveles son de 13 bit cada uno, al igual que el PC
El modo de acceso a sus elementos es de tipo LIFO (del inglés Last In, First Out, «último en
entrar, primero en salir»).
La función de una pila es de ser un buffer temporal en que se guarda el PC (contador de
programa).
12 0
Nivel 1
Nivel 2
Nivel 3
Nivel 4
:
Nivel 8
Comentario:
‘’Una metáfora que se utiliza con frecuencia es la idea de una pila de platos dispuesta en
una cafetería en un contenedor con un muelle que mantiene la pila a nivel. En esa serie,
solo el primer plato es visible y accesible para el usuario, todos las demás permanecen
ocultos. Como se añaden nuevos platos, cada nuevo plato se convierte en la parte
superior de la pila, permaneciendo escondidos debajo los demás. A medida que el plato
superior se extrae de la pila, el inmediatamente inferior pasa a ocupar la parte superior de
la pila. Dos principios importantes son ilustrados por esta metáfora: únicamente se
accede al plato que se encuentra en la parte superior (el último en depositarse), y el resto
de platos de la pila permanecen ocultos. Para extraer un plato distinto al superior habrá
que extraer antes los que se encuentran sobre él. ‘’
Fuente: https://es.wikipedia.org/wiki/Pila_(informatica)
Las instrucciones CALL, RETURN, RETFIE y REETLW son las que afectan y hacen uso de la pila.
La instrucción CALL se puede utilizar todas las veces que el programador necesite; Pero como
la pila es de 8 niveles, eso significa que solo se podrá utilizar la instrucción CALL una cantidad
máxima de 8 veces de manera anidada (un CALL dentro de otro CALL)
STATUS
7 6 5 4 3 2 1 0
La función de los bit <5,6,7> se utilizan para seleccionar el banco de la memoria de datos RAM.
Los bit <0,1,2,3,4> son banderas las cuales sirve para indicar algún evento interno dentro del
microcontrolador.
Además del registro STATUS existen otros registro que albergan bandera en su interior para
señalizar ciertas condiciones del microcontrolador.
Los bit #TO, #PD Sirven para indicar las causas que ha provocado la reinicialización del
microcontrolador. El símbolo de # (numeral) indica que son activos en bajo.
Los bit C,DC y Z del registro STATUS son las banderas de señalización en las operaciones lógicas
aritméticas. Y son afectadas por ciertas instrucciones (no todas las instrucciones afectan a estas
banderas).
• Bit <0> C Acarreo / llevada del 8vo bit: Se pone a 1 automáticamente cuando existe acarreo
en el bit de mas peso en la instrucción de suma. También actúa como señalizador de llevada
en las instrucciones de restas, pero en este caso la correspondencia es inversa, es decir, si
vale cero hay llevada.
• Bit <1> DC Acarreo / llevada del 4vo bit: Funciona igual que C pero en el 4to bit, es utilizado
en operaciones con números BCD.
Es necesario aprenderse de memoria la función de los bit RP1, RP0, Z y C ya que estos son
muy utilizados.
STATUS
7 6 5 4 3 2 1 0
Por ejemplo: el pin 2 RA0/AN0 del micro aparte de ser RA0 , también puede ser AN0, es
decir tiene dos funciones multiplexada y dependiendo de la configuración interna de los
registro, este pin puede trabajar como entrada o salida digital (RA0) o como entrada
analógica (AN0)
Como se Observa cada pin tiene mas de una función multiplexada, están separadas por
una diagonal (/)
Pero cada pin solo puede trabajar en un solo modo según la programación.
Por ahora se estudiara la función de los pines como puertos digitales, ya sea como
entrada o salida.
Puertos
Este microcontrolador esta conformado por 5 puertos (PORT) que van de la A a la E:
PORTA
PORTB
PORTC
PORTD
PORTE
Los puertos representan el estado lógico de cada bit. A continuación se presenta una tabla con la
cantidad de entradas y salida (cada uno de los bit que posee cada puerto) y del numero de pin
correspondiente al microcontrolador.
RA0 2
RA1 3
RA2 4
PORTA 6
RA3 5
RA4 6
RA5 7
RB0 33
RB1 34
RB2 35
RB3 36
PORTB 8
RB4 37
RB5 38
RB6 39
RB7 40
RC0 15
RC1 16
RC2 17
RC3 18
PORTC 8
RC4 23
RC5 24
RC6 25
RC7 26
RD0 19
RD1 20
RD2 21
RD3 22
PORTD 8
RD4 27
RD5 28
RD6 29
RD7 30
RE0 8
PORTE 3 RE1 9
RE2 10
Puertos
o Todos los puertos (A,B,C,D,E) pueden funciona como estrada o salidas (E/S) digitales.
o Los puertos B,C y D son de 8 bit, mientras que los puerto A y E son de 6 bit y 3bit
respectivamente
o Cada uno de los bit que conforman los puertos tienen funciones multiplexadas, es decir que
un bit puede tener mas de una función. Dicha función es configurada en el programa fuente.
o Para configurar un puerto como entrada se debe colocar un uno (1) y para configurarlo como
salida se debe colocar un cero (0) en el registro correspondiente al puerto.
El registro TRISA configura al puerto A ya sea como entrada (1) o salida (0)
El registro TRISB configura al puerto B ya sea como entrada (1) o salida (0)
El registro TRISC configura al puerto C ya sea como entrada (1) o salida (0)
El registro TRISD configura al puerto D ya sea como entrada (1) o salida (0)
El registro TRISE configura al puerto E ya sea como entrada (1) o salida (0)
Como se pueden dar cuenta, existe un registro llamado TRISX para cada puerto, donde la
x es la letra que corresponde al puerto, y sirve para configurar los puertos del
microcontrolador ya sea como una entrada o como una salida.
Todos las TRISX se encuentran en el banco 1. eso quiere decir que para configurar los
puertos se debe primero ingresar al banco 1 con los bit RP0 y RP1 del registro STATUS
Puertos
Solución: Para configurar todo el puerto B como entrada se debe colocar a 1 los bit del registro
TRISB entonces:
TRISB=11111111
TRISB
7 6 5 4 3 2 1 0
1 1 1 1 1 1 1 1
Solución: Para configurar todo el puerto C como salida se debe colocar a 0 los bit del registro
TRISC entonces:
TRISC=00000000
TRISC
7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
1 0 0 1 0 1 1 0
Solución: Se trata del puerto D y esta configurado como entrada en los bit <7,4,2,1> y como salida
en los bit <6,5,3,0>
Puertos
TRISE
7 6 5 4 3 2 1 0
x x x x x 1 0 1
Solución: Se trata del puerto E y esta configurado como entrada en los bit <2 y 0> y como salida
en el bit <1>.
*Nota:
En el ejemplo 3 se puede observar que un mismo puerto puede tener bit como entrada y
otros como salida.
Con respecto al ejemplo 4, a los bit <7 al 3> se le colocan una x (don’t care) ya que el
puerto E es de 3 bit por lo tanto los bit <7 al 3> no se toman en cuenta y pueden ser cero
o uno.
El programador decide que puerto trabajaran como entradas o como salidas mediante la
configuración de los registros TRIS en el código fuente según el diseño electrónico del
circuito al cual va estar destinado el microcontrolador, es decir:
Una entrada se utiliza para conectar: un pulsador, un teclado, un sensor, una señal.
Una salida es utilizada para conectar: un LED, una pantalla LCD, la activación de una carga
(por medio de un transistor y relé), un display BCD 7 segmentos, otro circuito integrado
compatible (con niveles TTL).
Pin 11 VDD
Pin 12 VSS
pin 31 VSS
Pin 32 VDD
#MCLR 1 40 RB7
RA0 2 39 RB6
RA1 3 38 RB5
RA2 4 37 RB4
RA3 5 36 RB3 +5V
RA4 6 35 RB2
+5V RA5 7 34 RB1
RE0 8 33 RB0
RE1 9 32 VDD
RE2 10 31 VSS
VDD 11 30 RD7
VSS 12 29 RD6
OSC1 13 28 RD5
OSC2 14 27 RD4
RC0 15 26 RC7
RC1 16 25 RC6
RC2 17 24 RC5
RC3 18 23 RC4
RD0 19 22 RD3
RD1 20 21 RD2
Palabra de Configuración
Se utiliza para seleccionar ciertas configuraciones del microcontrolador .
Es un registro de 14 bit propio en la posición 2007h (mas haya de la memoria de programa)
Solo puede accederse durante la programación.
Hay que configurarlos en el programa fuente (si se configuran mal el micro no funcionara
según lo deseado ya sea al principio o en algún punto del programa)
CONFIG
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 <0,1> Oscilador (FOSC1, FOSC2): Estos son los bit de selección del tipo de oscilador que usara el microcontrolador.
puede trabajar en modo LP, XT HS, RC
Bit <2> Watch Dog Timer Enable (WDTE): El "Perro Guardián" (algunos prefieren llamarle simplemente "Guardián") es
otra característica de seguridad en los microcontroladores cuyo objeto es prevenir que el microcontrolador se quede
indefinidamente bloqueado o "colgado" debido a fallas en la lógica del software y en algunos casos debido a fallas de
hardware . Se trata de un contador que trabaja con los impulsos de su propio oscilador y que provoca un reset cuando se
desborda . cuando el conteo llega a su máximo, se produce efectivamente el reinicio de todo el sistema, dándole al mismo
la posibilidad de restaurarse a su funcionamiento normal. En aplicaciones simples que no requieren alta confiabilidad
generalmente es más práctico dejarlo deshabilitado (especialmente para los principiantes).
Bit <3> Power up Timer (PWRT) : El temporizador de Power-up proporciona un retardo fijo de unos 72ms desde que se
produce el pulso de POR. Mientras que dura esta temporización el micro se mantiene en un estado de RESET. Este retardo
PWRT permite a la tensión VDD crecer hasta un valor aceptable de alimentación para el propio micro y para el resto de
circuitería que exista en la tarjeta y que se alimente desde la misma fuente de alimentación.
Bit <4,5> Code Protection bits (CP1,CP0): Bits de Protección de Código. Cuando se ha activado la protección de código en
un dispositivo, la memoria de éste ya no puede ser re-leída para verificación; de ahí que al verificar el código programado
se obtenga un mensaje de error que haría suponer que el código de programa no se ha grabado correctamente, sin
embargo éste no es el caso.
Bit <6> Brown out reset (BODEN): Detecta si la tensión de alimentación cae por debajo de un determinado valor (BVDD)
provocando un RESET del dispositivo. Esto asegura que el dispositivo no continúe con la ejecución del programa si la
alimentación se sale del rango de funcionamiento válido.
Bit <8> Data EE Memory Code Protection (CPD): Protección de código en la memoria EEPROM
Bit <9> FLASH Program Memory Write Enable (WRT): Habilitación de escritura de la memoria de programa FLASH.
Bit <11> In-Circuit Debugger Mode (DEBUG): Habilitador del modo depuración
Palabra de Configuración
Comentario:
Oscilador
El microcontrolador requiere de una señal de reloj (clock) para generar los impulsos que
necesita la CPU para ejecutar las instrucciones. Se utilizan dos pines del micro para introducir
dicha señal. La frecuencia máxima a la que puede trabajar este microcontrolador es de 20Mhz,
pero se puede utilizar frecuencias mas bajas como 16, 8, 4 Mhz. Dependiendo de la velocidad
se deben de seleccionar dos bit de la palabra de configuración (FOSC1-FOSC0), de acuerdo a la
siguiente tabla.
si lo que se busca es bajar costos, la elección es usar un circuito RC externa o mejor aún el
oscilador RC interno que muchos microcontroladores actuales traen incorporados y evitar así el
uso de componentes externos adicionales. Si lo que se requiere es precisión, la elección es el
cristal; si adicionalmente se requiere bajo consumo de potencia, un cristal LP de bajo consumo
de potencia, y si lo que se requiere es velocidad, un cristal HS, pero tengamos siempre presente
como regla general que, a mayor frecuencia es también mayor el consumo de corriente.
Osccilador
Comentario:
Lo habitual es trabajar con un cristal de cuarzo, los mas comunes son de 4Mhz, 8Mhz,
16Mhzy 20Mhz.
Por lo general se suele utilizar el de 20Mhz para así poder trabajar a la máxima velocidad.
200 Khz 47 a 68 pf 47 a 68 pf
XT 1 Mhz 15 pf 15 pf
4 Mhz 15 pf 15 Pf
8 Mhz 15 a 30 pf 15 a 30 pf
HS 10 Mhz 15 a 30 pf 15 a 30 pf
20 Mhz 15 a 33 pf 15 a 33 pf
Oscilador
Comentario:
El cristal se conecta al micro en los pines 13 y 14 (OSC1, OSC2) tal como se muestra a
continuación junto con los condensadores.
+5V
10k
#MCLR 1 40 RB7
RA0 2 39 RB6
RA1 3 38 RB5
RA2 4 37 RB4
RA3 5 36 RB3 +5V
RA4 6 35 RB2
+5V RA5 7 34 RB1
RE0 8 33 RB0
RE1 9 32 VDD
RE2 10 31 VSS
VDD 11 30 RD7
C1 VSS 12 29 RD6
OSC1 13 28 RD5
OSC2 14 27 RD4
Cristal RC0 15 26 RC7
C2
RC1 16 25 RC6
RC2 17 24 RC5
RC3 18 23 RC4
RD0 19 22 RD3
RD1 20 21 RD2