Sie sind auf Seite 1von 32

SISTEMAS DIGITALES

C2. EL microcontrolador

PIC16F877A
 Funcionamiento de un microcontrolador genérico
 Características y funcionamiento del microcontrolador PIC16F877A
 Organización de la memoria
 Memoria de programa
 Memoria de datos
El microcontrolador PIC16F877. Organización de la memoria SD2

SISTEMA MICROCONTROLADOR
Elementos básicos de un sistema microcontrolador.

* UNIDAD CENTRAL DE PROCESO (CPU): Bloque más importante. Controla a los demás.
Interpreta y ejecuta las instrucciones.

* MEMORIA CENTRAL:
MEMORIA DE PROGRAMA: Contiene las instrucciones en código máquina del programa
que se ejecuta. Es de sólo lectura***.
MEMORIA DE DATOS: La utiliza la CPU para almacenar resultados parciales o finales. Es
RAM (lectura y escritura).

* BUSES: Caminos que unen los bloques del sistema. Por donde circula la información
(órdenes, datos,...) a través de señales eléctricas.
BUS DE DIRECCIONES, BUS DE DATOS y BUS DE CONTROL.

* ENTRADAS Y SALIDAS (I/O): Conectan el sistema con el exterior. Es la INTERFAZ del


microprocesador con los periféricos. Adapta sus señales eléctricas.

MICROCONTROLADOR
El microcontrolador PIC16F877. Organización de la memoria SD3

TERMINALES o PINES DE LOS MICROCONTROLADORES PIC16F87XA


Nota:
• Memorias (arquitectura Harvard):
SS# = SS MCLR#/VPP 1 40 RB7/PGD - Memoria de programa FLASH
RA0/AN0 2 PDIP 39 RB6/PGC
RA1/AN1 3 38 RB5 - Memoria RAM de datos
RA2/AN2/VREF-/CVREF 4 37 RB4 - Memoria EEPROM de datos

PIC16F877
PIC16F874
RA3/AN3/VREF+ 5 36 RB3/PGM
RA4/T0CKI/C1OUT 6 35 RB2 • Puertos de entrada y salida paralelos:
RA5/AN4/SS#/C2OUT 7 34 RB1 - Puertos de Entrada/Salida
RE0/RD#/AN5 8 33 RB0/INT - Puerto Esclavo Paralelo (PSP)
RE1/WR#/AN6 9 32 VDD
RE2/CS#/AN7 10 31 VSS • Temporizadores/contadores:
VDD 11 30 RD7/PSP7
VSS 12 29 RD6/PSP6 - (TMR0, TMR1, TMR2)
PIC16F877A
PIC16F874A
OSC1/CLKIN 13 28 RD5/PSP5 • Comunicaciones serie:
OSC2/CLKOUT 14 27 RD4/PSP4
RC0/T1OSO/T1CKI 15 26 RC7/RX/DT - Transmisor Receptor Asíncrono Síncrono
RC1/T1OSI/CCP2 16 25 RC6/TX/CK Universal (USART ó SPI/I2C)
RC2/CCP1 17 24 RC5/SDO - Puerto Serie Síncrono Básico ó Maestro
RC3/SCK/SCL 18 23 RC4/SDI/SDA (BSSP ó MSSP)
RD0/PSP0 19 22 RD3/PSP3
RD0/PSP1 20 21 RD2/PSP2 • Módulo de Captura / Comparación / PWM:
- CCP1 y CCP2
• Conversión Analógica / Digital (A/D)
• Comparador analógico (PIC16F877A)
PIC16F874/877/874A/877A: • Referencia de tensión configurable
(PIC16F877A)
• 40 o 44 terminales o pines
dependiendo del encapsulado.
• 33 terminales de E/S en 5
puertos (A, B, C, D y E)
El microcontrolador PIC16F877. Organización de la memoria SD4

•Memoria de programa FLASH 8K x 14 BDIR-INST Bus de datos


Memoria de BDAT RA0/AN0
13 Contador 8
-Contiene el programa con las Programa Programa
RA1/AN1
RA2/AN2/VREF-
PORTA
instrucciones que gobiernan la FLASH (PC) 7 0 RA3/AN3/VREF+
RA4/T0CKI
aplicación. 13 0 Memoria RA5/AN4/SS#
368 x 8 de datos
-Es del tipo no volátil. (Archivo de
Bus de programa RB0/INT
14 Pila (STACK)
-Su capacidad es de 8K (8192) BINST de 8 niveles
Registros) RB1
RB2
RAM
palabras de 14 bits. (13 bits) 9 BDIR-DAT PORTB RB3/PGM
RB4
Registro de RB5
•Memoria de datos RAM Instrucciones Mux. Direc. RB6/PGC
RB7/PGD
7
-Guarda las variables y datos. 8
Direc.
indirecto
RC0/T1OSO/T1CKI
-Es volátil. Direccionamiento
Reg. FSR RC1/T1OSI/CCP2
directo RC2/CCP1
-Son 368 registros de 8 bits. PORTC RC3/SCK/SCL
Dato inmediato Reg. STATUS RC4/SDI/SDA
8 RC5/SDO
•Memoria EEPROM de datos RC6/TX/CK
RC7/RX/DT
-Es una pequeña área de Timer de encendido 3
Mux
(PWRT)
memoria de datos de lectura y Decodificación Timer de arranque RD0/PSP0
escritura no volátil que permite de instrucciones del Oscilador (OST)
RD1/PSP1
RD2/PSP2
garantizar que determinada y control Reset de encendido
PORTD RD3/PSP3
RD4/PSP4
(POR)
información estará siempre Timer del watchdog 8
ALU RD5/PDP5
RD6/PDP6
disponible al reinicializarse el Generación de (WTD) RD7/PDP7
tiempo
programa. Reset
Reg. W
Brown-out
RE0/AN5/RD#
-Se gestiona de manera distinta Depuración
PORTE RE1/AN6/WR#
En circuito
a la memoria de datos RAM. Programación en Puerto
RE2/AN7/CS#
OSC1/CLKIN esclavo
Bajo voltaje
OSC2/CLKOUT paralelo Interrupciones INT
MCLR# VDD, VSS (Externa)
(Internas)

Conversor
Timer0 Timer1 Timer2 A/D
de 10 bits

Memoria de SSP
Memoria de Programa 256 x 8 Datos
Módulos
Puerto serie USART
CCP1,2
y de datos EEPROM síncrono
El microcontrolador PIC16F877. Organización de la memoria SD5

MEMORIA DE PROGRAMA: EL CONTADOR DE PROGRAMA (CP)


Líneas de direcciones (direccionamiento)
8K x 14 BDIR-INST
Memoria de 13 Contador
Programa Programa
FLASH (PC)
13 0

Líneas de datos de la memoria Pila (STACK)


14 Bus de programa
de programa (contenido) BINST
de 8 niveles
(13 bits)
14 bits
Registro de
0000h Vector RESET Instrucciones
•••
0004h Vector Interrupción
0005h Memoria de
Programa en el chip • A la dirección 0x0000 se accederá tras un RESET y a la
07FFh (Página 0) posición 0x0004 tras una interrupción cualquiera
0800h Memoria de • Cualquier reset (interno o externo) que se genere en un
Programa en el chip 8K
microcontrolador hará que su contador de programa pase
0FFFh (Página 1) a tener el valor 0000h y que por tanto el microcontrolador
1000h Memoria de pase a ejecutar la instrucción situada en dicha posición.
Programa en el chip
17FFh (Página 2)
• El RESET también limpia el contenido del PC.
1800h Memoria de • Los 8K de memoria de programa disponible están
Programa en el chip divididos en 4 páginas de 2K cada una.
1FFFh (Página 3)
13 0
El microcontrolador PIC16F877. Organización de la memoria SD6

PAGINACION DE LA MEMORIA DE PROGRAMA


PCLATH
• Los 8K de memoria de programa disponible
PC<12:0> PC<12:8> PCL están divididos en 4 páginas de 2K cada
13 CALL, RETURN una (0h–7FFh, 800h-FFFh, 1000h-17FFh y
RETFIE, RETLM 1800h-1FFFh). Esto es debido a que las
Pila Nivel 1
instrucciones de salto y llamada a
subrutina permiten cargar sólo 11 bits en el
•• • PC (desplazamiento en 211 = 2K)
Pila Nivel 8
12 0
• Si se están ejecutando instrucciones
0000h Vector RESET secuencialmente, el contador de programa
•• • pasará de una página a otra sin necesidad
de intervención por parte del usuario o
0004h Vector Interrupción 2K programador.
0005h Memoria de
4K
Programa en el chip
07FFh (Página 0) 6K • Para saltar entre páginas de la memoria de
0800h Memoria de programa los 2 bits más altos del PC deben
8K modificarse. Esto se realiza utilizando el
Programa en el chip
0FFFh (Página 1) registro PCLATH (es un registro situado en
1000h Memoria de la memoria de datos).
Programa en el chip
17FFh (Página 2)
1800h Memoria de
Programa en el chip
1FFFh (Página 3)
13 0
El microcontrolador PIC16F877. Organización de la memoria SD7

CONTADOR DE PROGRAMA: REGISTROS PCLATH Y PCL


• El Contador de programa (PC: Program Counter) es el registro del microcontrolador
cuya función es direccionar la memoria de programa. Indica la posición de la siguiente
instrucción a ejecutar.

• El contador de programa (PC) es un registro de 13 bits que se descompone en 2 registros,


PCL y PCH.
• Cada vez que se opere con PCL o se cargue el PC con 11 bits procedentes de un salto o
llamada a subrutina, un registro denominado PCLATH, aportará los bits que le falten al
PC para llegar a los 13 (aporta 5 bits ó 2 bits).
• Las instrucciones que modifican el PCL y que por tanto pueden modificar el PCH son las
siguiente:
- Instrucciones que tengan el PCL como destino. Ej. MOVWF PCL
- Instrucciones GOTO
- Instrucciones CALL
• El PCLATH (PC Latch High) no es la parte alta del PC, sino que es un complemento al
PCL o a la dirección que aporta una instrucción de salto o llamada a subrutina

Aportación de PCLATH para completar


PCLATH c7 c6 c5 c4 c3 c2 c1 c0
el PC y llegar a 13 bits

PC b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

11 bits que acompañan al código


en un salto o llamada a subrutina
El microcontrolador PIC16F877. Organización de la memoria SD8

CONTADOR DE PROGRAMA
Instrucción GOTO

Si se ejecuta una instrucción goto, los 11 bits de menor peso del PC son aportados por la
instrucción, mientras que los 2 bits más significativos del PC, que reportan el número de la
página a la que se salta, se cargan desde los bits 4 y 3 del registro PCLATH.

DIR. DE MEMORIA INSTRUCCIÓN CÓDIGO INSTRUCCIÓN CONTENIDO DEL PC


DE PROGRAMA
12 8 7 0
.... ....
0025h GOTO LABEL1 0 0 0 0 0 0 0 1 0 0 1 1 0 0026h
10 1000 0101 0110
.... 12 8 7 0
....
0 1 0 0 0 0 1 0 1 0 1 1 1 0857h
0856h LABEL1 MOVLW 0xF0 11 0000 1111 0000

7 4 3 0 12 11 10 8 7 0
CONTENIDO DEL 0 1 0 0 0 0 1 0 1 0 1 1 0
X X X 0 1 X X X
REGISTRO PCLATH

La pila no se ve afectada
por la instrucción Próxima instrucción a ejecutar 0856h
El microcontrolador PIC16F877. Organización de la memoria SD9

CONTADOR DE PROGRAMA
Instrucción CALL

Si se ejecuta una instrucción call, los 11 bits de menor peso del PC son aportados por la
instrucción, mientras que los 2 bits más significativos del PC, que reportan el número de la
página a la que se salta, se cargan desde los bits 4 y 3 del registro PCLATH.

DIR. DE MEMORIA INSTRUCCIÓN CÓDIGO INSTRUCCIÓN CONTENIDO DEL PC


DE PROGRAMA
12 8 7 0
0004h .... 0 0 0 0 0 0 0 0 0 0 1 1 0 0006h
0005h CALL SUBRUT1 10 0000 0000 0000
0006h 12 8 7 0
.... 1 0 0 0 0 0 0 0 0 0 0 0 1 1001h
1000h SUBRUT1 MOVLW 0xF0 11 0000 1111 0000
....
1100h RETURN
7 4 3 0 12 11 10 8 7 0
CONTENIDO DEL
X X X 1 0 X X X 1 0 0 0 0 0 0 0 0 0 0 0 0
REGISTRO PCLATH

La pila guarda la posición para


retornar tras la subrutina
12 8 7 0
Próxima instrucción a ejecutar 1000h
0 0 0 0 0 0 0 0 0 0 1 1 0
El microcontrolador PIC16F877. Organización de la memoria SD10

CONTADOR DE PROGRAMA
Instrucción RETURN, RETFIE ó RETLW

Si se ejecuta una instrucción de retorno desde una subrutina, los 13 bits del PC se cargan
desde el tope de la pila. No interviene PCLATH.

DIR. DE MEMORIA INSTRUCCIÓN CÓDIGO INSTRUCCIÓN CONTENIDO DEL PC


DE PROGRAMA

0004h ....
0005h CALL SUBRUT1 10 0000 0000 0000
0006h
....
1000h SUBRUT1 MOVLW 0xF0 11 0000 1111 0000 12 8 7 0
.... 1 0 0 0 1 0 0 0 0 0 0 0 1 1101h
1100h RETURN 00 0000 0000 1000
12 11 10 8 7 0
CONTENIDO DEL 7 4 3 0
0 0 0 0 0 0 0 0 0 0 1 1 0
REGISTRO PCLATH X X X X X X X X
(No afecta al contenido del registro
PCLATH el retorno de subrutina)
La pila guarda la posición para
retornar tras la subrutina
12 8 7 0
0 0 0 0 0 0 0 0 0 0 1 1 0 Próxima instrucción a ejecutar 0006h
El microcontrolador PIC16F877. Organización de la memoria SD11

EJEMPLO 1: ¿Cuál o cuales de los siguientes programas para un PIC16F877A


realizará correctamente la puesta a cero de TMR0?

INCLUDE P16f877A.INC INCLUDE P16f877A.INC INCLUDE P16f877A.INC

ORG 0X00 ORG 0X00 ORG 0X00


BSF PCLATH,3 MOVLW 0XFF BSF PCLATH,3
MOVWF PCLATH BSF PCLATH,4
CALL SUBRUT1 CALL SUBRUT1 CALL SUBRUT1
ESPERA GOTO ESPERA ESPERA GOTO ESPERA ESPERA GOTO ESPERA

ORG 0X800 ORG 0X800 ORG 0X800


NOP NOP NOP

ORG 0X1800 ORG 0X1800 ORG 0X1800


SUBRUT1 CLRF TMR0 SUBRUT1 CLRF TMR0 SUBRUT1 CLRF TMR0
BCF PCLATH,3 CLRF PCLATH CLRF PCLATH
RETURN RETURN RETURN

END END END

CASO 1 CASO 2 CASO 3


El microcontrolador PIC16F877. Organización de la memoria SD12

CONTADOR DE PROGRAMA
Instrucciones que modifican el PCL

Si se ejecuta una instrucción que modifica el PCL, los 8 bits de menor peso del PC son
aportados por el resultado de la modificación del PCL, mientras que los 52 bits más
significativos del PC, se cargan desde los bits 0 - 4 del registro PCLATH.

DIR. DE MEMORIA INSTRUCCIÓN CÓDIGO INSTRUCCIÓN CONTENIDO DEL PC


DE PROGRAMA
....
0004h MOVLW 0X20 11 0000 0010 0000 12 8 7 0
0005h MOVWF PCL 00 0000 1000 0010
0 0 0 0 0 0 0 0 0 0 1 1 0 0006h
0006h
.... 12 8 7 0
1020h MOVLW 0xF0 11 0000 1111 0000 1 0 0 0 0 0 0 1 0 0 0 0 1 1021h
....
7 4 3 0
CONTENIDO DEL
REGISTRO PCL 0 0 1 0 0 0 0 0

12 11 10 8 7 0
7 4 3 0
CONTENIDO DEL 1 0 0 0 0 0 0 1 0 0 0 0 0
X X X 1 0 0 0 0
REGISTRO PCLATH

Próxima instrucción a ejecutar 1020h


El microcontrolador PIC16F877. Organización de la memoria SD13

CONTADOR DE PROGRAMA
Debe tenerse cuidado al implementar tablas de conversión (como por ejemplo en las
utilizadas en teclados matriciales) que la tabla no quede a caballo entre 2 páginas de
memoria.
En la porción de programa para un PIC16F877A que se adjunta, se puede apreciar como en un determinado
momento se pretende cargar el contenido del PORTB (que puede variar entre 0x00 y 0x1F), sumarle 0x20 y sacar el
valor obtenido por el PORTC (suponer los registros asociados a los puertos programados oportunamente). Se
observa, no obstante, que para determinados valores del PORTB la operación no se ejecuta correctamente. ¿Por
qué?
include "p16F877A.inc" org 7F0h retlw 0x2F
org 00h ;Reset TABLA retlw 0x30
Vector addwf PCL,f retlw 0x31
goto Start retlw 0x20 retlw 0x32
org 0F0h retlw 0x21 retlw 0x33
nop retlw 0x22 retlw 0x34
org 100h retlw 0x23 retlw 0x35
Start retlw 0x24 retlw 0x36
bsf STATUS,RP0 retlw 0x25 retlw 0x37
clrf TRISC retlw 0x26 retlw 0x38
bcf STATUS,RP0 retlw 0x27 retlw 0x39
Bucle retlw 0x28 retlw 0x3A
movlw 0x07 retlW 0x29 retlw 0x3B
movwf PCLATH retlw 0x2A retlw 0x3C
movf PORTB,w retlw 0x2B retlw 0x3D
call TABLA retlw 0x2C retlw 0x3E
movwf PORTC retlw 0x2D retlw 0x3F
goto Bucle retlw 0x2E end

0x0800 = b’0 1000 0000 0000’


El microcontrolador PIC16F877. Organización de la memoria SD14

EJEMPLO 2: ¿Cuál o cuales de los siguientes programas para PIC16F877A realizará


correctamente la ejecución desde la posición 0x100 hasta la etiquetada como WAIT?.
Suponer que TECLA es una variable donde se tiene el valor para el desplazamiento dentro
de TABLA.

INCLUDE P16F877A.INC INCLUDE P16F877A.INC INCLUDE P16F877A.INC INCLUDE P16F877A.INC


ORG 0x00 ORG 0x00 ORG 0x00 ORG 0x00
GOTO INI GOTO INI GOTO INI GOTO INI
ORG 0X100 ORG 0X100 ORG 0X100 ORG 0X100
INI MOVLW 0x10 INI BSF PCLATH,4 INI MOVLW 0x1F INI BSF PCLATH,3
MOVWF PCLATH MOVF TECLA,W MOVWF PCLATH MOVF TECLA,W
MOVF TECLA,W CALL TABLA MOVF TECLA,W CALL TABLA
CALL TABLA WAIT GOTO WAIT CALL TABLA CLRF PCLATH
CLRF PCLATH ORG 0x1000 CLRF PCLATH WAIT GOTO WAIT
WAIT GOTO WAIT TABLA WAIT GOTO WAIT ORG 0x1000
ORG 0x1000 ADDWF PCL,F ORG 0x1000 TABLA
TABLA RETLW 0x01 TABLA ADDWF PCL,F
ADDWF PCL,F RETLW 0x02 ADDWF PCL,F RETLW 0x01
RETLW 0x01 ................ RETLW 0x01 RETLW 0x02
RETLW 0x02 RETLW 0x0F RETLW 0x02 ................
................ END ................ RETLW 0x0F
RETLW 0x0F RETLW 0x0F END
END END

CASO 1 CASO 2 CASO 3 CASO 4


El microcontrolador PIC16F877. Organización de la memoria SD15

LA PILA
• Es un tipo de estructura de datos con organización LIFO (Last In First Out): el último que
entra es el primero que sale.
• La pila permite almacenar las direcciones (PCs) a donde debe retornar el programa
cuando se finaliza una llamada a una subrutina o cuando se finaliza la ejecución de una
rutina de interrupción.
• Es un espacio de memoria totalmente independiente entre la memoria de datos y la
memoria de programa.
• El puntero de pila (SP) no se puede leer ni escribir (es gestionada por el hardware) así
como el contenido de la pila ya que carece de instrucciones para el manejo de la misma.
12 0

DIR1 DIR9
DIR2 DIR10
•Los microcontroladores de la familia PIC16 tienen
una pila de 8 niveles x 13 bits lo que permite como DIR3
máximo 8 saltos a subturinas (CALLs) o ejecuciones DIR4
de rutinas de interrupción (salto a 0004h). DIR5
•No existe indicador de desbordamiento de la pila. DIR6
DIR7
DIR8
El microcontrolador PIC16F877. Organización de la memoria SD16

SUBRUTINAS
MEMORIA MEMORIA
PROGRAMA PROGRAMA

1
$0100 Comienzo
CALL PROGRAMA
PROGRAMA PROGRAMA 1
PRINCIPAL 3 PRINCIPAL
END $0200 CALL
$0201 3A
$0202 02
$0203
3

$0215 JSR
$0216 3A
SUBRUTINA 2
$0217 02
$0218 5
RETURN

LLAMADA A SUBRUTINA: CALL $023A $023A Comienzo


Guarda contenido del CP (dirección de retorno) SUBRUTINA
Carga en CP la dirección de comienzo de la subrutina. SUBRUTINA
2 4
RETORNO SUBRUTINA: RETURN RETURN
Cargar en CP la dirección guardada
El microcontrolador PIC16F877. Organización de la memoria SD17

INTERRUPCIONES
• Mecanismos de conexión del sistema microprocesador con el exterior (periféricos)

• Sincronizan la ejecución del programa con acontecimientos externos.

• Facilitan la incorporación del microprocesador a sistemas que funcionan en tiempo real.

• Funcionan como las subrutinas, pero se diferencian en la forma de puesta en marcha.


SUBRUTINA: Mecanismo software.
INTERRUPCIÓN: Mecanismos hardware.
• Las interrupciones se producen en cualquier momento. No están ligadas al programa.

• La interrupción implica la ejecución de una RUTINA DE ATENCIÓN A LA INTERRUPCIÓN


(RAI).
CPU MEMORIA
PROGRAMA

Entrada de
PROGRAMA 1
interrupción
PRINCIPAL • La RAI la programa el usuario.
• Se deben salvar los datos
3 necesarios para volver al
END
programa principal en las mismas
condiciones.
• Se utiliza el mecanismo de PILA.
RAI
2

RETFIE
El microcontrolador PIC16F877. Organización de la memoria SD18

MEMORIA RAM DE DATOS


• La memoria RAM de datos o memoria de datos de los µC PIC está organizada en palabras de 8
bits (bytes).
• La memoria de datos está paginada (las páginas de la memoria de datos se llaman BANCOS).
• Cada banco (bank) contiene hasta 128 localizaciones de memoria o registros, cuyas
direcciones van desde 00h a 7Fh dentro de cada banco.
• Todos los microcontroladores de gama media tienen al menos 2 bancos de registros, es decir,
hasta 256 registros con las direcciones absolutas 00h-FFh. Algunos pueden tener hasta 4
bancos de registros, con un total de 512 posibles registros, con las direcciones absolutas 000h-
1FFh.

MEMORIA RAM DE DATOS • La memoria de datos se


00h 00h organiza en bancos de 128 bytes
porque cuando se indica una
dirección de operando fuente,
sólo se pueden incluir 7 bits en
la codificación.
000h 080h 100h 180h Nos movemos pues en 27=128
a a a a bytes ¿y los otros 2 bits?
07Fh 0FFh 17Fh 1FFh 27 = 128 = (00h – 7Fh)
29 = 512 = (000h -1FFh

7Fh 7Fh
Banco0 Banco1 Banco2 Banco3
El microcontrolador PIC16F877. Organización de la memoria SD19

MEMORIA RAM DE DATOS

• Almacena todas los datos que se manejan en un programa.

• La máxima cantidad de memoria disponible en los microcontroladores PIC16 es de 512


bytes. No obstante, no están implementadas todas las posiciones de memoria en
todos los banco.

• Se distinguen dos tipos de registro:


 Registros de funciones especiales SFR (Special Function Registers).
- Son los primeros registros.
- Cada uno de ellos cumple un propósito especial en el control del PIC.
- Son los registros a través de los cuales se controla el microcontrolador y se
accede a sus diferentes periféricos, se programan sus funciones, etc.
 Registros de propósito general GPR (General Purpose Registers).
- Se pueden usar para guardar datos temporales.
- Constituyen la memoria de datos propiamente dicha, disponible para el libre
uso del usuario en sus programas.
 La cantidad de SFR y GPR varía según el modelo de microcontrolador
El microcontrolador PIC16F877. Organización de la memoria SD20

MODELO DE OPERACIÓN

El modelo de operación de los microcontroladores PIC de gama media consta del registro
de trabajo W (Working Register), que hace la función del tradicional acumulador de los
microprocesadores, y de los registros de la memoria de datos, ya sean de funciones
especiales SFR (Special Function Registers) o de propósito general GPR (General
Purpose Registers).

 Trabaja con el registro de trabajo


(WREG) y otro registro o una constante
El microcontrolador PIC16F877. Organización de la memoria SD21
Dirección BANCO 0 Dirección BANCO 1 Dirección BANCO 2 Dirección BANCO 3
MEMORIA RAM DE 00h
01h
INDF(1)
TMR0
80h INDF(1)
81h OPTION_REG
100h
101h
INDF(1)
TMR0
180h
181h
INDF(1)
OPTION_REG
DATOS 02h
03h
PCL
STATUS
82h
83h
PCL
STATUS
102h
103h
PCL
STATUS
182h
183h
PCL
STATUS
04h FSR 84h FSR 104h FSR 184h FSR
05h PORTA 85h TRISA 105h 185h
06h PORTB 86h TRISB 106h PORTB 186h TRISB
PIC16F877/877A 07h
08h
PORTC
PORTD(2)
87h
88h
TRISC
TRISD(2)
107h
108h
187h
188h
09h PORTE(2) 89h TRISE(2) 109h 189h
0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah PCLATH
0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh INTCON
0Ch PIR1 8Ch PIE1 10Ch EEDATA 18Ch EECON1
Cuenta con cuatro bancos de 0Dh PIR2 8Dh PIE2 10Dh EEADR 18Dh EECON2
memoria: Bancos 0, 1, 2 y 3. 0Eh TMR1L 8Eh PCON 10Eh EEDATH 18Eh Reservado(3)
0Fh TMR1H 8Fh 10Fh EEADRH 18Fh Reservado(3)
10h T1CON 90h 110h 16 bytes para 190h 16 bytes para
11h TMR2 91h SSPCON2 111h Registros de 191h Registros de
Los SFR (56 en PIC16F877A) 12h T2CON 92h PR2 112h Proposito 192h Proposito
aparecen en los rangos de 13h SSPBUF 93h SSPADD 113h general 193h general
14h SSPCON 94h SSPSTAT 114h 16 GPR 194h 16 GPR
direcciones 00h-1Fh del Banco 0, 15h CCPR1L 95h 115h 195h
80h-9Fh del Banco 1, 100h-10Fh 16h CCPR1H 96h 116h 196h
del Banco 2 y 180h-18Fh del Banco 17h CCP1CON 97h 117h 197h
18h RCSTA 98h TXSTA 118h 198h
3. Algunos son accesibles desde 19h TXREG 99h SPBRG 119h 199h
dos o más bancos (PCL, STATUS, 1Ah RCREG 9Ah 11Ah 19Ah
etc). 1Bh CCPR2L 9Bh 11Bh 19Bh
1Ch CCPR2H 9Ch CMCON(4) 11Ch 19Ch
1Dh CCP2CON 9Dh CVRCON(4) 11Dh 19Dh
1Eh ADRESH 9Eh ADRESL 11Eh 19Eh
Los GPR ocupan 368 posiciones de 1Fh ADCON0 9Fh ADCON1 11Fh 19Fh
memoria. Algunas posiciones de los 20h 96 bytes para A0h 80 bytes para 120h 80 bytes para 1A0h 80 bytes para
Bancos 1, 2 y 3 están mapeadas Registros de Registros de Registros de Registros de
Proposito Proposito Proposito Proposito
sobre el Banco 0. general general general General
96 GPR EFh 80 GPR 16Fh 80 GPR 1EFh 80 GPR
F0h GPR 170h GPR 1F0h GPR
Existen zonas de memoria no mapeados en Mapeados en mapeados en
empleadas que devuelven ‘0’ en BANCO 0 BANCO 0 BANCO 0
7Fh FFh 70h-7Fh 17Fh 70h-7Fh 1FFh 70h-7Fh
caso de lectura.
Celdas no implementadas, se leen 0 Nota (3): Registros reservados
Nota (1): No es un registro físico Nota (4): No implementado en PIC876/877
Nota (2): No implementado en PICF876/876A
El microcontrolador PIC16F877. Organización de la memoria SD22

MODOS DE DIRECCIONAMIENTO DE LA MEMORIA DE DATOS

• La memoria de datos está distribuida en 4 posibles bancos de 128 bytes cada uno.

• Existen 2 modos de direccionamiento para acceder a cualquiera de las posiciones de la


memoria de datos:
Direccionamiento directo
Direccionamiento indirecto

• Direccionamiento directo: La posición de memoria con la que se trabaja viene


directamente definida en el código de la instrucción.

• Direccionamiento indirecto: La posición de memoria con la que se trabaja viene


definida por el contenido del registro FSR (File Select Register) (Posición 04h, 84h,
104h ó 184h), es decir, el registro FSR actúa como puntero de la posición de memoria
con la que se pretende operar.
El microcontrolador PIC16F877. Organización de la memoria SD23

MODOS DE DIRECCIONAMIENTO DE LA MEMORIA DE DATOS


8K x 14 BDIR-INST Bus de datos
Memoria de 13 Contador 8 BDAT
Programa Programa
FLASH (PC) 7 0
13 0 368 x 8 Memoria
de datos
Pila (STACK) (Archivo de
14 Bus de programa Registros)
de 8 niveles
BINST RAM
(13 bits)
9 BDIR-DAT
Registro de
Instrucciones Mux. Direc.
7 Direc.
8 indirecto
Direc. directo
Reg. FSR

Para direccionar la RAM se necesitan 9 bits


Dir. directo: 7 bits de la instrucción ⇒ Se necesitan 2 bits para los 9 bits
Dir. indirecto: 8 bits del registro FSR ⇒ Se necesita un bit para los 9 bits
Los bits que se necesitan se cogen del registro de STATUS
El microcontrolador PIC16F877. Organización de la memoria SD24

MODOS DE DIRECCIONAMIENTO DE LA MEMORIA DE DATOS


Direccionamiento directo Direccionamiento indirecto
STATUS Código instrucción STATUS FSR
RP1 RP0 6 0 IRP 7 0

00 01 10 11
Selección Banco Selección Banco
00h 80h 100h 180h

Selección Posición Selección Posición


en el Banco en el Banco

7Fh FFh 17Fh 1FFh


BANCO 0 BANCO 1 BANCO 2 BANCO 3
BANCO DIRECTO INDIRECTO
ACCEDIDO (RP1:RP0) (IRP)
0 00
Tanto para el direccionamiento directo como el indirecto la 0
1 01
dirección completa (9 bits) no se puede obtener del código
2 10
de la operación (7 bits) o del registro FSR (8 bits). 1
3 11

Para direccionamiento directo, la dirección a operar se obtiene completando la dirección


incluida en el código de la instrucción con los bits RP1:RP0 del registro STATUS (bits 6 y 5).

Para direccionamiento indirecto, la dirección se obtiene completando el contenido del registro


FSR con el bit IRP del registro STATUS (bit 7).
El microcontrolador PIC16F877. Organización de la memoria SD25

DIRECCIONAMIENTO INDIRECTO

Intrucción ejecutada 1) SE LEE EL REGISTRO CONTENIDO EN


RAM EL CODIGO DE LA INSTRUCCIÓN.
Código Operación Dirección
2) SI EL REGISTRO ES DISTINTO DEL
9 CORRESPONDIENTE A INDF (00h,80h,100h
ó 180h) LA INSTRUCCIÓN SE EJECUTA
Dirección REGISTRO = INDF SOBRE EL REGISTRO INDICADO EN LA
Mux. Direc.
INSTRUCCIÓN COMPLEMENTADO CON
LOS BITS RP1:RP0 DEL REGISTRO
9 9 STATUS (DIRECCIONAMIENTO DIRECTO)

2 3) SI EL REGISTRO CORRESPONDE A LA
7 POSICION DE INDF (00h,80h,100h ó 180h),
RP1:RP0 LA INSTRUCCIÓN SE EJECUTA SOBRE EL
REGISTRO INDICADO EN EL REGISTRO
Código Operación REGISTRO IRP FSR FSR COMPLEMENTADO CON EL BIT IRP
DEL REGISTRO STATUS
Intrucción leída (buscada)

BCF STATUS,IRP ;dir. Indirecto, bancos 0/1


Ejemplo de direccionamiento MOVLW 0x20 ;Inicializa puntero a RAM
indirecto donde se limpian las MOVWF FSR ;
posiciones de memoria de NEXT CLRF INDF ;limpia registro INDF
datos comprendidas entre la INCF FSR,F ;Inc puntero (F ó 1)
posición 20h y la 2Fh (ambas BTFSS FSR,4 ;Todo limpio?
incluidas) GOTO NEXT ;NO, limpia siguiente
CONTINUE ;
: ;SI, continua
El microcontrolador PIC16F877. Organización de la memoria SD26

EJEMPLO DE DIRECCIONAMIENTO INDIRECTO donde se limpian todas las posiciones


de memoria de datos correspondientes a registros de propósito general (GPR).

CLRF STATUS ;Limpia STATUS (Banco 0) ; Banco 2


MOVLW 0x20 ;1ª dir de los GPRs en el banco ; (**Solo si el micro tiene banco 2 **)
MOVWF FSR ;Moverlo al reg, de dir. ind. ;
Bank0_LP BSF STATUS,IRP ;Selecciona Banco 2 y 3
CLRF INDF ;Limpia el GPR apuntado por FSR MOVLW 0x20 ;1ª dir de los GPRs en el banco
INCF FSR ;Inc.puntero MOVWF FSR ;Moverlo al reg, de dir. ind.
BTFSS FSR,7 ;Fin de banco? (FSR=80h, C=0) Bank2_LP
GOTO Bank0_LP ;NO, limpia siguiente CLRF INDF ;Limpia el GPR apuntado por FSR
; INCF FSR ;Inc.puntero
; Banco 1 BTFSS FSR,7 ;Fin de banco? (FSR=80h, C=0)
; (**Solo si el micro tiene banco 1 **) GOTO Bank2_LP ;NO, limpia siguiente
; ;
MOVLW 0xA0 ;1ª dir de los GPRs en el banco ; Banco 3
MOVWF FSR ;Moverlo al reg, de dir. ind. ; (**Solo si el micro tiene banco 3 **)
Bank1_LP ;
CLRF INDF ;Limpia el GPR apuntado por FSR MOVLW 0xA0 ;1ª dir de los GPRs en el banco
INCF FSR ;Inc.puntero MOVWF FSR ;Moverlo al reg, de dir. ind.
BTFSS STATUS,Z ;Fin de banco? (FSR=00h, Z=1) Bank3_LP
GOTO Bank1_LP ;NO, limpia siguiente CLRF INDF ;Limpia el GPR apuntado por FSR
; INCF FSR ;Inc.puntero
BTFSS STATUS,Z ;Fin de banco? (FSR=00h, Z=1)
GOTO Bank3_LP ;NO, limpia siguiente
El microcontrolador PIC16F877. Organización de la memoria SD27

REGISTROS DE FUNCIONES ESPECIALES


Los SFR asociados a diferentes funciones y periféricos de microcontroladores PIC de gama
media

Función o dispositivo SFR Función o dispositivo SFR


Selección del banco de memoria. STATUS Timer0 TMR0, OPTION, INTCON
Indicadores relacionados con las
operaciones aritméticas y lógicas.
Desbordamiento del perro guardián.
Indicador de bajo consumo
Valor del pre-divisor. Flancos de los pulsos OPTION Timer1 TMR1H, TMR1L
de reloj. Flanco de la solicitud de T1CON, PIR1
interrupción externa. Pull-up interno del
puerto B
Indicadores de error de paridad en PCON Timer2 TMR2, PR2, T2CON, PIR1
memoria. Tipo de reset. Bajo consumo
Contador de programa PCLATH, PCL Módulos CCPx (x = 1,2,3) CCPRxH, CCPRxL,
CCPxCON
Direccionamiento indirecto FSR Puerto serie USART o SCI TXREG, TXSTA, RCREG,
RCSTA
Interrupciones INTCON Puerto serie síncrono SSP SSPSTAT, SSPCON,
PIR1,PIE1 SSPBUFF, SSPADD
PIR2,PIE2
Puertos paralelos PORTA,TRISA Convertidor A/D ADRESH, ADRESL, ADCON0,
PORTB,TRISB ADCON1
PORTC,TRISC Memoria EEPROM de datos EEADRH, EEADR, EEDATH,
PORTD,TRISD y FLASH de programa EEDATA,
PORTE,TRISE EECON1, EECON2
El microcontrolador PIC16F877. Organización de la memoria SD28

SFR asociado al núcleo: REGISTRO STATUS


R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x Valores de los bits después de un reset
Registro STATUS
R = el bit se puede leer
(direcciones 03h, IRP RP1 RP0 TO# PD# Z DC C Nota:
W = el bit se puede escribir
83h, 103h, 183h) TO# = TO
bit 7 bit 0 x = Valor desconocido

El registro STATUS es el más usado de todos, sus bits controlan las funciones vitales del
microcontrolador. Por eso, está duplicado en las cuartas posiciones de cada banco.

bit 7 IRP: Selecciona el Banco de Memoria de datos en el bit 2 Z (Zero): Indicador de cero
direccionamiento indirecto. 1 = Si el resultado de una operación aritmética o lógica es cero
0 = Bancos 0 y 1 (00h - FFh) (256 bytes) 0 = Si el resultado de una operación aritmética o lógica es no
1 = Bancos 2 y 3 (100h - 1FFh) (256 bytes) es cero
bit 6-5 RP1:RP0: Seleccionan el Banco de Memoria bit 1 DC (Digit carry/borrow): Indicador de acarreo o
de datos en el direccionamiento directo. préstamo auxiliar en las operaciones aritméticas de suma o
resta (instrucciones ADDWF, ADDLW, SUBLW, SUBWF)
00 = Banco 0 (00h - 7Fh) (128 bytes)
1 = Si hay acarreo del bit 3 al 4 en el resultado de una
01 = Banco 1 (80h - FFh) (128 bytes) operación aritmética de suma binaria o si no hay préstamo en
10 = Banco 2 (100h - 17Fh) (128 bytes) una operación de resta
11 = Banco 3 (180h - 1FFh) (128 bytes) 0 = Si no hay acarreo en la suma o si hay préstamo del bit 4 al
bit 3 en una operación de resta
bit 4 TO# (Time-out ): Indicador de desbordamiento del
perro guardián WTD (Watchdog Timer) bit 0 C (Carry/borrow): Indicador de acarreo o préstamo en las
0 = Cuando se desborda el WTD operaciones aritméticas de suma o resta (instrucciones
ADDWF, ADDLW, SUBLW, SUBWF)
1 = Después de un reset por encendido (power-up) y con 1 = Si hay acarreo en el resultado de una operación aritmética
las instrucciones CLRWDT y SLEEP de suma binaria o si no hay préstamo en una operación de
bit 3 PD# (Power-down): Indicador de modo de bajo resta
consumo. 0 = Si no hay acarreo en la suma o si hay préstamo en una
0 = Cuando entra en bajo consumo con la instrucción operación de resta
SLEEP
1 = Después del encendido o con la instrucción CLRWDT
El microcontrolador PIC16F877. Organización de la memoria SD29

C (Carry = Acarreo)

Se pone a 1 cuando hay acarreo en una suma


Se pone a 0 cuando hay prestado (“borrow”) en una resta

Antes Después
W = 0xFF ADDWF D,0 W = 0x01
D = 0x02 D = 0x02
SR = 0x18 SR = 0x1B ⇒ Z DC C
0 1 1
W = 0xFF = b’11111111’ = 255
+ D = 0x02 = b’00000010’ = 2
0x101 = b’100000001’ = 257
W = 0x01 = b’00000001’ = 1
El microcontrolador PIC16F877. Organización de la memoria SD30

DC (Digit Carry = Acarreo en un dígito)

En una suma se pone a 1 cuando hay acarreo del bit 3 al bit 4.


En una resta se pone a 0 cuando hay préstamo (“borrow”) del bit 4 al bit 3

Antes Después
W = 0x0F ADDWF D,0 W = 0x10
D = 0x01 D = 0x01
SR = 0x18 SR = 0x1A ⇒ Z DC C
0 1 0

W = 0x0F = b’00001111’ = 15
+ D = 0x01 = b’00000001’ = 1
0x10 = b’00010000’ = 16
W = 0x10 = b’00010000’ = 16
El microcontrolador PIC16F877. Organización de la memoria SD31

Z (ZERO = Cero)

Se pone a 1 cuando el resultado de la operación es 0

Antes Después
W = 0xFF ADDWF D,0 W = 0x00
D = 0x01 D = 0x01
SR = 0x18 SR = 0x1F ⇒ Z DC C
1 1 1

W = 0xFF = b’11111111’ = 255


+ D = 0x01 = b’00000001’ = 1
0x100 = b’100000000’ = 256
W = 0x00 = b’00000000’ = 0
El microcontrolador PIC16F877. Organización de la memoria SD32

• Si el registro STATUS es el destino de una instrucción, el valor resultante en


STATUS puede no coincidir con el valor que se supone será escrito por la
instrucción. Hay que tener en cuenta que los bits TO# y PD# son de sólo lectura y por
tanto no son modificables por escritura. Los bits Z, DC y C, tomarán el valor que
corresponda según la lógica de la instrucción y no el valor que se supone será escrito por
la instrucción.

Por ejemplo, la instrucción clrf STATUS no pone 00h en STATUS, sino que dejará TO# y
PD# sin modificar; igualmente quedarán sin modificar los bits DC y C, y el bit Z irá a 1
siguiendo la lógica de la instrucción. Es decir, el valor resultante en STATUS será

R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x


REGISTRO IRP RP1 RP0 TO# PD# Z DC C
STATUS 0 0 0 U U 1 U U U = bit no alterado
bit 7 bit 0

• Si se quiere modificar bits del registro STATUS, se recomienda utilizar instrucciones que
no alteren los bits Z, DC o C, como son las instrucciones bcf, bsf, swapf y movwf que se
estudiarán en el siguiente tema.

Das könnte Ihnen auch gefallen