Curso Basico Microcontroladores

Descargar como ppt, pdf o txt
Descargar como ppt, pdf o txt
Está en la página 1de 183

CURSO BÁSICO DE MICROCONTROLADORES

(PIC16F877A)

1
SISTEMA BÁSICO DE CÓMPUTO

BUS DE DATOS

BUS DE DIRECCIONES

CPU
MEMORIA E/S

BUS DE CONTROL

2
Curso básico de microcontroladores (PIC16F877A)
SISTEMA BÁSICO DE CÓMPUTO

CPU (Unidad de Control y Proceso).- Realiza las operaciones


Aritméticas y lógicas que requiere la ejecución del programa.

MEMORIA.- Dispositivos de almacenamiento temporal o


permanente de datos e instrucciones del programa.

DISPOSITIVOS DE ENTRADA/SALIDA.- Permiten la


comunicación de datos con los periféricos del sistema.

3
Curso básico de microcontroladores (PIC16F877A)
SISTEMA BÁSICO DE CÓMPUTO

Bus de datos.- Conjunto de líneas que permiten el intercambio


de datos entre el CPU y los módulos de memoria y dispositivos
E/S. Pueden ser de 8, 16 o 32 bits.

Bus de direcciones.- Conjunto de líneas a través de las cuales el


CPU envía la dirección de la localidad o dispositivo de E/S que
requiere accesar.

Bus de control.- Conjunto de líneas a través de las cuales el CPU


coordina el intercambio de datos y direcciones con los módulos
de memoria y E/S, por medio de señales de lectura (RD), escritura
(WR), selección (CS), etc.
4
Curso básico de microcontroladores (PIC16F877A)
MICROPROCESADOR Y MICROCONTROLADOR

Microprocesador.- Dispositivo que contiene la unidad de


control y proceso de un sistema de cómputo y requiere la
implementación externa de los módulos de memoria, E/S
y los buses de datos, direcciones y control.

Microcontrolador.- Dispositivo que contiene en un solo


chip el CPU, memoria de datos, memoria del programa y
módulos de E/S.

5
Curso básico de microcontroladores (PIC16F877A)
EL MICROCONTROLADOR PIC16F877A

6
Curso básico de microcontroladores (PIC16F877A)
CARACTERÍSTICAS DEL
MICROCONTROLADOR PIC16F877A

- Set de 35 instrucciones.
- Todas las instrucciones se ejecutan en un ciclo de instrucción,
excepto las de saltos que toman 2 ciclos.
- Velocidad de operación: DC-20Mhz. reloj de entrada.
DC-200ns. ciclo de instrucción.
- Memoria del programa: 8 K, flash (14 bits). 8192 locs.
- Memoria de datos: 368 x 8 bits de memoria RAM.
- Memoria de datos EEPROM: 256 x 8 bytes.

7
Curso básico de microcontroladores (PIC16F877A)
DISPOSITIVOS DE E/S (PERIFÉRICOS)

- PUERTOS DIGITALES: A (6 bits), B (8 bits), C (8 bts),


D (8 bits), E (3 bits) todos ellos programables bit a bit.
- TIMER 0: Timer/Contador de 8 bits con preescalador
programable de 8 bits.
- TIMER 1: Timer/Contador de 16 bits con preescalador
programable. Puede funcionar en el estado sleep.
- TIMER 2: Timer/Contador de 8 bits con preescalador y
postescalador programables.
- 2 módulos de Captura, Comparación y Modulación de
ancho de pulso (PWM).
- Universal Synchronous Asinchronous Receiver Transmiter
(USART/SCI).
8
Curso básico de microcontroladores (PIC16F877A)
DISPOSITIVOS DE E/S (PERIFÉRICOS)

- Puerto paralelo esclavo (PPS), con señales de control RD,


WR, y CS.
- Convertidor Analógico/Digital (A/D) de 10 bits y 8 canales
de entrada.
- 2 comparadores analógicos con voltaje de referencia (Vref)
programable, con salidas externamente accesibles.

9
Curso básico de microcontroladores (PIC16F877A)
CARACTERÍSTICAS ESPECIALES

- 100,000 ciclos borrado/escritura para la memoria flash.


- 1,000,000 ciclos de borrado/escritura para la memoria de
datos EEPROM.
- Retención de datos de la memoria EEPROM > 40 años.
- Autoprogramable bajo software de control.
- In-circuit serial programming (ICSP) por medio de dos pines.
- Watch Dog Timer (WDT) con su propio circuito RC interno.
- Protección de código programable.
- Modo de bajo consumo de energía SLEEP.
- Opciones del tipo de oscilador a seleccionar.
- In-circuit debug (ICD) mediante dos pines.

10
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURA DE LA FAMILIA
PIC16FXX.

Arquitectura RISC (Reduced Instruction Set Computer):


Repertorio de instrucciones pequeño y simple que se ejecutan
casi todas en un ciclo de instrucción.

Arquitectura Harvard: Se caracteriza por un acceso al programa


y datos por separado que proceden de diferentes memorias, lo
cual mejora el ancho de banda respecto a la arquitectura Von
Newman.

11
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURAS DE COMPUTADORAS
ARQUITECTURA VON NEWMAN

Utiliza el mismo dispositivo de almacenamiento tanto para


las instrucciones como para los datos y los accesa a través del
mismo bus.

MEMORIA
DE
INSTRUCCIONES
8
CPU
BUS DEL MEMORIA
SISTEMA DE
DATOS

12
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURAS DE COMPUTADORAS
ARQUITECTURA HARVARD

Utiliza dispositivos de almacenamiento físicamente separados


para las instrucciones y para los datos, por lo tanto el acceso de
datos e instrucciones se hace por buses separados.

MEMORIA MEMORIA
8 8
DE CPU DE
DATOS INSTRUCCIONES
BUS DE BUS DE
DATOS DIREC-
CIONES

13
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURA DE LA FAMILIA
PIC16FXX.

MEMORIA MEMORIA
8 14
DE CPU DE
DATOS INSTRUCCIONES
BUS DE BUS DEL
DATOS PROGRAMA

14
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURA DE LA FAMILIA
PIC16FXX.

BUS DE DATOS
MEMORIA
REGISTRO 8 RAM
DE (REGISTROS)
INSTRUCCIONES

MPX
W

ALU

15
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURA DEL PIC16F877A

16
Curso básico de microcontroladores (PIC16F877A)
ARQUITECTURA DEL PIC16F877A

El PIC16F877A consta de 7 bloques fundamentales:

1.- Memoria del programa Flash 8K x 14 bits.


2.- Memoria de datos 368 x 8 bits de memoria RAM.
3.- Bus de datos con una ALU de 8 bits y un registro de
trabajo W del que normalmente recibe un operando.
El otro operando puede puede provenir del bus de datos
o del propio código de la instrucción (literal).
4.- Diversos recursos conectados al bus de datos, tales como
puertos de E/S, Timers, etc.
5.- Base de tiempos y circuitos auxiliares.
6.- Direccionamientode la memoria del programa en base al
contador del programa (PC), ligado a un stack de 8 niveles.
7.- Direccionamiento directo e indirecto de la memoria RAM.17
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

Es la memoria en donde se almacena el programa que será


ejecutado por el microcontrolador. Esta memoria general-
mente es del tipo flash o EEPROM, ya que se requiere que
el programa permanezca almacenado aún después de retirar
la alimentación del dispositivo.

Tiene una capacidad de 8K palabras de 14 bits y está divi-


dida en 4 páginas de 2K palabras.

Es direccionada por el Contador del Programa (PC) que


Tiene un tamaño de 13 bits que puede direccionar desde la
localidad 0000h a la 1FFFh.
18
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

19
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

Físicamente el apuntador del programa se encuentra implemen-


tado en dos localidades del espacio de memoria RAM, en donde
los 8 bits de menor peso residen en el registro PCL y los bits de
mayor peso residen en los 5 bits de menor peso del registro
PCLATH.

20
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

21
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

En las instrucciones GOTO y CALL los 11 bits de menor


peso del PC provienen del código de la instrucción y los
dos bits restantes de los bits PCLATH<4:3>.

22
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

El stack es una zona aislada de las memorias de instrucciones y


datos. Tiene una estructura LIFO, en la que el último valor guar-
dado será el primero en salir. Tiene 8 niveles de profundidad y
cada uno con 13 bits.

La función del stack es almacenar la dirección de retorno al


momento de saltar hacia una subrutina, de manera que después
de ejecutar una subrutina pueda continuar la ejecución del pro-
grama.

23
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

SUB1 - 0150h PC=0150h


-
-
-
-
-
-
RETURN 0157h STACK PC PC=0201h

MAIN -
-
-
-
-
PC=01FFh - 01FFh
PC=0200h CALL SUB1 0200h PC=PC+1 STACK PC=SUB1
- 0201h STACK(1)=0201h PC=0150h
-
- STACK 0201
-
-

24
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DEL PROGRAMA

SUB2 - 0125h PC=0125h


-
-
-
-
-
-
RETURN 012Ch STACK PC PC=0154h

SUB1 - 0150h
-
PC=0152H -
PC=0153H CALL SUB2 0153h PC=PC+1 STACK PC=SUB2
- 0154h STACK(2)=0154h PC=0125h
-
- STACK 0201h
RETURN 0157h 0154h

25
Curso básico de microcontroladores (PIC16F877A)
VECTORES RESET E INTERRUPTION

Un vector es una localidad de la memoria del programa cuya


dirección es cargada en el PC cuando ocurre un determinado
evento.

En un vector generalmente se almacena una instrucción GOTO


que envía el programa a ejecutar una rutina de servicio
o a una localidad de memoria determinada.

26
Curso básico de microcontroladores (PIC16F877A)
VECTORES RESET E INTERRUPTION

Vector de RESET.- En el PIC16F877A el vector de RESET se


encuentra en la localidad 0000h, que es direccionada por el PC
al momento de aplicar la energía al microcontrolador o después
de que ocurre un cambio de 0 a 1 en el pin MCLR/Vpp.

Generalmente se guarda en el vector de RESET una instrucción


de salto incondicional GOTO que manda el programa hacia la
primera instrucción del programa principal.

27
Curso básico de microcontroladores (PIC16F877A)
VECTORES RESET E INTERRUPTION

RESET GOTO MAIN0000h


- 0001h
- 0002h
- 0003h
INT GOTO SERV_INT 0004h
MAIN - 0005h
- 0006h
- 0007h
- 0008h
- 0009h
- 000Ah
- 000Bh

28
Curso básico de microcontroladores (PIC16F877A)
VECTORES RESET E INTERRUPTION

Vector de INTERRUPCIÓN.- En el PIC16F877A el vector


de INTERRUPCIÓN se encuentra en la localidad 0004h,
que es direccionada por el PC cuando ocurre un evento que
provoca una interrupción.

Generalmente se guarda en el vector de INTERRUPCIÓN una


instrucción de salto incondicional GOTO que manda el
programa hacia la primera instrucción de la rutina de servicio
de interrupción.

29
Curso básico de microcontroladores (PIC16F877A)
VECTORES RESET E INTERRUPTION

RESET 0000h
GOTO MAIN STACK 0061h
- 0001h
- 0002h
- 0003h
INT GOTO SERV_INT 0004h
- 0005h

- 0006h
- 0007h

- 0008h
SERV_INT - 0009h
- 000Ah PC=PC+1 STACK PC=INT
- 000Bh STACK(1)=0061h PC=0004h
- .
- .
- . PC=SERV_INT PC=0009h
RETFIE .
-
-
.
MAIN - 0050h STACK PC PC=0061h
- 3°
-
-
Interrupción - 0060h
- 0061h

30
Curso básico de microcontroladores (PIC16F877A)
ESTRUCTURA DE UN PROGRAMA
(Template.asm)
list p=16F877A ; Indica el modelo de PIC que se usa
; Es una directiva de ensamblador
#include <p16F877A.inc> ; definición de registros del microcontrolador

;***** DEFINICIÓN DE VARIABLES

VAR1 EQU 0x20


VAR2 EQU 0x21
.
.
VARn EQU 0x7F

;**********************************************************************
ORG 0x00 ; vector de reset
goto MAIN ; salta al inicio del programa

; ORG 0x04 ; vector de interrupción


; goto INT ; salta a la rutina de servicio

ORG 0x05

SUB1 ;CÓDIGO DE SUBRUTINA1


return

SUB2 ;CÓDIGO DE SUBRUTINA2


return

MAIN ;CÓDIGO DEL PROGRAMA PRINCIPAL


END ; directiva 'fin del programa'

31
Curso básico de microcontroladores (PIC16F877A)
DIRECTIVAS DE ENSAMBLADOR

list p=16F877A ; Indica el modelo de PIC que se usa

#include <p16F877A.inc> ; Definición de registros del microcontrolador

VAR1 EQU 0x20 ; Declara VAR1 en dirección 0x20

ORG 0x00 ; Asigna dirección inicial para el código


; que se lista a continuación

END ; Indica que no hay más código válido a


; continuación

32
Curso básico de microcontroladores (PIC16F877A)
PROGRAMA “ SUMA.ASM ”

list p=16F877A ; Indica el modelo de PIC que se usa


; Es una directiva de ensamblador
#include <p16F877A.inc> ; definición de registros del microcontrolador

;***** DEFINICIÓN DE VARIABLES

OPERANDO1 EQU 0x20


OPERANDO2 EQU 0x21
RESULTADO EQU 0x22

;**********************************************************************
ORG 0x00 ; vector de reset
goto MAIN ; salta al inicio del programa

ORG 0x05

MAIN movlw 0x06


movwf OPERANDO1
movlw 0x02
movwf OPERANDO2
movf OPERANDO1,W
addwf OPERANDO2,W
movwf RESULTADO

END ; directiva 'fin del programa'

33
Curso básico de microcontroladores (PIC16F877A)
INSTRUCCIONES USADAS EN
“ SUMA.ASM ”

goto MAIN ;Salto incondicional a etiqueta MAIN

movlw 0x06 ;Mueve valor inmediato 0x06 a W

movwf OPERANDO1 ;Mueve W a OPERANDO1

movf OPERANDO1,W ;Mueve OPERANDO1 a W

addwf OPERANDO2,W ;Suma W y OPERANDO2

34
Curso básico de microcontroladores (PIC16F877A)
PRÁCTICA # 1

Usando el simulador del MPLAB editar el programa


SUMA.ASM y ejecutarlo usando las herramientas de
visualización de variables y registros.

35
Curso básico de microcontroladores (PIC16F877A)
CONTENIDO DEL REPORTE

- Portada con la siguiente información:

a) Nombre de la escuela
b) Número y nombre de la práctica
c) Integrantes del equipo
d) Fecha de entrega

- Introducción
- Objetivo de la práctica
- Material y equipo utilizado
- Diagrama esquemático del circuito
- Programa documentado (si incluye programa)
- Desarrollo de la práctica
- Conclusiones

36
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

Es la memoria en donde se almacenan los datos que son


procesados por el programa.

La memoria estática RAM (SRAM) se divide en dos partes


de acuerdo a su función: registros de función específica (SFR)
y registros de propósito general (GPR).

37
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

Registros de función específica (SFR).- Son localidades de


memoria reservadas para los registros que son los encargados
del procesador y sus recursos. La función de cada registro ya
se encuentra definida.

Registros de propósito general (GPR).- Son localidades de


memoria en donde se almacenan de manera temporal los datos
del programa. Estos datos se manejan y reconocen como varia-
bles dentro del programa y son declaradas por el programador.

38
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

La memoria RAM estática también se encuentra dividida


en 4 bancos con 128 bytes cada uno. En las posiciones
iniciales de cada banco se ubican los registros de función
específica (SFR) y algunos bancos se encuentran repeti-
dos para simplificar su acceso.

39
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

40
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

41
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

Para seleccionar el banco al que se desea acceder, se emplean


los bits 6 y 5 del registro STATUS, denominados RP1 y RP0
respectivamente, de acuerdo a la tabla siguiente:

BANCO RP1 RP0


0 0 0
1 0 1
2 1 0
3 1 1

42
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

Para direccionar la memoria de datos RAM estructurada en


4 bancos de 128 bytes, existen dos modos diferentes:

- Direccionamiento directo.
- Direccionamiento indirecto.

43
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

Direccionamiento directo.- Los bits RP1 y RP0 del registro


STATUS<6:5>, se encargan de seleccionar el banco, mientras
que la dirección dentro del banco la determinan 7 bits proce-
dentes del código de operación de la instrucción.

Direccionamiento indirecto.- Se usa el registro FSR, en el que


sus 7 bits de menor peso señalan la dirección dentro del banco
y el banco a accesar lo determina el bit de mayor peso de FSR
concatenado con el bit IRP del registro STATUS<7>.

44
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

45
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

El direccionamiento indirecto se usa cuando en una instrucción


se utiliza como operando el registro INDF que ocupa la primera
localidad en todos los bancos. El registro INDF no es un registro
físico. Al direccionar INDF en realidad se direcciona la localidad
cuya dirección está contenida en el registro FSR (FSR es un
apuntador).

46
Curso básico de microcontroladores (PIC16F877A)
MEMORIA DE DATOS RAM

Ejemplo de direccionamiento indirecto:

STATUS 0
IRP

PORTA 10h 05H FSR 05h 04H

PORTB 0Ah 06H

INDF 10h 00H

10h 05H

0Ah 06H FSR 06h 04H

INDF 0Ah 00H


47
Curso básico de microcontroladores (PIC16F877A)
REGISTRO STATUS

48
Curso básico de microcontroladores (PIC16F877A)
REGISTRO STATUS

49
Curso básico de microcontroladores (PIC16F877A)
PUERTOS DIGITALES (E/S)

Se conoce como puerto a un conjunto de terminales (pines)


que permiten la entrada y/o salida de datos en forma digital.

El PIC16F877A cuenta con 5 puertos que son conocidos por


las letras A,B,C,D y E y constan del siguiente número de
bits:
A 6 bits (RA5 – RA0)
B 8 bits (RB7 – RB0)
C 8 bits (RC7 – RC0)
D 8 bits (RD7 – RD0)
E 3 bits (RE2 – RE0)

50
Curso básico de microcontroladores (PIC16F877A)
PUERTOS DIGITALES (E/S)

Cada línea puede configurarse independientemente como entrada


o como salida, según el estado del bit asociado del registro de
configuración de cada puerto (TRISA, TRISB, TRISC, TRISD y
TRISE).

Se llaman PORTA, PORTB, PORTC, PORTD y PORTE, los re-


gistros que guardan la información que entra o sale por los
puertos y ocupan las direcciones 05h, 06h, 07h, 08h y 09h res-
pectivamente en el banco 0 de la memoria de datos.

51
Curso básico de microcontroladores (PIC16F877A)
PUERTOS DIGITALES (E/S)

Los registros TRISA, TRISB, TRISC, TRISD y TRISE ocupan


las direcciones 85h, 86h, 87h, 88h y 89h respectivamente en el
banco 1.

Los bits de un registro TRIS configuran los pines del puerto


como entrada cuando el bit correspondiente se programa con un
1 y como salida cuando el bit correspondiente se carga con 0.

TRISx 1 – Entrada (Input)


0 – Salida (Output)

52
Curso básico de microcontroladores (PIC16F877A)
PUERTOS DIGITALES (E/S)

Todas las líneas de los puertos digitales admiten niveles de


entrada TTL y de salida CMOS.

Cada pin de salida puede suministrar una corriente máxima


de 20 mA. y programado como entrada puede absorber hasta
25 mA. sin embargo, por limitaciones en la disipación máxima
del chip se recomienda no exceder la corriente máxima de
absorción de 90 mA. y la de suministro de 60 mA. en el puerto
A.

53
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

RA0-RA3

54
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

1 1

0
0
1 RA0-RA3
0
0

55
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

0 0

1
1
0 RA0-RA3
1
0

56
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

X
1
X RA0-RA3
0
1

0
0

X X

57
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

La línea RA4/T0CKI dispone de un circuito Schmitt Trigger


que proporciona un buena inmunidad al ruido cuando funciona
como entrada. La salida es de colector abierto, debido a lo cual
se recomienda conectar una resistencia entre esta terminal y
Vdd cuando se quiera manejar como el resto de los pines del
puerto.

58
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

RA4/T0CKI

59
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

60
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

Ejemplo:

Programar los pines RA0,RA1 y RA5 como entradas y


RA2, RA3 y RA4 como salidas. Posteriormente sacar
un 0x0C por el puerto.
0 0

TRISA X X 1 0 0 0 1 1 0x23
7 6 5 4 3 2 1 0

TRISx 1 – Entrada (Input)


0 – Salida (Output)
61
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

bcf STATUS,RP0
bcf STATUS,RP1 ;Selecciona banco 0

clrf PORTA ;Limpia los latches de salida del puerto A

bsf STATUS,RP0 ;Selecciona banco 1

movlw 0x06 ;Configura todos los pines del puerto A


movwf ADCON1 ;como E/S digitales, pag 128 pic

movlw 0x23 ;Programa RA0, RA1 y RA5 como


entradas
movwf TRISA ;y RA2, RA3 y RA4 como salidas

bcf STATUS,RP0 ;Selecciona banco 0

movlw 0x0C
movwf PORTA ;Saca 0x0C por puerto A

62
Curso básico de microcontroladores (PIC16F877A)
PUERTO A

bcf STATUS,RP0 ;Pone en 0 el bit RP0 del registro STATUS

bsf STATUS,RP0 ;Pone en 1 el bit RP0 del registro STATUS

clrf PORTA ;Limpia el registro PORTA (PORTA = 0x00)

63
Curso básico de microcontroladores (PIC16F877A)
PUERTO B

El puerto B consta de 8 líneas bidireccionales de E/S


(RB7 – RB0) cuya información se almacena en el registro
PORTB que ocupa las direcciónes 06 del banco 0 y 106h
del banco 2. El registro de configuración TRISB ocupa las
direcciónes 86h y 186h de los bancos 1 y 3 respctivamente.

El pin RB0/INT tiene dos funciones multiplexadas. Además


de E/S actúa como entrada de interrupción externa.

Todos los pines del puerto B pueden ser conectados a una


resistencia interna Pull-Up de valor alto conectada a Vdd.

64
Curso básico de microcontroladores (PIC16F877A)
PUERTO B

65
Curso básico de microcontroladores (PIC16F877A)
PUERTO B

66
Curso básico de microcontroladores (PIC16F877A)
PUERTO B

67
Curso básico de microcontroladores (PIC16F877A)
PUERTO C

68
Curso básico de microcontroladores (PIC16F877A)
PUERTO D

69
Curso básico de microcontroladores (PIC16F877A)
PUERTO E

70
Curso básico de microcontroladores (PIC16F877A)
PRÁCTICA # 2

Hacer un programa que programe todos los bits del puerto


B como salidas y envíe el valor 0x55 para visualizar en los
LED´s de la tarjeta de desarrollo.

71
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

El microcontrolador PIC16F877A cuenta con un set de


35 instrucciones con las siguientes características:

- Las instrucciones son simples y rápidas.


- Las instrucciones son ortogonales. (Cualquier instruc
ción puede usar cualquier operando).
- Todas las instrucciones tienen 14 bits y los datos 1 byte.

72
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

El repertorio de instrucciones se clasifica en tres grupos


de acuerdo a su formato:

- Instrucciones orientadas al manejo de registros byte.


- Instrucciones orientadas al manejo de bits.
- Instrucciones que manejan un valor inmediato o literal.

73
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Instrucciones orientadas al manejo de registros byte.

f – Designador de registro.- especifica que registro será


usado por la instrucción. Puede ser cualquier registro
de la memoria de datos.
d – Registro destino.- especifica en donde será colocado el
resultado.

si d = 0 Resultado W
si d = 1 Resultado f

74
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Ejemplo:

W 0F W 0F
andwf PORTA,1
PORTA 3A PORTA 0A

75
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Instrucciones orientadas al manejo de bits.

f – Designador de registro.- Especifica el registro en el


cual se localiza el bit.
b – Número de bit.- Indica el bit que será afectado por
la operación.

b–0 7

76
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Ejemplo:

PORTA 00 bsf PORTA,0 PORTA 01

77
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Instrucciones que manejan un valor inmediato o literal.

k – Valor literal.- Representa un valor literal de 8 u 11 bits.

k es de 11 bits solamente para las instrucciones CALL y


GOTO y contiene la dirección dentro de un banco, de la
localidad hacia donde habrá de cambiar el flujo del programa.

78
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

79
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Ejemplos:

W 01 iorlw 0x04 W 05

80
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES
Instrucciones que manejan registros

ADDWF f,d Suma W y f


ANDWF f,d AND W y f
CLRF f Limpia f (pone todos los bita a cero)
CLRW Borra W
COMF f,d Complementa f (invierte ceros y nos)
DECF f,d Decrementa f
INCF f,d Incrementa f
IORWF f,d OR W y f
MOVF f,d Mueve f al destino indicado por d
MOVWF f Mueve W a f
NOP No operación
RLF f,d Rota f a la izquierda a través del carry
RRF f,d Rota f a la derecha a través del carry
SUBWF f,d Resta W a f
SWAPF f,d Intercambia nibbles
XORWF f,d XOR W y f
81
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES
RLF

C f
MSB LSB

RRF

C f
MSB LSB

82
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

Instrucciones que manejan bits

BCF f,b Borra el bit b del registro f


BSF f,b Borra el bit b del registro f

Instrucciones de salto condicional

BTFSC f,b Se salta la siguiente instrucción si


el bit b = 0.
BTFSS f,b Se salta la siguiente instrucción si
el bit b = 1.
DECFSZ f,d Decrementa f y se salta la siguiente
instrucción si f = 0
INCFSZ f,d Decrementa f y se salta la siguiente
instrucción si f = 0
83
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES
Instrucciones que manejan operandos literal

ADDLW k Suma valor imnediato k a W


ANDLW k AND valor inmediato k con W
IORLW k OR valor inmediato k con W
MOVLW k Mueve valor inmediato k a W
SUBLW k Resta W del valor inmediato k
XORLW k XOR valor inmediato k con W

Instrucciones de control y especiales

CALL k Llama a subrutina


CLRWDT Refresca Watch-dog
GOTO k Salto incondicional
RETFIE Retorno de interrupción
RETLW k Retorno de subrutina con W = k
RETURN Retorno de subrutina
SLEEP Pasa al modo de reposo SLEEP
84
Curso básico de microcontroladores (PIC16F877A)
PRÁCTICA # 3

a) Hacer un programa que encienda y apague el LED


conectado a la terminal RB2 usando una subrutina
de retardo para alcanzar a visualizar el cambio.

b) Modificar el programa para implementar un contador


de 00h a 3Fh y desplegar el valor en los LED´s
conectados al puerto B.

85
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

DELAY movlw 0xFF


movwf DELH
DEL2 movlw 0xFF
movwf DELL
DEL1 decfsz DELL,f
goto DEL1
decfsz DELH,f
goto DEL2
return

86
Curso básico de microcontroladores (PIC16F877A)
SET DE INSTRUCCIONES

btfsc PORTB,2
goto APAGA
bsf PORTB,2
goto CONTINUA
APAGA bcf PORTB,2

CONTINUA -

87
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

Periféricos digitales de salida

LED´s

El LED es uno de los dispositivos de salida más sencillos


y económicos. Según el nivel lógico que se aplique a su
cátodo o ánodo se enciende o apaga.

Las líneas del PIC pueden suministrar suficiente corriente


para encender un LED conectándolo a un pin de salida a
través de una resistencia limitadora.

88
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

89
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

A veces es necesario manejar varios LED´s u otro tipo de


carga que requiere más corriente de la que puede entregar
una línea del PIC. En este caso es necesario introducir un
transistor que funciona como amplificador de corriente.

90
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

RELEVADORES

El manejo de un relevador brinda la oportunidad de controlar


cargas que requieren mucha más corriente. Esta corriente
puede ser manejada por los contctos.

91
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS
SALIDAS OPTOACOPLADAS

A veces hay que aislar eléctricamente la carga que se desea


controlar, de la línea de salida. Para este fin la señal se aplica
a través de un optoacoplador con salida de transistor, de
manera que no hay ninguna relación eléctrica entre el perifé-
rico y la línea de control.

92
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

CONTROL DE CARGAS ALIMENTDAS CON C.A.

Los triacs son dispositivos eléctricos que dejan pasar una


parte del semiciclo de C.A. que conduce cuando a su
compuerta se aplica un pulso de disparo. De esta forma la
potencia que entrega el triac depende del momento en el
que se genera el pulso.
Un triac puede ser controlado por medio de un opto-aco-
plador con salida de triac.

93
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

94
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

Periféricos digitales de entrada

Estos dispositivos permiten introducir un nivel lógico en el


momento que se les acciona, pasando al nivel contrario
cuando se deja de hacerlo.

95
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

Todos los dispositivos electromecánicos originan un fenómeno


denominado “rebotes”. Los rebotes se producen en el instante
que se abren o cierran las laminillas metálicas del interruptor.
Hay un momento de inestabilidad en el que aunque solo se haya
Accionado el dispositivo una sola vez, los contactos se abren y
cierran múltiples veces en el momento de la transición.

REBOTES

96
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

Una solución para eliminar los rebotes es por medio del


software, en donde se detecta el primer flanco del la señal
de entrada. Posteriormente se realiza un retardo de tiempo
suficiente para permitir que se estabilice la señal de entrada
(15 – 20 ms.). Después de transcurrido el retardo se vuelve
a leer el estado de la tecla. Si se mantiene el nivel lógico que
genera la tecla presionada se valida el estado de tecla presio-
nada

97
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

Ejemplo:

Para el siguiente circuito de entrada hacer un programa que


elimine el efecto de rebotes al presionar la tecla.

98
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

LEE BIT DE
ENTRADA

NO BIT = 0
?
SI

DELAY

NO BIT =0
?
SI

99
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

TECLA btfsc PORTC,5


goto TECLA
call DELAY
btfsc PORTC,5
goto TECLA

100
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS
Entradas digitales optoacopladas

En algunas ocasiones también se requiere aislar eléctricamente


el periférico de entrada de las líneas del microcontrolador. Para
este fin la señal se aplica a través de un optoacoplador con
salida a transistor usando el mismo procedimiento de aislamiento
de las salidas.

101
Curso básico de microcontroladores (PIC16F877A)
MANEJO DE PERIFÉRICOS

PRÁCTICA # 4

Modificar el programa del inciso b) para implementar un


contador de 00h a 52h incrementando la cuenta manual-
mente por medio de la tecla S2.

NOTA: Usar la rutina antirebotes TECLA.

102
Curso básico de microcontroladores (PIC16F877A)
PRÁCTICA # 5

Hacer un programa que controle la intensidad luminosa en


una lámpara incandescente alimentada con C.A. (Dimmer)
Mediante el control del ángulo de disparo por medio del
triac T1 de la tarjeta de desarrollo.

Incrementar la luminosidad con la tecla S3 y decrementarla


con la tecla S2.

103
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Las llamadas a subrutinas mediante la instrucción CALL son


desviaciones del flujo del programa originadas por dicha
instrucción, por lo que se consideran síncronas.

Las interrupciones son desviaciones del flujo del programa


originadas asincrónicamente por eventos que no se hayan
bajo supervisión de las instrucciones.

104
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Las interrupciones pueden ser:

Externas como la generación de un flanco o nivel activo en


unpin del microcontrolador.

Internas como el desbordamiento de un timer o el fin de


escritura de la memoria EEPROM.

105
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Cuando ocurre una interrupción se detiene la ejecución del


programa en curso . Se guarda la dirección actual del PC en
el STACK y se carga el PC con la dirección del vector de
interrupción (0004h). Generalmente se coloca en el vector de
interrupción una instrucción de salto incondicional GOTO
que traslada el flujo del programa a la rutina de servicio de
interrupción.

106
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Al inicio de una rutina de interrupción es conveniente guardar


en la memoria de datos aquellos registros que dentro de la
rutina de servicio de interrupción se van a emplear y será alte-
rado su contenido.

Antes del retorno de la rutina de servicio se deben restaurar


los valores en dichos registros para continuar la ejecución del
programa.

107
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Causas de interrupción:

El PIC16F877A cuenta con diversas fuentes de interrupción que


provienen de los diferentes módulos, si embargo por ahora nos
enfocaremos al estudio de las interrupciones que son controladas
por el registro INTCON que son:

- Activación del pin RB0/INT.


- Desbordamiento del TMR0.
- Cambio de estado en uno de los pines RB7:RB4.

108
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

109
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

110
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

El PIC16F877A puede ser interrumpido por diversas causas,


pero todas ellas desvían en flujo de control al vector de inte-
rrupción en la localidad 0004h, por lo tanto, cuando se encuen-
tran activadas dos o más interrupciones se debe averiguar cual
de las posibles causas ha sido la responsable de la interrupción
en curso, para ello se exploran las banderas de las interrupciones
que se encuentran activas.

111
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Al inicio de la rutina de servicio de interrupción, GIE se pone


automáticamente en 0 al igual que la bandera de la interrup-
ción se activa, con el objeto de no atender nuevas interrupciones
hasta que se termine la rutina en curso.

Al retorno de la interrupción GIE nuevamente se establece en


1 de manera automática para permitir nuevas interrupciones,
sin embargo la bandera de la interrupción debe ser limpiada
por software para permitir que ocurra nuevamente esa inte-
rrupción. El retorno de una interrupción serealiza mediante la
instrucción RETFIE.

112
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES
;Rutina que determina la causa de la interrupción

INT btfss INTCON,INTF


goto PUERTOB
call SERV_INTEXT
bcf INTCON,INTF
goto FIN_INT

PUERTOB btfss INTCON,RBIF


goto SERV_TMR0
call SERV_INTRB
bcf INTCON,RBIF
goto FIN_INT

SERV_TMR0 btfss INTCON,T0IF


goto INT
call SERV_TMR0
bcf INTCON,T0IF
FIN_INT retfie 113
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Lógica de control que origina las interrupciones

114
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Interrupción por desbordamiento del TMR0.

Cuando el TMR0 se desborda y pasa de FFh a 00h, la bandera


T0IF se pone automáticamente en 1. Si además el bit de permiso
de esta interrupción T0IE y el bit de permiso global GIE se en-
cuentran en 1, se produce una interrupción.

El registro TMR0 puede ser cargado con un valor, a partir del


cual se iniciará la cuenta hacia FFh y al ocurrir el desbordamien-
to de se genera la interrupción. De esta manera el tiempo para
que ocurra la interrupción puede ser controlado.

115
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Si no se recarga el TMR0 después de su desbordamiento, sigue


contando a partir de 00h.

El registro TMR0 puede ser leído y escrito en cualquier mo-


mento, pero cada vez que se escribe se pierden 2 ciclos de reloj
en la sincronización.

Otro factor que determina el tiempo que tarda en ocurrir la


interrupción, es el valor con el que se programa el divisor de
frecuencia o también conocido como preescalador, que divide
la frecuencia que incrementa el TMR0 entre un valor que se
se puede programar en el registro OPTION con los bits PS2:PS0.
116
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES
Diagrama a bloques del TMR0/WDT

=0 =0

=0

=0

117
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

118
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Para calcular el tiempo a controlar con el TMR0 se usan las


siguientes fórmulas:

Tiempo = 4*Tosc*(256 - Nd)*Rango del preescalador

Nd = 256 - Tiempo
4*Tosc*Rango del preescalador

NOTA: Nd representa el valor decimal que se deberá cargar


en el registro TMR0 en su equivalente hexadecimal.

119
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Ejemplo:

Determinar el valor Nd que debe ser cargado en el registro TMR0


y el rango del preescalador que se debe seleccionar para generar
una interrupción cada ms.
-3
Nd = 256 - 1x10 = 63h
-9
4*50x10 *32

Nota: el valor del preescalador se debe seleccionar de manera que


el resultado Nd sea un valor entre 0 y 255, preferentemente
el menor posible para tener una mejor resolución.
120
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES
El TMR0 como contador de sucesos.

Los sucesos están representados por los impulsos que se aplican


al pin RA4/T0CKI, en lugar de los pulsos que provienen del
oscilador interno (Fosc) del microcontrolador.

Para que el TMR0 funcione como un contador de pulsos, hay


que poner a 1 los bits T0CS y PSA en el registro OPTION.
En este caso el registro TMR0 se incrementa con cada flanco
activo aplicado al pin T0CKI. El tipo de flanco se elige
programando el bit T0SE del registro OPTION.

Si T0SE = 1 el flanco activo es descendente.


Si T0SE = 0 el flanco activo es ascendente. 121
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES
Diagrama a bloques del TMR0/WDT

=1 =1

=1

=1

122
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

PRÁCTICA # 6

Hacer un programa que genere una señal audible de


1Khz. y la envíe al buzzer SP1 de la tarjeta de
desarrollo.

Con la tecla S3 debe activar el TMR0 para generar la


señal audible y con S2 debe desactivar el TMR0 para
detener la señal.

123
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Interrupción externa INT.

La interrupción externa permite atender acontecimientos exter-


nos en tiempo real.

Un acontecimiento externo generalmente está representado por


un pulso o cambio de nivel en el pin RB0/INT.

Cuando ocurre el cambio determinado en el pin RB0/INT, se


generará una petición de interrupción, que será aceptada si el
bit INTE en el registro INTCON se encuentra en 1, al igual que
el bit GIE.

124
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES

Cuando se genera la interrupción, la bandera INTF cambia su


estado a 1 y el flujo del programa salta al vector de interrupción
para que dicha interrupción sea atendida.

Por medio del bit INTDEG del registro OPTION, se puede


seleccionar el flanco activo en RB0/INT.

Si INTDEG = 1 flanco activo ascendente.


Si INTDEG = 0 flanco activo descendente.

125
Curso básico de microcontroladores (PIC16F877A)
INTERRUPCIONES
Interrupción RB.

La petición de interrupción RB se genera cuando ocurre un


cambio en alguno de los pines RB7, RB6, RB5 o RB4, inde-
pendientemente de su estado anterior.

Cuando ocurre un cambio en cualquiera de los pines RB7-RB4,


se generará una petición de interrupción, que será aceptada si el
bit RBIE en el registro INTCON se encuentra en 1, al igual que
el bit GIE.

Cuando se genera la interrupción, la bandera RBIF cambia su


estado a 1 y el flujo del programa salta al vector de
interrupción 126
para
Curso básico que dicha interrupción
de microcontroladores (PIC16F877A) sea atendida.
PRÁCTICA # 7
Hacer un programa que implemente una alarma digital usando
las interrupciones INT, RB y TMR0.
Cuando la alarma esté activada pero no se encuentre disparada,
debe encender y apagar el LED conectado a la terminal RB1cada
500 ms.
El disparo de la alarma se hará por medio de teclas (externas
a la tarjeta), que deberán conectarse a las terminales INT/RB0,
RB4, RB5, RB6 y RB7, a través del conector J1.
Cando se dispare la alarma se deberá generar una señal audible
por medio del Buzzer, y el LED conectado a RB1 quedará
encendido permanentemente en cuanto no se desactive la
alarma y vuelva a las condiciones iniciales.
La desactivación de la alarma deberá hacerse por medio de
la tecla S2, y S3 deberá activar la alarma. 127
Curso básico de microcontroladores (PIC16F877A)
EL WATCHDOG TIMER (WDT)

El Watchdog timer (perro guardián) es un circuito auxiliar


interno del microcontrolador que supervisa el funcionamiento
adecuado del microcontrolador.

Si por alguna razón el programa se pierde, después de un lapso


de tiempo el WDT produce un RESET al microcontrolador que
lo hace regresar al programa.

128
Curso básico de microcontroladores (PIC16F877A)
EL WATCHDOG TIMER (WDT)

El WDT es un contador interno de 8 bits que origina un reset


cuando se desborda.

Su control de tiempo es independiente del reloj interno del


microcontrolador y está basado en un circuito RC.

Su funcionamiento es opcional y puede ser habilitado progra-


mando el bit WTE en la palabra de configuración.

El tiempo nominal del WDT es de 18 ms. pero utilizando el


divisor de frecuencia puede alcanzarse hasta 2.3 seg.

129
Curso básico de microcontroladores (PIC16F877A)
EL WATCHDOG TIMER (WDT)
Diagrama a bloques del TMR0/WDT

=1

=1

=1

130
Curso básico de microcontroladores (PIC16F877A)
EL WATCHDOG TIMER (WDT)

Para evitar que el WDT se desborde y ocasione un RESET del


microcontrolador cuando el programa está corriendo normal-
mente, hay que limpiarlo (ponerlo a cero) mediante la instruc-
ción CLRWDT, antes de que se produzca el desbordamiento y
ocasione el RESET.

El programador debe situar la instrucción CLRWDT en sitios


estratégicos por los que pasa el flujo de control, antes de que se
desborde el contador del WDT.

Si el programa llegara a perderse, no se limpiará el WDT y se


desbordará ocasionando el RESET que hará que el microcon-
trolador regrese al inicio del programa.
131
Curso básico de microcontroladores (PIC16F877A)
LA PALABRA DE CONFIGURACIÓN

Los bits de configuración seleccionan diferentes opciones de


funcionamiento y protección del código del programa y datos.

Medinte esta palabra se selecciona la función deseada con un 0


En el bit correspondiente o se deja deshabilitada con un 1.

Esta palabra se encuentra mapeada en la localidad de memoria


2007h, que se encuentra más allá del espacio de memoria del
programa y pertenece al espacio de memoria de prueba/confi-
guración (2000h-3FFFh). Este espacio solamente puede ser
accesado durnte el proceso de programación.

132
Curso básico de microcontroladores (PIC16F877A)
LA PALABRA DE CONFIGURACIÓN

133
Curso básico de microcontroladores (PIC16F877A)
LA PALABRA DE CONFIGURACIÓN

134
Curso básico de microcontroladores (PIC16F877A)
LA PALABRA DE CONFIGURACIÓN

135
Curso básico de microcontroladores (PIC16F877A)
CONFIGURACIÓN DEL OSCILADOR

Los PIC16F87XA pueden operar en cuatro modos diferentes


de oscilador. El usuario puede programar dos bits de confi-
guración (FOSC1 y FOSC2), en la palabra de configuración.
Estos modos son:

- LP Low Power Crystal


- XT Crystal/Resonator
- HS High Speed Crystal/Resonator
- RC Resistor/Capacitor

En los modos XT, LP y HS, un cristal o resonador cerámico


es conectado a los pines OSC1/CLKIN y OSC2/CLKOUT.
136
Curso básico de microcontroladores (PIC16F877A)
CONFIGURACIÓN DEL OSCILADOR

137
Curso básico de microcontroladores (PIC16F877A)
CONFIGURACIÓN DEL OSCILADOR
Los capacitores C1 y C2 pueden ser seleccionados en base a
la siguiente tabla:

138
Curso básico de microcontroladores (PIC16F877A)
POWER-ON RESET
Un pulso de reset Power_On es generado en el chip cuando la
aplicación de voltaje en Vdd es detectada (en el rango de 1.2V –
1.7V). Para usar la característica POR se requiere conectar el pin
MCLR a Vdd (+5V) a través de una resistencia de 10K.

Cuando el microcontrolador inicia su operación normal (sale de


la
condición de RESET), debe asegurar una operación correcta. Si
esas condiciones no se reunen, el dispositivo permanecerá en es-
tado de RESET, hasta que se tengan las condiciones de
operación.

Si en la operación normal se preseta un RESET sin motivo


aparente, es posible que alguna señal de ruido en la terminal 139
MCLR
Curso básico esté presente.
de microcontroladores Esta situación puede ser corregida conec-
(PIC16F877A)
POWER-ON RESET

140
Curso básico de microcontroladores (PIC16F877A)
POWER-UP TIMER (PWRT)

El PWRT provee un tiempo de retardo nominal de 72 ms. A


partir del momento en el que se aplica la alimentación al Vdd.

El PWRT opera con un oscilador RC interno. El microcontro-


lador es mantenido en RESET durante el tiempo que el PWRT
permanece activo.

El retardo de tiempo del PWRT permite que el voltaje de ali-


entación llegue a un nivel aceptable.

El bit PWRTEN de la palabra de configuración ahbilita o des-


habilita el PWRT.
141
Curso básico de microcontroladores (PIC16F877A)
OSCILLATOR START-UP TIMER (OST)

El oscilador Start-Up timer provee un retardo de 1024 ciclos


del oscilador después de que termina el retardo PWRT, (si este
se encuentra habilitado). Esto ayuda a asegurar que el cristal
oscilador o resonador se ha estabilizado.

El OST es usado solo para los modos de oscilador XT, LP y HS.

142
Curso básico de microcontroladores (PIC16F877A)
BROWN-OUT RESET (BOR)

El bit de configuración BOREN puede habilitar o deshabilitar


el circuito Brown-Out Reset. Si el voltaje de alimentación Vdd
cae por debajo del valor VBOR (aprox. 4V), por un tiempo ma-
yor que TBOR (aprox. 100s.) este circuito producirá un RESET
al microcontrolador.

Una vez que el Brown-Out ocurre, el dispositivo permanecerá


en RESET por 72 ms. Después de que el voltaje en Vdd vuelva
a un valor por encima del voltaje VBOR.

143
Curso básico de microcontroladores (PIC16F877A)
TIME-OUT SEQUENCE

La secuencia power-up es la sigiente:

El retardo PWRT inicia (si se encuentra habilitado) cuando


un POR ocurre. Entonces inicia el OST contando 1024 ciclos
del oscilador. Cuando el OST termina, el dispositivo sale del
RESET.

Si el pin MCLR permanece en bajo un tiempo suficiente, los


tiempos anteriores habrán expirado. Cuando cambie MCLR
a alto, iniciará la ejecución inmeditamante. Lo anterior es
util para propósitos de prueba o para sincronizar más de un
microcontrolador, en paralelo.
144
Curso básico de microcontroladores (PIC16F877A)
TECLADO

Un teclado consiste en un grupo de interruptores en un arreglo que


permita utilizar el menor número de pines del microcontrolador.

Lo anterior se logra por medio de un arreglo matricial en filas y


columnas, de manera que para un teclado de 16 teclas, solo se
requieren 8 líneas del PIC, en lugar de las 16 que se necesitaría
si se manejaran de manera individual.

145
Curso básico de microcontroladores (PIC16F877A)
TARJETA DE DESARROLLO

F E D C

6 9 B
3

2 5 8 0

1 4 7 A

146
Curso básico de microcontroladores (PIC16F877A)
TECLADO

Las cuatro líneas de menor peso del puerto D (RD0 – RD3) se


configuran como salidas que aplican un patrón de estado lógicos
a las cuatro columnas del teclado.

Las cuatro líneas de mayor peso del puerto D (RD4 – RD7) están
configuradas como entradas y reciben los niveles lógicos que
contienen las filas del teclado.

147
Curso básico de microcontroladores (PIC16F877A)
TECLADO

Por medio el programa se verifica el teclado, sacando de manera


secuencial un nivel bajo por una de las cuatro líneas RD0 – RD3,
que manejan las columnas.

En seguida lee el nivel lógico introducido por las filas en las


líneas RD4 – RD7. Si ninguna de las teclas de la columna a la que
en ese momento se aplica el nivel bajo está pulsada, se leerá un
nivel alto en las cuatro filas, pasando a aplicar el nivel bajo a la
siguiente columna.

148
Curso básico de microcontroladores (PIC16F877A)
TECLADO

Si al aplicar a una de las columnas el nivel bajo y al leer, una de


las filas se encuentra con un nivel bajo, se deduce que la tecla
asociada a la fila y columna correspondientes se encuentra
presionada.

De esta manera cada una de las 16 teclas se reconoce cuando se


presiona.

Cada tecla tendrá asociado un código binario que corresponde a


los 4 bits que se sacan a través de las líneas RD0 – RD3 y los 4
recibidos por RD4 – RD7.

149
Curso básico de microcontroladores (PIC16F877A)
TECLADO

TECLA RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 CÓDIGO
1 0 1 1 1 0 1 1 1 77
2 1 0 1 1 0 1 1 1 B7
3 1 1 0 1 0 1 1 1 D7
F 1 1 1 0 0 1 1 1 E7
4 0 1 1 1 1 0 1 1 7B
5 1 0 1 1 1 0 1 1 BB
6 1 1 0 1 1 0 1 1 DB
E 1 1 1 0 1 0 1 1 EB
7 0 1 1 1 1 1 0 1 7D
8 1 0 1 1 1 1 0 1 BD
9 1 1 0 1 1 1 0 1 DD
D 1 1 1 0 1 1 0 1 ED
A 0 1 1 1 1 1 1 0 7E
0 1 0 1 1 1 1 1 0 BE
B 1 1 0 1 1 1 1 0 DE
C 1 1 1 0 1 1 1 0 EE

Nota: Un pin que ha sido programado como salida si es leído, se obtendrá el valor
que previamente ha sido sacado por el.
150
Curso básico de microcontroladores (PIC16F877A)
TECLADO

Los códigos de exploración de las teclas varían según la colocación


de las mismas.

El programa que maneja el teclado realiza la exploración cada cierto


Tiempo que suele ser un valor aproximado de 20 ms.

El software se debe de encargar de realizar el tratamiento adecuado


cuando se pulsan varias teclas a la vez, eliminar los rebotes, etc.

151
Curso básico de microcontroladores (PIC16F877A)
TECLADO

LIBRERÍA DE SUBRUTINAS PARA MANEJO DEL TECLADO

El teclado es un dispositivo periférico que puede ser usado en


diferentes programas.

Para su aplicación es conveniente la implementación de subrutinas


que permitan realizar las sigientes funciones:

- Inicialización de puertos.
- Barrido.
- Validación de tecla presionada (incluyendo antirrebotes).
- Reconocimiento y conversión del código de la tecla a valor
numérico.
- Espera liberación de la tecla. 152
Curso básico de microcontroladores (PIC16F877A)
TECLADO

Pensando en una aplicación más general, las subrutinas anteriores


se pueden manejar mediante una librería de subrutinas que deberá
ser manejada como un archivo incluido declarado al principio del
programa principal y cualquiera de estas subrutinas podrá ser
llamada por su nombre desde este programa.

Dentro de la librería de subrutinas se incluye la subrutina llamada


KBD_TONO, que puede generar un tono auditivo diferente con
ayuda del buzzer, al presionar una tecla.

153
Curso básico de microcontroladores (PIC16F877A)
TECLADO

;KBD_CXX.ASM

;El conjunto de rutinas que se presentan a continuación permiten realizar


;las tareas básicas de control del teclado. En el programa principal se
;debe reservar memoria para el bloque de variables que utiliza el teclado

;BLOQUE DE VARIABLES

CBLOCK KBD_VAR
TECLA ;Código de tecla presionada
BARRIDO ;Variable para barrido de teclado
ENDC

154
Curso básico de microcontroladores (PIC16F877A)
TECLADO

;**********************************************************************
;Tablas de datos

KEY_TAB movf DATO,w


addwf PCL,F
retlw 0xBE ;Código tecla 0
retlw 0x77 ;Código tecla 1
retlw 0xB7 ;Código tecla 2
retlw 0xD7 ;Código tecla 3
retlw 0x7B ;Código tecla 4
retlw 0xBB ;Código tecla 5
retlw 0xDB ;Código tecla 6
retlw 0x7D ;Código tecla 7
retlw 0xBD ;Código tecla 8
retlw 0xDD ;Código tecla 9
retlw 0x7E ;Código tecla A
retlw 0xDE ;Código tecla B
retlw 0xEE ;Código tecla C
retlw 0xED ;Código tecla D
retlw 0xEB ;Código tecla E
retlw 0xE7 ;Código tecla F155
Curso básico de microcontroladores (PIC16F877A)
TECLADO

TONO movf DATO,w


addwf PCL,F
retlw 0x08 ;0
retlw 0x18 ;1
retlw 0x28 ;2
retlw 0x38 ;3
retlw 0x48 ;4
retlw 0x58 ;5
retlw 0x68 ;6
retlw 0x78 ;7
retlw 0x88 ;8
retlw 0x98 ;9
retlw 0xA8 ;A
retlw 0xB8 ;B
retlw 0xC8 ;C
retlw 0xD8 ;D
retlw 0xE8 ;E
retlw 0xF8 ;F

156
Curso básico de microcontroladores (PIC16F877A)
TECLADO

;**********************************************************************
; Rutina que inicializa puerto B para leer el teclado

KBD_INI bsf STATUS,RP0


movlw 0x30 ; Inicializa puertos
movwf TRISC
movlw 0xF0
movwf TRISB
bcf STATUS,RP0
return

157
Curso básico de microcontroladores (PIC16F877A)
TECLADO

;**********************************************************************
;Subrutina que barre teclado para detectar tecla presionada. Si se presionó
;tecla el bit 4 de la variable BARRIDO será 1, de lo contrario será 0.

KBD_BARRE movlw 0xFE


movwf BARRIDO
BARRE1 movwf PORTB
movf PORTB,W
movwf TECLA
andlw 0xF0
sublw 0xF0
btfss STATUS,Z
goto BARREFIN
bsf STATUS,C ; Establece carry en 1
rlf BARRIDO,F ; rota un bit a la izquierda
btfss BARRIDO,4
goto BARREFIN
movf BARRIDO,W
goto BARRE1
BARREFIN return
158
Curso básico de microcontroladores (PIC16F877A)
TECLADO

PRÁCTICA # 8

Hacer un programa que lea el teclado y cuando detecte


una tecla presionada despliegue el valor binario
correspondiente a la tecla en los LED’s RB0 a RB3 y
genere un tono audible diferente para cada tecla.

159
Curso básico de microcontroladores (PIC16F877A)
LCD

El display de cristal líquido (LCD) es un periférico visualizador


muy potente, siendo los microcontroladores los dispositivos más
adecuados para su manejo y control. En realidad un módulo LCD
tiene incrustado un microcontrolador de uso específico para su
funcionamiento.

Los módulos LCD más comunes presentan un número variable


de caracteres formados por una matriz de 5X7 pixeles en una o
varias líneas.

El módulo LCD modelo 44780 de HITACHI tiene la capacidad


de manejar 2 líneas de 16 caracteres y dispone de 14 terminales
siendo compatibles con el la mayoría de los LCD comerciales.
160
Curso básico de microcontroladores (PIC16F877A)
TARJETA DE DESARROLLO

161
Curso básico de microcontroladores (PIC16F877A)
LCD

La función de las terminales del módulo LCD es la siguiente:

1.- Ocho terminales (D0 – D7) reciben los caracteres en código


ASCII a exhibir, así como los códigos de los comandos de control
que manejan los efectos de visualización. También a través de
ellos el módulo LCD envía al microcontrolador sobre su estado
interno.

2.- Las terminales Vcc y Vss reciben la alimentación de +5V y


tierra respectivamente.

3.- La terminal Vee regula el contraste de la pantalla al aplicarle


mediante un potenciómetro una tensión variable entre 0 y +5V.
162
Curso básico de microcontroladores (PIC16F877A)
LCD

4.- Las tres terminales restantes controlan las funciones principales


del módulo:

E (Enable).- Si E = 0 el módulo se encuentra desactivado y no


Funcionan las otras señales.

R/W (Read/Write).- Si R/W = 0 se efectúa una operación de


Escritura y si R/W = 1 se realiza una operación de lectura.

RS (Register Select).- Con RS = 0 se selecciona el registro de


control y con RS = 1 selecciona el registro de datos. Por D0 – D7
se tranfiere la información de control-comandos o datos de
caracteres a escribir.
163
Curso básico de microcontroladores (PIC16F877A)
LCD

En la tarjeta de desarrollo las terminales RE0 – RE2 se encuentran


conectadas a las terminales de control del LCD RS, R/W y E,
respectivamente, y las terminales RD0 – RD7 del microcontrolador
a las terminales D0 – D7 del LCD también en forma respectiva.

Dado lo anterior, las líneas del puerto E deberán ser programadas


como salidas y las líneas del puerto D deberán configurarse como
entradas o salidas según sea el sentido de la información.

El módulo LCD responde a una serie de comandos con los que se


pueden gobernar sus distintas opciones de trabajo. Estos comandos
son enviados por el programa en el PIC a través de las líneas D0 –
D7 cuando RS = 0 y R/W = 0, para trabajar en modo escritura.
164
Curso básico de microcontroladores (PIC16F877A)
LCD

COMANDO RS R/W E D7 D6 D5 D4 D3 D2 D1 D0 TIEMPO EJEC.


CLEAR DISPLAY 0 0 1 0 0 0 0 0 0 0 1 1.64 ms.
HOME 0 0 1 0 0 0 0 0 0 1 X 1.64 ms.
ENTRY MODE
0 0 1 0 0 0 0 0 1 I/D S 40 ms.
SET
DISPLAY ON/OFF 0 0 1 0 0 0 0 1 D C B 40 ms.
CURSOR DISPLAY
0 0 1 0 0 0 1 S/C R/L X X 40 ms.
SHIFT
FUNCTION SET 0 0 1 0 0 1 DL N F X X 40 ms.
SET CGRAM
0 0 1 0 1 DIRECCIÓN DE LA CGRAM 40 ms.
ADDRESS
SET DDRAM
0 1 1 1 DIRECCIÓN DE LA DDRAM 40 ms.
ADDRESS
READ BUSY FLAG
0 0 1 BF DIRECCIÓN CGRAM O DDRAM 40 ms.
ADDRESS
WRITE DATA TO
0 0 1 CÓDIGO ASCII PARA LA RAM 40 ms.
CG O DD
READ DATA TO
0 0 1 CÓDIGO ALMACENADO EN RAM 40 ms.
CG O DD 165
Curso básico de microcontroladores (PIC16F877A)
LCD

S : 1 – Desplaza visualización cada vez que escribe un dato.


0 – Funciona en modo normal.

I/D : 1 – Se incrementa la dirección del cursor.


0 – Se decrementa la dircción del cursor.

S/C: 1 – Desplaza la visualización.


0 – Desplaza el cursor.

R/L : 1 – El desplazamiento es a la derecha.


0 – El desplazamiento es a la izquierda.

BF : 1 – El módulo LCD está ocupado.


0 – El módulo LCD está disponible. 166
Curso básico de microcontroladores (PIC16F877A)
LCD

DL : 1 – Se trabaja con un bus de datos de 8 bits.


0 – Se trabaja con un bus de datos de 4 bits.

N : 1 – La presentación se hace en dos líneas.


0 – La presentación se hace en una línea.

F : 1 – El carácter es de 5 x 10 pixeles.
0 – El carácter es de 5 x 7 pixeles.

B : 1 – Hay parpadeo en el cursor.


0 – No hay parpadeo en el cursor.

C : El cursor está activo.


167
Curso básico de microcontroladores (PIC16F877A)
LCD

D : 1 – La pantalla está activada.

X : Indeterminado.

168
Curso básico de microcontroladores (PIC16F877A)
LCD

COMANDOS DEL LCD

CLEAR DISPLAY.- Borra la pantalla del módulo LCD y coloca


el cursor en la primera posición, que es la dirección 0.
Por default pone el bit I/D = 1 para auto incremento de la posición
del cursor.

HOME.- Pone el cursor en la dirección 0. No varía el contenido


de la memoria DDRAM que guarda los datos y queda
direccionada desde la posición 0.

ENTRY MODE SET.- Establece la dirección del movimiento del


cursor (I/D). Si S = 1desplaza la visualización cada vez que se
escribe un dato. Si S = 0 la presentación es normal. 169
Curso básico de microcontroladores (PIC16F877A)
LCD

DISPLAY ON/OFF CONTROL.- Activa o desactiva el display


(D) Y al cursor (C) y determina si parpadea o no.

CURSOR DISPLAY SHIFT.- Mueve el cursor y desplaza la


visualización sin cambiar el contenido de la memoria DDRAM.

FUNCTION SET.- Establece el número de líneas de interfase


con el bus de datos. Toma por default 8 bits (DL = 1). Especifica
el número de líneas, que para que sean 2 se debe poner N = 1 y
el formato del carácter es de 5 x 7 pixeles si F = 0.

170
Curso básico de microcontroladores (PIC16F877A)
LCD

SET CGRAM ADDRESS.- El módulo LCD tiene definidos los


caracteres ASCII, pero además permite que el usuario defina un
Máximo de 9 caracteres nuevos. Estos se guardan en la memoria
CGRAM de 64 bytes. Cada carácter está especificado con un
número de bytes comprendido entre 6 y 16, según su complejidad.
Dichos bytes se almacenan en posiciones sucesivas de la CGRAM.
Con este comando se indica la dirección de la CGRAM a partir de
La cual se irán almacenando los bytes que definen al nuevo
Carácter.
Tras ejecutar este comando, todos los datos que se lean o escriban,
posterioremente lo hacen desde esta posición de la CGRAM.

171
Curso básico de microcontroladores (PIC16F877A)
LCD

SET DDRAM ADDRESS.- Establece la dirección de la DDRAM


a partir de la cual todos los datos que se lean o escriban
Posteriormente lo harán desde esa posición. Los 16 caracteres del
primer renglón ocupan las direcciones 80h – 8Fh, y los del
segundo desde la C0h – CFh.

READ BUSY FLAG ADDRESS.- Es un comando para la lectura


de la bandera “busy” que indica cuando se está ejecutando un
comando previo en el módulo LCD. Además proporciona la
dirección de la CGRAM o DDRAM que se haya utilizado la
Última vez.

172
Curso básico de microcontroladores (PIC16F877A)
LCD

WRITE DATA TO CGRAM o DDRAM.- Se escriben en la


DDRAM los datos (caracteres ASCII) que se quieren visualizar.
También se escriben en la CGRAM los bytes de los nuevos
caracteres creados por el usuario. Se usa una memoria u otra
según haya sido la instrucción de direccionamiento previa, que
hará que se refiera a la CGRAM o a la DDRAM.

READ DATA TO CGRAM o DDRAM.- Es igual que el


comando anterior, pero para una operación de lectura.

173
Curso básico de microcontroladores (PIC16F877A)
LCD

Cuando se aplica adecuadamente la tención de alimentación al


módulo LCD, se ejecuta automáticamente la siguiente secuencia
de inicialización:

1.- Se ejecuta el comando CLEAR DISPLAY borrando la


pantalla. La bandera BUSY se mantiene activada por 15 ms.
hasta que se completa dicha secuencia.

2.- Se ejecuta el comando FUNCTION SET, que establece la


interfase con el bus de datos a 8 bits normalmente (DL = 1),
y el número de líneas.

174
Curso básico de microcontroladores (PIC16F877A)
LCD

3.- Se ejecuta el comando DISPLAY ON/OFF CONTROL, que


hace que el display quede en OFF (D = 0), también el cursor
(C = 0) y sin parpadeo (B = 0.)

4.- Se ejecuta el comando ENTRYMODE SET, que establece la


dirección de movimiento del cursor con autoincremento (I/D = 1)
y el modo de visualización normal, sin desplazamiento (S = 0).

Si al conexión de la alimentación no reúne todas las condiciones


que exige el módulo LCD, habrá que realizar la secuencia de
inicialización por software. En cualquier caso es importante
enviar al LCD la primera instrucción de trabajo después de
transcurrir 15 ms. para completar la secuencia de inicialización.
175
Curso básico de microcontroladores (PIC16F877A)
PRÁCTICA # 9

Hacer un programa que lea el teclado y cuando detecte


una tecla presionada despliegue el valor de la tecla en el
correspondiente a la tecla en los LED’s RB0 a RB3 y
genere un tono audible diferente para cada tecla.

176
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH
En el PIC16F877 es posible leer y escribir tanto la memoria de
datos EEPROM como la memoria de código FLASH.

Lo anterior significa que un programa dinámicamente puede


generar información que se puede grabar en la memoria FLASH
directamente, sin necesidad de grabador externo.

En el PIC16F877 la memoria flash tiene un tamaño de 8K


palabras de 14 bits cada una. Dado lo anterior, un solo registro
no es suficiente para contener la dirección de la localidad en la
que se almacenará el dato, dado que la dirección contiene 13 bits
y lo mismo sucede con el dato que se va a guardar dado que este
tiene una longitud de 14 bits.
177
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH
Debido a lo anterior, el registro EEADR se concatena con el
EEADRH, que contendrá los 5 bits de más peso de la dirección.

Por otra parte, el registro EEDATAH se concatena con el registro


EEDATA y contiene los 6 bits de más peso de la palabra leída o a
escribir en la FLASH.

Los registros EEADRH y EEDATAH no se usan en las


operaciones del lectura/escritura de la memoria EEPROM.

178
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH

EEADRH (10Fh) EEADR (10Dh)

0 0 0 X X X X X X X X X X X X X

DIRECCIÓN DE 13 BITS (8K)

EEDATAH (10Eh) EEDATA (10Ch)

0 0 X X X X X X X X X X X X X X

DATO DE 14 BITS (FLASH)


179
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH

Para controlar las operaciones de lectura/escritura de las memorias


EEPROM y FLASH hay dos registros denominados EECON1 y
EECON2.

EECON1 ocupa la dirección 18Ch y EECON2 no se encuentra


implementado físicamente y solo se encuentra en la operación de
escritura que tarda 2 ms. aproximadamente.

EECON1 EEPGD - - - WRERR WREN WR RD 18Ch

180
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH

EEPGD – Bit de selección de memoria.

1 – Accesa memoria de programa (FLASH).


0 – Accesa memoria de datos EEPROM.

WRERR – Bandera de error de la EEPROM.


1 – Una operación de escritura fue prematuramente
terminada.
0 – Operación de escritura completada.

WREN – Permiso de escritura en la EEPROM.


1 – Habilita escritura.
0 – Inhibe escritura.
181
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH

WR – Control de escritura.

1 – Inicia ciclo de escritura. El bit es limpiado una vez que


el proceso de escritura es completado. Este bit solo
puede ser puesto a 1 pero no limpiado.
0 – Se completó el ciclo de escritura.

RD – Control de lectura.

1 – Inicia ciclo de lectura de la EEPROM. RD es limpiado


por hardware y solo puede ser puesto a 1 por software.
0 – No inicia lectura de EEPROM.

182
Curso básico de microcontroladores (PIC16F877A)
LECTURA Y ESCRITURA DE LAS
MEMORIAS EEPROM Y FLASH
Antes de iniciar la escritura de una palabra se escribe en EECON2
primeramente el dato 55h y después AAh, lo cual es recomendado
por el fabricante.

A fin de evitar escrituras indeseadas en la EEPROM causadas por


Transitorios en la inicialización del microcontrolador, se controla
el bit WREN, prohibiendo cualquier operación de escritura
mientras transcurren los 72 ms. que temporiza el timer del power-
up.

183
Curso básico de microcontroladores (PIC16F877A)

También podría gustarte