Beruflich Dokumente
Kultur Dokumente
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.
MICROCONTROLADOR
El microcontrolador PIC16F877. Organización de la memoria SD3
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
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
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.
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.
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.
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
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.
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
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
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
INTERRUPCIONES
• Mecanismos de conexión del sistema microprocesador con el exterior (periféricos)
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
7Fh 7Fh
Banco0 Banco1 Banco2 Banco3
El microcontrolador PIC16F877. Organización de la memoria SD19
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).
• La memoria de datos está distribuida en 4 posibles bancos de 128 bytes cada uno.
00 01 10 11
Selección Banco Selección Banco
00h 80h 100h 180h
DIRECCIONAMIENTO INDIRECTO
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)
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)
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
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)
Antes Después
W = 0xFF ADDWF D,0 W = 0x00
D = 0x01 D = 0x01
SR = 0x18 SR = 0x1F ⇒ Z DC C
1 1 1
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á
• 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.