You are on page 1of 54

Seguidores de clase

Universidad Pontificia de Salamanca (Madrid)

Microcontrolador PIC 16F877


Microcontroladores Versión 1.4 29 oct. 05 pág. 1

INDICE

Características generales del PIC 16F877............................................................................................................ 1


Diagrama de bloques del PIC 16F877................................................................................................................. 2
Organización de la memoria RAM...................................................................................................................... 3
Tipos de direccionamiento de la RAM................................................................................................................ 4
Formas de modificar el Contador de Programa.................................................................................................... 4
Registro de estado .............................................................................................................................................. 5
ALU .................................................................................................................................................................. 5
Set de instrucciones............................................................................................................................................ 5
Instrucciones de transferencia ......................................................................................................................... 7
Instrucciones aritméticas................................................................................................................................. 7
Instrucciones lógicas ...................................................................................................................................... 7
Incrementos/Decrementos............................................................................................................................... 7
Instrucciones de rotación ................................................................................................................................ 8
Instrucciones de manipulación de bits................................................................................................................. 8
Instrucciones de control .................................................................................................................................. 8
Instrucciones de salto incondicional ................................................................................................................ 8
Instrucciones de salto condicional................................................................................................................... 8
Proceso de ensamblado....................................................................................................................................... 9
Representación de números y cadenas .............................................................................................................. 11
Directivos del ensamblador .............................................................................................................................. 11
Programa Display.ASM (Programa absoluto).................................................................................................... 13
Módulo CONTAR.ASM (Programa reubicable)................................................................................................ 15
Módulo Display.ASM ...................................................................................................................................... 17
Interrupciones. ................................................................................................................................................. 18
Proceso para atención de interrupciones............................................................................................................ 19
Plantilla de programa absoluto con atención a interrupciones. ........................................................................... 20
Reset................................................................................................................................................................ 21
Modo Sleep...................................................................................................................................................... 22
Reloj. ............................................................................................................................................................... 22
Modo Debug. ................................................................................................................................................... 23
Bits de Configuración....................................................................................................................................... 23
Periféricos 16F877 ........................................................................................................................................... 24
Puertos programables de E/S. ........................................................................................................................... 25
Timers ............................................................................................................................................................. 26
Timer0 ......................................................................................................................................................... 26
Watch dog Timer.......................................................................................................................................... 26
Timer1 ......................................................................................................................................................... 27
Timer2 ......................................................................................................................................................... 28
CAPTURE/COMPARE/PWM ......................................................................................................................... 29
Master Synchronous Serial Port........................................................................................................................ 30
Addressable Universal Synchronous Asynchronous Receiver Transmitter (USART). ........................................ 30
Analog/Digital Converter. ................................................................................................................................ 31
Microcontrolador 16F876................................................................................................................................. 33
Microcontrolador 16F84.................................................................................................................................. 34
Componentes electrónicos ................................................................................................................................ 35
Resistencias ..................................................................................................................................................... 35
Fuente de alimentación..................................................................................................................................... 35
Transformador:............................................................................................................................................. 35
Rectificador:................................................................................................................................................. 36
Filtro:........................................................................................................................................................... 36
Regulador:.................................................................................................................................................... 37
Interruptores/pulsadores:............................................................................................................................... 37
Teclados....................................................................................................................................................... 37
Otros dispositivos de entrada: ....................................................................................................................... 38
Dispositivos de salida:...................................................................................................................................... 39
Diodos LED ................................................................................................................................................. 39
Displays 7 segmentos ................................................................................................................................... 39
Microcontroladores Versión 1.4 29 oct. 05 pág. 2

Displays LCD............................................................................................................................................... 40
Transistores:..................................................................................................................................................... 44
BC107.......................................................................................................................................................... 45
BD 139 ........................................................................................................................................................ 45
TIP122......................................................................................................................................................... 46
2N3055 ........................................................................................................................................................ 46
TRIACS........................................................................................................................................................... 47
MOTORES ...................................................................................................................................................... 48
Motores CC.................................................................................................................................................. 48
Servocontrol................................................................................................................................................. 49
Motores paso a paso ..................................................................................................................................... 49
Control de motores paso a paso..................................................................................................................... 50
Circuitos específicos: SAA1027.................................................................................................................... 51
Microcontroladores Versión 1.41 29 oct. 05 pág. 1

Características generales del PIC 16F877


Descripción Características
Procesador Núcleo RISC, Arq. Harvard, 20 MHz. 5 MIPS
Interrupciones 14 fuentes posibles de interrupción
Reloj 0-20 MHz.
Reset Master Clear, Brown Out, Watchdog, Power On
Instrucciones 35 instrucciones de 14 bits

Memoria M. de programa 8 K palabras de 14 bits


M. de datos RAM 368 registros de 8 bits
M. de datos EEPROM 256 registros de 8 bits
Pila 8 palabras de 13 bits
M. de datos ext. EEPROM Hasta 256 KBytes
Periféricos Puertos programables de E/S Hasta 33 bits, pueden ser usados por otros periféricos
Timers/Counters Dos de 8 bits y uno de 16 bits
Puertos de captura/comparación de datos Dos de 8 bits
Moduladores de ancho de pulso (PWM) Dos de 8 bits
Conversor Analógico/Digital de 10 bits Con un MPX de 8 canales para 8 entradas diferentes
Puerto serie síncrono Configurable en modo SPI e I2C
USART Para conexiones RS 232
Parallel Slave Port 8 bits + 3 bits de control

Tabla 1 Características generales del PIC 16F877


Microcontroladores Versión 1.41 29 oct. 05 pág. 2

Diagrama de bloques del PIC 16F877

Figura 1 Diagrama de bloques del PIC 16F877


Microcontroladores Versión 1.41 29 oct. 05 pág. 3

Organización de la memoria RAM


Registro Dir. Registro Dir. Registro Dir. Registro Dir.
Indirect. addr.(*) 00H Indirect. addr.(*) 80H Indirect. addr.(*) 100H Indirect. addr.(*) 180H
TMR0 01H OPTION_REG 81H TMR0 101H OPTION_REG 181H
PCL 02H PCL 82H PCL 102H PCL 182H
STATUS 03H STATUS 83H STATUS 103H STATUS 183H
FSR 04H FSR 84H FSR 104H FSR 184H
PORTA 05H TRISA 85H 105H 185H
PORTB 06H TRISB 86H PORTB 106H TRISB 186H
PORTC 07H TRISC 87H 107H 187H
PORTD 08H TRISD 88H 108H 188H
PORTE 09H TRISE 89H 109H 189H
PCLATH 0AH PCLATH 8AH PCLATH 10AH PCLATH 18AH
INTCON 0BH INTCON 8BH INTCON 10BH INTCON 18BH
PIR1 0CH PIE1 8CH EEDATA 10CH EECON1 18CH
PIR2 0DH PIE2 8DH EEADR 10DH EECON2 18DH
TMR1L 0EH PCON 8EH EEDATH 10EH 18EH
TMR1H 0FH 8FH EEADRH 10FH 18FH
T1CON 10H 90H 110H 190H
TMR2 11H SSPCON2 91H 111H 191H
T2CON 12H PR2 92H 112H 192H
SSPBUF 13H SSPADD 93H 113H 193H
SSPCON 14H SSPSTAT 94H 114H 194H
CCPR1L 15H 95H 115H 195H
CCPR1H 16H 96H 116H 196H
CCP1CON 17H 97H 117H 197H
RCSTA 18H TXSTA 98H 118H 198H
TXREG 19H SPBRG 99H 119H 199H
RCREG 1AH 9AH Registros 11AH Registros 19AH
CCPR2L 1BH 9BH de propósito 11BH de propósito 19BH
CCPR2H 1CH 9CH general 11CH general 19CH
CCP2CON 1DH 9DH 11DH 19DH
ADRESH 1EH ADRESL 9EH 96 bytes 11EH 96 bytes 19EH
ADCON0 1FH ADCON1 9FH 11FH 19FH
20H A0H 120H 1A0H

Registros Registros
de propósito de propósito
general general

96 bytes 80 bytes

EFH 16FH 1EFH


F0H 170H 1F0H
Acceso a Acceso a Acceso a
70H-7FH 70H-7FH 70H-7FH
7FH FFH 17FH 1FFH
Banco 0 Banco 1 Banco 2 Banco 3
(*) No es un registro físico, sino el indicador de acceso indirecto a memoria

Tabla 2 Organización de la memoria RAM


Microcontroladores Versión 1.41 29 oct. 05 pág. 4

Tipos de direccionamiento de la RAM

Figura 2 Tipos de direccionamiento para apuntar a los registros de la RAM

Formas de modificar el Contador de Programa

Figura.3 Formas de modificar el Contador de Programa.


Microcontroladores Versión 1.41 29 oct. 05 pág. 5

Registro de estado
Registro de estado
7 0
IRP RP1 RP0 TO PD Z DC C
Direccionamiento Reset Flags ALU

Tabla.3 Bits del registro de estado.

DC= Flag de acarreo intermedio, indica en las sumas y restas desbordamiento entre los bits tres y cuatro.
C= Flag de Carry. Si vale 1 después de una suma indica desbordamiento, Si vale 1 después de una resta indica que
NO ha habido desbordamiento.

ALU

Figura.4 ALU y elementos directamente conectados a ella.

Set de instrucciones.
Formato de una instrucción:
[etiqueta] mnemónico [operando1[, operando2]] [; comentario]

Tipos de operandos en una instrucción:

f: Indica un nº de registro dentro de un banco de la RAM. Es un valor de 7 bits.


d: Operando destino. Es un bit que si vale 0 indica que el resultado debe almacenarse en W y si vale 1 en el
registro usado como primer operando.
b: Es usado en las instrucciones que afectan a un único bit, y apunta al bit destino de la instrucción.
k: Constante. Las instrucciones van a manejar dos tipos de constantes, si la instrucción es CALL o GOTO
la constante es de 11 bits (k11) y hace referencia a la dirección a la que se va a saltar. En cualquier otro
caso se trata de un valor de 8 bits (k8) que se usará como valor inmediato en una operación que siempre
involucra a la ALU y al acumulador.
Microcontroladores Versión 1.41 29 oct. 05 pág. 6

Instrucción Descripción Flags


modif..
ADDLW k8 W+k8 ® W C, DC, Z
ADDWF f, d Si d=0, W+f® W. si d=1 W+f®f C, DC, Z
ANDLW k8 WÙk8 ® W Z
ANDWF f, d Si d=0, WÙf® W. si d=1 WÙf®f Z
BCF f, b 0 ® bit(b) de f Ninguno
BSF f, b 1 ® bit(b) de f Ninguno
BTFSC f, b Comprobar bit b en f, saltar si es 0 Ninguno
BTFSS f, b Comprobar bit b en f, saltar si es 1 Ninguno
CALL k11 PC ® pila, bits 4,3 de PCLATH + k11 ® PC Ninguno
CLRF f 0®f Z
CLRW 0®W Z
CLRWDT Poner a 0 el Watch Dog Timer. TO , PD
COMF f,d Si d=0, Ca1(f)® W. si d=1 Ca1(f)®f Z
DECF f, d Si d=0, f-- ® W. si d=1 f-- ®f Z
DECFSZ f, d Si d=0, f-- ® W, si d=1 f-- ®f, saltar si cero Ninguno
GOTO k11 bits 4,3 de PCLATH + k11 ® PC Ninguno
INCF f, d Si d=0, f++ ® W. si d=1 f ++®f Z
INCFSZ f, d Si d=0, f++ ® W, si d=1 f++ ®f, saltar si cero Ninguno
IORLW k8 WÚk8 ® W Z
IORWF f, d Si d=0, WÚf® W. si d=1 WÚf®f Z
MOVF f, d Si d=0, f ® W. si d=1 f®f Z
MOVLW k8 k8 ® W Ninguno
MOVWF f W® f Ninguno
NOP No operar Ninguno
RETFIE pila ® PC, 1 ® GIE GIE
RETLW k8 pila ® PC; k8 ® W Ninguno
RETURN pila ® PC Ninguno
Rotación a la izquierda a través de carry de f,
RLF f, d C
dejando el resultado en W o f según d
Rotación a la derecha a través de carry de f,
RRF f, d C
dejando el resultado en W o f según d
SLEEP Pasar a modo standby TO , PD
SUBLW k8 k8 -W ® W C, DC, Z
SUBWF f, d Si d=0, f-W® W. si d=1 f-W®f C, DC, Z
Intercambia los dos nibbles (4 bits) de f,
SWAPF f, d Ninguno
dejando el resultado en W o f según d
XORLW k8 WÅk8 ® W Z
XORWF f, d Si d=0, WÅf® W. si d=1 WÅf®f Z
Tabla 4 Set de instrucciones del PIC 16F877 ordenadas alfabéticamente.
Microcontroladores Versión 1.41 29 oct. 05 pág. 7

Instrucciones de transferencia

Flags modif..
CLRF f 0®f Z
CLRW 0®W Z
MOVLW k8 k8 ® W Ninguno
MOVWF f W® f Ninguno
MOVF f, d Si d=0, f ® W. si d=1 f®f Z
Intercambia los dos nibbles (4 bits) de f,
SWAPF f, d Ninguno
dejando el resultado en W o f según d

Instrucciones aritméticas

Flags modif..
ADDLW k8 W+k8 ® W C, DC, Z
ADDWF f, d Si d=0, W+f® W. si d=1 W+f®f C, DC, Z
SUBLW k8 k8-W ® W C, DC, Z
SUBWF f, d Si d=0, f-W® W. si d=1 f-W®f C, DC, Z

Instrucciones lógicas

Flags modif..
ANDLW k8 WÙk8 ® W Z
ANDWF f, d Si d=0, WÙf® W. si d=1 WÙf®f Z
COMF f,d Si d=0, Ca1(f)® W. si d=1 Ca1(f)®f Z
IORLW k8 WÚk8 ® W Z
IORWF f, d Si d=0, WÚf® W. si d=1 WÚf®f Z
XORLW k8 WÅk8 ® W Z
XORWF f, d Si d=0, WÅf® W. si d=1 WÅf®f Z

Incrementos/Decrementos

Flags modif..
DECF f, d Si d=0, f-- ® W. si d=1 f-- ®f Z
INCF f, d Si d=0, f++ ® W. si d=1 f ++®f Z
Microcontroladores Versión 1.41 29 oct. 05 pág. 8

Instrucciones de rotación
Flags modif..
Rotación a la izquierda a través de carry de f,
RLF f, d C
dejando el resultado en W o f según d
Rotación a la derecha a través de carry de f,
RRF f, d C
dejando el resultado en W o f según d

Instrucciones de manipulación de bits

Flags modif..
BCF f, b 0 ® bit(b) de f Ninguno
BSF f, b 1 ® bit(b) de f Ninguno

Instrucciones de control

Flags modif..
CLRWDT Poner a 0 el Watch Dog Timer. TO , PD
SLEEP Pasar a modo standby TO , PD

Instrucciones de salto incondicional

Flags modif..
CALL k11 PC ® pila, bits 4,3 de PCLATH + k11 ® PC Ninguno
GOTO k11 bits 4,3 de PCLATH + k11 ® PC Ninguno
RETFIE pila ® PC, 1 ® GIE GIE
RETLW k8 pila ® PC; k8 ® W Ninguno
RETURN pila ® PC Ninguno

Instrucciones de salto condicional


Flags modif..
BTFSC f, b Comprobar bit b en f, saltar si es 0 Ninguno
BTFSS f, b Comprobar bit b en f, saltar si es 1 Ninguno
DECFSZ f, d Si d=0, f-- ® W, si d=1 f-- ®f, saltar si cero Ninguno
INCFSZ f, d Si d=0, f++ ® W, si d=1 f++ ®f, saltar si cero Ninguno
Microcontroladores Versión 1.41 29 oct. 05 pág. 9

Proceso de ensamblado

Figura 5 Proceso de ensamblado de un programa ‘absoluto’.

Figura ¡Error! No hay texto con el estilo especificado en el documento..6 Proceso de


ensamblado de un programa con ‘código reubicable’.
Microcontroladores Versión 1.41 29 oct. 05 pág. 10

Figura 7 Entradas y salidas para las herramientas de desarrollo MPLAB


Microcontroladores Versión 1.41 29 oct. 05 pág. 11

Representación de números y cadenas

Base Sintaxis Ejemplo


Binario B'dígitos binarios' B'101'
Octal O'ígitos octales' O'123'
Decimal D'dígitos decimales' D'123'
Hexadecimal H'dígitos hexadecimales' H'12AB'
0xdígitos hexadecimales 0x12AB
Carácter Los caracteres se almacenan en código ASCII de 7 bits A'a'
'a'
String Los caracteres se almacenan en código ASCII de 7 bits "cadena de caracteres"

Directivos del ensamblador


Veremos algunos de los directivos del ensamblador.

Directivos de declaración de secciones


Tipo Nombre por Descripción
defecto
CODE .code Esta sección contendrá código. El resto de secciones sólo datos.
IDATA. .idata Esta sección contendrá variables inicializadas.
UDATA .udata Esta sección contendrá variables no inicializadas.
UDATA_ACS. .udata_acs Esta sección contendrá variables accesibles de forma más rápida.
UDATA_OVR. .udata_ovr Esta sección contendrá variables temporales sobreescribibles.
UDATA_SHR. .udata_shr Esta sección contendrá variables accesibles en varios bancos.
Tabla 5 Directivos de declaración de secciones.

CBLOCK
CBLOCK [<expresión>]
<NomVar>[:<incremento>][,<NomVar>[:<incremento>][, ...]]
ENDC

Var1 EQU 0x20


Var2 EQU 0x21
Var3 EQU 0x22

CBLOCK 0x20
Var1, Var2, Var3
ENDC

CBLOCK 0x30
DobleByte:0, DobleByteAlto, DobleByteBajo
Nombre: TAM_NOMBRE
Word1:2, Word2: 2
Var1, Var2, Var3
ENDC

RES
[<NomVar>] RES <Unidades_de_memoria>.
UDATA
ValorActual RES 1
Aux1 RES 1
Aux2 RES 2
Aux3 RES 1
Microcontroladores Versión 1.41 29 oct. 05 pág. 12

INCLUDE
INCLUDE <Fichero_a_incluir>

LIST
LIST [<opción>, ... , <Opción>]

Opción Valor por defecto Descripción


n=nnn 60 Líneas por página de listado
p=<tipo> Ninguno Selecciona procesador
r=<radix> hex Selecciona radix (hex, dec, oct)
.....

LIST p=16F877, r=dec

ORG
[Etiqueta] ORG <expresión>

ORG 0x20

EQU
<NomVar> EQU 0x20

#DEFINE
#define <nombre> [<cadena_de _caracteres>]

#define TAM_NOMBRE 0x20


#define BitControl 0x19,7
.....
bsf BitControl ; Equivale a bsf 0x19, 7
EXTERN <Etiqueta> [, <Etiqueta> ... ]

EXTERN Var1
.......
MOVF Var1, W

GLOBAL
GLOBAL <Etiqueta> [, <Etiqueta> ... ]

UDATA
Var1 RES 1
Var2 RES 2
GLOBAL Var1, Var2

END
Debe colocarse siempre al final del programa o del módulo

Operador $
Se sustituye por la dirección de la línea en la que se encuentra

goto $ ; Bucle infinito

btfsc FILE, BIT


goto $-1 ;No se sale de este bucle hasta que BIT=0
Microcontroladores Versión 1.41 29 oct. 05 pág. 13

Programa Display.ASM (Programa absoluto)


; Programa: Disp1.ASM
list p=16f877 ; Indicamos cual va a ser el procesador destino
#include p16f877.inc ; Define gran cantidad de constantes relacionadas
; con este procesador
CBLOCK 0X20
ValorActual, Aux1, Aux2, Aux3
ENDC

ORG 0
goto Inicio
ORG 0x10
Inicio
; En primer lugar inicializaremos el puerto C para que configure todas sus líneas
; como salidas. Se supone que a este puerto se han conectado los siete segmentos
;de un display
; Inicializamos las variables
clrf ValorActual

; Configuramos los bits del puertoC como salidas


BANKSEL TRISC
clrf TRISC ; Configurar pines de PORTC como salidas
clrf STATUS ; Apuntamos a la página 0
Bucle ; Comienzo del bucle principal
movf ValorActual, W ; Muevo ValorActual a W
call hex27seg ; Llamamos a rutina de conversión
movwf PORTC ; ponemos resultado en PORTC (el display)
incf ValorActual, F ; Incrementamos el valor para la siguiente
btfsc ValorActual, 4 ; iteración, y si se activa el bit 4, hemos
clrf ValorActual ; llegado a 10H, y reseteamos la variable.

movlw 8 ; Inicializamos Aux1 a 8 para conseguir


movwf Aux1 ; una espera algo mayor que 1 segundo.
Espera
call Espera1 ; Rutina con un retardo de 0,13 seg. Aprox.
decfsz Aux1, F
goto Espera
goto Bucle ; Retornar al bucle principal
;*******************************
Espera1
;*******************************
; Realiza 256 llamadas a la rutina Espera2

movlw 0xff
movwf Aux2
Bucle1
call Espera2
decfsz Aux2, F
goto Bucle1
return
;*******************************
Espera2
;*******************************
; Recorre 256 veces el bucle Bucle2.
movlw 0xff
movwf Aux3
Bucle2
decfsz Aux3, F
goto Bucle2
return
Microcontroladores Versión 1.41 29 oct. 05 pág. 14

;****************************************
hex27seg
;****************************************
; Subrutina hex27seg, que recibe un valor hexadecimal de un dígito en W,
; y devuelve en el mismo registro el valor correspondiente al de un
; display de 7 segmentos.
; A continuación se muestra el nombre de cada segmento en un Display
; -----
; | a |
; f| |b
; | |
; -----
; | g |
; e| |c
; | |
; -----
; d
; Se asignará el bit 7 al segmento 'a', el 6 al 'b', ... , el 1 al 'g'
; El bit 0 queda sin asignar. Se puede usar para el punto digital del display
; Los segmentos a iluminar para cada dígito son:
; Bits 7,6,5,4,3,2,1,0 Valor binario
; ==== =============== =============
; 0 = a,b,c,d,e,f B'11111100'
; 1 = b,c B'01100000'
; 2 = a,b, d,e, g B'11011010'
; 3 = a,b,c,d, g B'11110010'
; 4 = b,c, f,g B'01100110'
; 5 = a, c,d, f,g B'10110110'
; 6 = a, c,d,e,f,g B'10111110'
; 7 = a,b,c B'11100000'
; 8 = a,b,c,d,e,f,g B'11111110'
; 9 = a,b,c, f,g B'11100110'
; A = a,b,c, e,f,g B'11101110'
; B = c,d,e,f,g B'00111110'
; C = a, d,e,f B'10011100'
; D = b,c,d,e, g B'01111010'
; E = a, d,e,f,g B'10011110'
; F = a, e,f,g B'10001110'
ANDLW B'00001111'
ADDWF PCL, F
retlw B'11111100'
retlw B'01100000'
retlw B'11011010'
retlw B'11110010'
retlw B'01100110'
retlw B'10110110'
retlw B'10111110'
retlw B'11100000'
retlw B'11111110'
retlw B'11100110'
retlw B'11101110'
retlw B'00111110'
retlw B'10011100'
retlw B'01111010'
retlw B'10011110'
retlw B'10001110'
end
Microcontroladores Versión 1.41 29 oct. 05 pág. 15

Módulo CONTAR.ASM (Programa reubicable)


; Programa: CONTAR.ASM
;
list p=16f877 ; Indicamos cual va a ser el procesador destino
#include p16f877.inc ; Define gran cantidad de constantes relacionadas
; con este procesador
UDATA
ValorActual RES 1
Aux1 RES 1
Aux2 RES 1
Aux3 RES 1

STARTUP CODE ; Selecciona la dirección de reset desde el script 16F877.lkr


goto Inicio
PROG1 CODE ; Selecc la dir inic del programa desde el script 16F877.lkr
extern hex27seg

Inicio
; En primer lugar inicializaremos el puerto C para que configure todas sus líneas
; como salidas. Se supone que a este puerto se han conectado los siete segmentos
; de un display

; Inicializamos las variables


clrf ValorActual

; Configuramos los bits del puertoC como salidas


BANKSEL TRISC
clrf TRISC ; Configurar pines de PORTC como salidas

Bucle
BANKSEL ValorActual
movf ValorActual, W ; Muevo ValorActual a W
call hex27seg ; Llamamos a rutina de conversión
BANKSEL PORTC
movwf PORTC ; ponemos resultado en PORTC (el display)
BANKSEL ValorActual
incf ValorActual, F ; Incrementamos el valor para la siguiente
btfsc ValorActual, 4 ; iteración, y si se activa el bit 4, hemos
clrf ValorActual ; llegado a 10H, y reseteamos la variable.
movlw 8 ; Inicializamos Aux1 a 8 para conseguir
movwf Aux1 ; una espera algo mayor que 1 segundo.
Espera
call Espera1 ; Rutina con un retardo de 0,13 seg. Aprox.
decfsz Aux1, F
goto Espera
goto Bucle ; Retornar al bucle principal
Microcontroladores Versión 1.41 29 oct. 05 pág. 16

;*******************************
Espera1
;*******************************
; Realiza 256 llamadas a la rutina Espera2

movlw 0xFF
movwf Aux2
Bucle1
call Espera2
decfsz Aux2, F
goto Bucle1
return
;*******************************
Espera2
;*******************************
; Recorre 256 veces el bucle Bucle2.
movlw 0xFF
movwf Aux3
Bucle2
decfsz Aux3, F
goto Bucle2
return

end
Microcontroladores Versión 1.41 29 oct. 05 pág. 17

Módulo Display.ASM
; Módulo Display.asm. Presenta la subrutina hex27seg, que recibe
; un valor hexadecimal de un dígito, y devuelve el valor correspondiente
; al de un display de 7 segmentos.
; A continuación se muestra el nombre de cada segmento en un Display
; -----
; | a |
; f| |b
; | |
; -----
; | g |
; e| |c
; | |
; -----
; d
; Se asignará el bit 7 al segmento 'a', el 6 al 'b', ... , el 1 al 'g'
; El bit 0 queda sin asignar. Se puede usar para el punto digital del display
; Los segmentos a iluminar para cada dígito son:
; Bits 7,6,5,4,3,2,1,0 Valor binario
; ==== =============== =============
; 0 = a,b,c,d,e,f B'11111100'
; 1 = b,c B'01100000'
; 2 = a,b, d,e, g B'11011010'
; 3 = a,b,c,d, g B'11110010'
; 4 = b,c, f,g B'01100110'
; 5 = a, c,d, f,g B'10110110'
; 6 = a, c,d,e,f,g B'10111110'
; 7 = a,b,c B'11100000'
; 8 = a,b,c,d,e,f,g B'11111110'
; 9 = a,b,c, f,g B'11100110'
; A = a,b,c, e,f,g B'11101110'
; B = c,d,e,f,g B'00111110'
; C = a, d,e,f B'10011100'
; D = b,c,d,e, g B'01111010'
; E = a, d,e,f,g B'10011110'
; F = a, e,f,g B'10001110'
W equ 0
F EQU 1
PCL EQU 2
CODE
hex27seg global hex27seg
ANDLW B'00001111'
ADDWF PCL, F
retlw B'11111100'
retlw B'01100000'
retlw B'11011010'
retlw B'11110010'
retlw B'01100110'
retlw B'10110110'
retlw B'10111110'
retlw B'11100000'
retlw B'11111110'
retlw B'11100110'
retlw B'11101110'
retlw B'00111110'
retlw B'10011100'
retlw B'01111010'
retlw B'10011110'
retlw B'10001110'
end
Microcontroladores Versión 1.41 29 oct. 05 pág. 18

Interrupciones.
Microcontroladores Versión 1.41 29 oct. 05 pág. 19

GIE PEIE T0IE INTE RBIE xxxIE Significado


0 X X X X X Todas las interrupciones deshabilitadas
1 0 X X X X Deshabilitadas las interrupciones de los periféricos
internos salvo Timer 0
1 1 X X X X Permitidas las interrupciones de los periféricos
internos. Hay un bit adicional para cada periférico.
1 X 0 X X X Deshabilitada Int. Timer 0
1 X 1 X X X Habilitada Int. Timer 0
1 X X 0 X X Deshabilitada Int. externa
1 X X 1 X X Habilitada Int. externa
1 X X X 0 X Deshabilitada Int. cambio líneas RB4,..,RB7
1 X X X 1 X Habilitada Int. cambio líneas RB4,..,RB7

Tabla 6 Bits de habilitación de interrupciones en INTCOM

Bit Reg. bit Activar interrupción si Flag Reg. bit


TMR1IE PIE1 0 Overflow en el Timer 1 TMR1IF PIR1 0
TMR2IE PIE1 1 Overflow en el Timer 2 TMR2IF PIR1 1
CCP1IE PIE1 2 Captura o Comparación en CCP1 CCP1IF PIR1 2
SSPIE PIE1 3 Byte recibido o transmitido por el puerto serie síncrono SSPIF PIR1 3
TXIE PIE1 4 Byte transmitido por la USART TXIF PIR1 4
RCIE PIE1 5 Byte recibido por la USART RCIF PIR1 5
ADIE PIE1 6 Finalizada conversión por el conversor A/D ADIF PIR1 6
PSPIE PIE1 7 Byte recibido o transmitido por el puerto paralelo esclavo PSPIF PIR1 7
CCP2IE PIE2 0 Captura o Comparación en CCP2 CCP2IF PIR2 0
BCLIE PIE2 3 Colisión en el bus I2C BCLIF PIR2 3
EEIE PIE2 4 Fin de operación de escritura en la EEPROM EEIF PIR2 4

Tabla 7 Bits de habilitación de interrupciones para periféricos y flags activados.

Proceso para atención de interrupciones


1º Cuando se produce un evento susceptible de generar una interrupción, se activa el xxIF correspondiente. Si dicho
bit estaba a 0 y se produce la transición a 1 se comprueba si su bit xxIE vale 1. Si es así y el bit GIE=1 (y el PEIE
para los periféricos también) se lanza la petición de interrupción a la Unidad de Control que termina de ejecutar la
instrucción en curso y realiza estas tres transferencias:
§ 0 -->GIE
§ Dir. retorno --> Pila
§ 4--> Program Counter

La rutina debe:

1º Salvar en algún registro reservado al efecto el contenido del registro de Status y el acumulador.
2º Haciendo polling se detecta cual ha sido la fuente de la interrupción.
3º Ejecutar la rutina de atención a la interrupción.
4º Desactivar el flag correspondiente a esa interrupción
5º Ejecutar la instrucción RETFIE de retorno de interrupción y que reactiva GIE.
Microcontroladores Versión 1.41 29 oct. 05 pág. 20

Plantilla de programa absoluto con atención a interrupciones.


list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC &
_WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF

;***** VARIABLE DEFINITIONS


w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
;*********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program

ORG 0x004 ; interrupt vector location


movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register

CLRF STATUS ; Bank0


BTFSC PIR1, TMR1IF ; Timer1 overflow interrupt?
GOTO T1_INT ; YES
BTFSC PIR1, ADIF ; NO, A/D interrupt?
GOTO AD_INT ; YES, do A/D thing
: ;
: ;
BTFSC INTCON, RBIF ; NO, Change on PORTB interrupt?
GOTO PORTB_INT ; YES, Do PortB Change thing

INT_ERROR_LP1 ; NO, do error recovery


GOTO INT_ERROR_LP1 ; This is the trap if you enter the ISR
; but there were no expected
; interrupts

END_ISR movf status_temp,w ; retrieve copy of STATUS register


movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
T1_INT ; Routine when the Timer1 overflows
: ;
BCF PIR1, TMR1IF ; Clear the Timer1 overflow interrupt flag
GOTO END_ISR ; Ready to leave ISR (for this request)
AD_INT ; Routine when the A/D completes
: ;
BCF PIR1, ADIF ; Clear the A/D interrupt flag
GOTO END_ISR ; Ready to leave ISR (for this request)
: ;
PORTB_INT ; Routine when PortB has a change
: ;
GOTO END_ISR ; Ready to leave ISR (for this request)

main

; remaining code goes here

END ; directive 'end of program'


Microcontroladores Versión 1.41 29 oct. 05 pág. 21

Reset.
Coloca a la CPU en un estado conocido.
Causas:
· Power On Reset POR.
· Brown-out Reset.
· MCLR en estado normal.
· WDT en estado normal.
· MCLR en estado SLEEP.
· WDT en estado SLEEP.

Power On Reset

Power-up Timer (PWRT)


Oscillator Start-up Timer (OST)
Microcontroladores Versión 1.41 29 oct. 05 pág. 22

PCON STATUS
Significado
POR BOR TO PD
0 X 1 1 Power-on Reset
0 X 0 X Estado incorrecto
0 X X 0 Estado incorrecto
1 0 1 1 Brown-out Reset
1 1 0 1 WDT reset during normal operation
1 1 0 0 WDT Wake-up. No reinicia el PC
1 1 u u
MCLR reset during normal operation
1 1 1 0
MCLR reset during SLEEP
Tabla 8 Bits indicativos de la última reinicialización

Necesidad de la puesta a '1' de todos los bits al arrancar.

Brown-out reset: Se produce al bajar la tensión de alimentación por debajo de un umbral (~4V.)

WDT:
· Timer que genera un reset al desbordarse.
· Usa una fuente de reloj interna.
· Puede definirse un valor para un postscaler, que permite definir diferentes tiempos.
· Instrucciones CLRWDT y SLEEP.

Existen tablas indicando como se inicializan los registros de la RAM con un reset, pero se distinguen básicamente
tres situaciones:
Reset generado por POR / BOR : Se inicializan prácticamente todos los registros.
Reset generado por MCLR /WDT: Se inicializan los registros de algunos periféricos y algunos básicos
como el contador de programa y parte del registro de flags.
Reset generado por MCLR /WDT mientras se estaba en modo SLEEP: Prácticamente ningún registro
cambia su contenido.

Modo Sleep
Detiene a la CPU. Principal ventaja: el consumo de la CPU se reduce a niveles muy bajos.
Se despierta mediante:
· Activación de MCLR
· Activación de INT, RB4..RB7 y algunas interrupciones asociadas a periféricos internos.
· Desbordamiento del WDT

Reloj.
Los circuitos para generar la señal de reloj se encuentran dentro de la CPU. Estos circuitos necesitan algún
componente externo para fijar su frecuencia y modo de trabajo. El oscilador interno se tiene que configurar para
controlar adecuadamente los componentes externos, existiendo 4 posibilidades:

LP: Low Power Crystal (32KHz. - 400 KHz.)


XT: Crystal/Resonator (400 KHz. - 4 MHz.)
HS: High Speed Crystal Resonator (2 MHz. - 20 MHz.)
RC: Resistor/Capacitor (hasta 4 MHz.)
Microcontroladores Versión 1.41 29 oct. 05 pág. 23

Modo Debug.
Algunos circuitos permiten la depuración del programa sobre el propio chip (ICD In Circuit Debugging). Cuando
esta capacidad está desactivada el microcontrolador funciona de forma autónoma como cualquier MCU estándar.
Cuando esta capacidad está activada el microcontrolador debe estar conectado a un dispositivo (con las líneas RB6 y
RB7) que controla e inspecciona la evolución del programa. En este caso podemos ejecutar el programa paso a paso,
insertar un breakpoint, inspeccionar o modificar el contenido de la memoria, ... También se reservan algunos
recursos. Para el 16F877 se reserva:
- Las líneas RB6 y RB7 a través de las cuales se comunica con el host.
- 1 nivel de la pila.
- Dirección 0 del programa debería contener la instrciión NOP.
- Últimas 100H direcciones de la memoria de programa.
- Direcciones 0x70 y 0x1EB a 0x1EF de la memoria de datos.

Bits de Configuración.
A partir de la dirección 0x1FFF de la memoria de programa, se dispone de 8 palabras extras. Estas direcciones no
son accesibles desde el programa o la aplicación, pero si pueden ser accedidas en el proceso de grabación.
Las 4 primeras words (0x2000 a 0x2003) se denominan ID Location, sirve para almacenar un nº de serie, o un nº de
versión de software instalada, etc. La dirección 0x2006 es de sólo lectura y tiene un identificador del modelo de
microcontrolador.
La siguiente word (0x2007) , es la palabra de configuración, sus bits tiene los siguiente significados:

Bits 13-12 y 5-4: Están relacionados con varios niveles de protección de nuestro SW.
Bit 11: DEBUG. Si vale 0 se desactiva el modo ICD, y RB6 y RB/ quedan como líneas I/O estándar.
Bit 9: WRT. Permite o no, escribir en la memoria Flash de programa.
Bit 8. CPD Protección de los datos de la EEPROM.
Bit 7: LVP. Permite la grabación a bajo voltaje.
Bit 6: BODEN. Habilita el control del Brown-out.
Bit 3. PWRT . Permite activar o desactivar el Power-up Timer.
Bit 2: WDTE. Permite activar o desactivar el Watch Dog.
Bit 1- 0. Selección de tipo de generador de reloj:

Uso de directivos de configuración:

__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON &
_LVP_ON & _DEBUG_OFF & _CPD_OFF

__IDLOCS H'1234', H'3456'

Constantes predefinidas en el fichero 16F877.INC

_CP_ALL EQU H'0FCF' _BODEN_ON EQU H'3FFF'


_CP_HALF EQU H'1FDF' _BODEN_OFF EQU H'3FBF'
_CP_UPPER_256 EQU H'2FEF' _PWRTE_OFF EQU H'3FFF'
_CP_OFF EQU H'3FFF' _PWRTE_ON EQU H'3FF7'
_DEBUG_ON EQU H'37FF' _WDT_ON EQU H'3FFF'
_DEBUG_OFF EQU H'3FFF' _WDT_OFF EQU H'3FFB'
_WRT_ENABLE_ON EQU H'3FFF' _LP_OSC EQU H'3FFC'
_WRT_ENABLE_OFF EQU H'3DFF' _XT_OSC EQU H'3FFD'
_CPD_ON EQU H'3EFF' _HS_OSC EQU H'3FFE'
_CPD_OFF EQU H'3FFF' _RC_OSC EQU H'3FFF'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
Microcontroladores Versión 1.41 29 oct. 05 pág. 24

Periféricos 16F877
· Puertos programables de E/S
· Timers/Counters
· Puertos de captura/comparación de datos
· Moduladores de ancho de pulso (PWM)
· Conversor Analógico/Digital de 10 bits
· Puerto serie síncrono
· USART
· Parallel Slave Port

Circuito de 40 pines en formato.


Salvo 7 pines, todos los demás están asociados al menos con los puertos de E/S.
Los 7 pines son:
· 4 pines para alimentación, están duplicados.
· 1 pin para MCLR y Vpp que es una tensión de 12 a 14 V. usada cuando está en modo programación.
· 2 pines relacionados con entradas o salidas de reloj, en función del tipo de reloj utilizado.
Microcontroladores Versión 1.41 29 oct. 05 pág. 25

Puertos programables de E/S.


Disponemos de hasta 33 pines. A medida que se usan otros periféricos internos se detraen pines de E/S
Las principales características son:

· Programables como entradas o salidas individualmente.


· Capaces de trabajar con corrientes de 25 mA. en cada línea. No obstante la corriente total en los puertos A,
B y E no puede superar los 200 mA. y en los puertos C y D otros 200 mA.
· Entradas tipo TTL o ST (Schmitt Trigger).
· Resistencias Pull-up (habilitables por programa) en el puerto B

Las líneas de E/S están agrupadas en 5 puertos: A (6 bits), B (8 bits), C (8 bits), D (8 bits) y E (3 bits).

Cada puerto de E/S tiene asociados dos registros TRISX y PORTX. El primer registro dispone de un bit por cada
línea del puerto, y controlará si funciona como entrada (Input, 1) o como salida (Output, 0).
El segundo registro nos permite acceder al puerto. Con una escritura se modifican los bits configurados como salida,
y con una lectura accedemos tanto a los de entrada como a los de salida. Si se realiza una escritura y de forma
inmediata una lectura, puede que la salida no haya alcanzado el nivel adecuado generando incoherencias.

El puerto A tiene todas sus salidas Totem pole, excepto la RA4 que es del tipo Open collector (open drain de forma
más exacta) lo que obliga a poner una resistencia de Pull Up para poder obtener '1'. Además después de un reset las
líneas del puerto A están configuradas como entradas analógicas (como digitales devuelven '0'). Escribiendo el valor
6 en el registro ADCON1 se pueden convertir en entradas digitales.

El puerto B dispone de resistencias Pull-up que pueden activarse por software cuando funcionan como entradas. La
activación se realiza con el bit RBPU (bit 7) del registro OPTION_REG (direcciones 81h y 181h).

Además la línea RB0 puede funcionar como entrada de petición de interrupción. Para ello se debe activar el bit
INTE (bit 4) del registro INTCON (direcciones 0Bh, 8Bh, 10Bh y 18Bh). Con el bit INTDEG (bit 6) de
OPTION_REG (direcciones 81h y 181h) se selecciona si se activa la interrupción con flanco de subida (1) o de
bajada (0).

Los puertos A y B cuando se configuran como entradas, trabaja con niveles TTL (salvo la línea RA4) y los puertos
C, D y E como Schmitt Trigger (también RA4).

TTL: VIL = 0,8 V., VIH = 2 V.


ST: VIL = 1 V., VIH = 4 V. Permite cambios de tensión lentos en su entrada.
Microcontroladores Versión 1.41 29 oct. 05 pág. 26

Timers
Disponemos de 3 timers numerados del 0 al 2 y del Watch Dog Timer.

Timer0

Timer de 8 bits Puede ser leído y escrito a través del registro TMR0 (direcciones 1 y 101h)
La entrada de reloj del temporizador puede seleccionarse que sea interna o externa.
Interna: Frecuencia de reloj CPU dividida por 4.
Externa: Entrada RA4/T0CKI
Bit T0CS (bit 5) del OPTION_REG (direcciones 81h y 181h). 0 = reloj interno, 1 = reloj externo. Si se usa un reloj
externo, su frecuencia como máximo será la mitad de la frecuencia de la entrada de reloj de la CPU.

Si se selecciona el reloj externo, se puede utilizar como contador de pulsos en dicha entrada. En este caso se puede
seleccionar si se activa la entrada por flanco de subida o de bajada: T0SE (bit 5) del OPTION_REG (direcciones
81h y 181h). 0 = flanco de subida, 1 = flanco de bajada.

A este timer se le puede asociar un circuito divisor de la frecuencia de la entrada de reloj. Se le denomina Prescaler.
Este circuito puede ser utilizado también por el Watch dog. En cualquier caso debe ser asignado a uno u otro. esto es
seleccionado por el bit PSA (bit 3) del OPTION_REG (direcciones 81h y 181h). 0 = Timer 0, 1 = Watch dog.
También es posible seleccionar el factor de división. Se dispone de tres bits: PS2, PS1 y PS0, (bits 2, 1 y 0) del
OPTION_REG (direcciones 81h y 181h) que introducen los factores de división que se muestran en la siguiente
tabla:

Bits PS Timer0 Watch dog


000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

Finalmente existen los dos bits mencionados en las interrupciones que permiten generar una interrupción cada vez
que se desborda el Timer0 cuando pasa de FFH a 0. Son los bits T0IE y T0IF del registro INTCON.

Watch dog Timer

Este módulo permite inicializar la CPU cuando se rebasa el contador. Se activa por medio de los bits de
configuración del microcontrolador (en tiempo de programación del chip) y permite recupera el sistema cuando se
pierde el control del programa. El período con un valor de prescaler 1:1 oscila entre 7 y 33 mS. con un valor típico
de 18 mS. Esta tolerancia es debida a la imprecisión del oscilador interno que depende de la temperatura y la tensión
de alimentación básicamente. Este período se puede ampliar con el prescaler hasta un factor de 1:128.
Microcontroladores Versión 1.41 29 oct. 05 pág. 27

Timer1

Timer de 16 bits Puede ser leído y escrito a través de los registros TMR1H y TMR1L.

La entrada de reloj del temporizador puede seleccionarse que sea interna o externa.
Interna: Frecuencia de reloj CPU dividida por 4.
Externa: Entradas RC1/T1OSICCP2 y RC0/T1OSO/T1CKI
Bit TMR1CS (T1CON<1>). 0 = reloj interno, 1 = reloj externo. Si se usa un reloj externo, su frecuencia como
máximo será la mitad de la frecuencia de la entrada de reloj de la CPU.
También con reloj externo existen dos alternativas, colocar un cristal como fuente de reloj (hasta 200 KHz) o utilizar
una señal digital. En el segundo caso solo se utiliza la línea de entrada RC0/T1OSO/T1CKI. Para seleccionar una
alternativa u otra, se dispone del bit T1OSCEN (T1CON<3>). Si vale 1 se usará el cristal activando el oscilador
interno, si vale 0 se usan pulsos generados externamente. En este caso puede funcionar como contador de pulsos.

Además se dispone de un bit que permite activar y desactivar el Timer: TMR1ON (T1CON<0>)

El timer dispone de un prescaler controlado por los bits T1CKPS1 y T1CKPS0 (T1CON<5:4>) cuyos factores de
división que se muestran en la siguiente tabla:

Bits Timer1
T1CKPS
00 1:1
01 1:2
10 1:4
11 1:8

Finalmente existen los dos bits mencionados en las interrupciones que permiten generar una interrupción cada vez
que se desborda el Timer1 cuando pasa de FFFFH a 0. Son los bits TMR1IE y TMR1IF necesitando además que
estén activados los bits que habilitan las interrupciones de los periféricos (PEIE) y el general (GIE).
Microcontroladores Versión 1.41 29 oct. 05 pág. 28

Timer2

Timer de 8 bits Puede ser leído y escrito a través del registro TMR2.

La entrada de reloj del temporizador es interna, concretamente la frecuencia de reloj CPU dividida por 4.

Se dispone de un bit que permite activar y desactivar el Timer: TMR2ON (T2CON<2>)

El timer dispone de un prescaler controlado por los bits T2CKPS1 y T2CKPS0 (T2CON<1:0>) cuyos factores de
división que se muestran en la siguiente tabla:

Bits Timer2
T2CKPS
00 1:1
01 1:4
1x 1:16

La salida del contador puede ser conectada a un postscaler, que dispone de 4 bits de control T2OUTPS3:T2OUTPS0
cuya salida pasa a controlar el flag de interrupción asociado a este Timer. Los factores de división se muestran en la
siguiente tabla:

Bits Salida de
T2OUTPS interrupción
0000 1:1
0001 1:2
0010 1:3
. .
. .
. .
1101 1:14
1110 1:15
1111 1:16

Finalmente existen los dos bits mencionados en las interrupciones que permiten generar una interrupción cada vez
que se desborda el Timer2 cuando pasa de FFH a 0. Son los bits TMR2IE y TMR2IF necesitando además que estén
activados los bits que habilitan las interrupciones de los periféricos (PEIE) y el general (GIE).
Microcontroladores Versión 1.41 29 oct. 05 pág. 29

CAPTURE/COMPARE/PWM
Módulos de captura, comparación y modulación por ancho de pulso.

Existen dos módulos de este tipo: CCP1 y CCP2 cuyo funcionamiento es prácticamente idéntico diferenciándose en
que el CCP2 podrá comenzar una conversión en el módulo A/D.

Ambos módulos son de 16 bits, y están estrechamente relacionados con el Timer1.

Modo captura. En este modo, el módulo CCPx captura el contenido del Timer1 cuando se produce un evento. Los
eventos posibles, se refieren a los cambios en las entradas RC1/T1OSI/CCP2 ó RC2/CCP1 y se distinguen las
siguientes situaciones:

· Un flanco de bajada.
· Un flanco de subida.
· Cada 4 flancos de subida.
· Cada 16 flancos de subida.

En este modo se pueden calcular intervalos de tiempo entre dos sucesos de forma muy exacta. Si se han activado las
interrupciones, se generará una por cada captura realizada.

Modo comparación. En este modo, el módulo CCPx comparará el contenido de los registros de 16 bits del módulo
con el Timer1, de tal manera que cuando se produzca una coincidencia, se producirá la interrupción correspondiente
cuando las interrupciones estén activadas y podrá hacerse que las líneas asociadas RC1/T1OSI/CCP2 ó RC2/CCP1
se pongan a nivel alto, bajo o no cambien. Finalmente resetearán el Timer1 y en el caso del CCP2 además se lanzará
una conversión A/D si el conversor está activado (permite hacer muestreos periódicos)

Modo PWM. En este caso se produce una salida PWM en el puerto CCPx, con una resolución de 10 bits.
Una señal PWM señal con onda rectangular de frecuencia fija, en la que se puede variar el tiempo en el que la
misma permanece a 0 o a 1. Sustituye en la mayoría de los casos a un conversor D/A. La frecuencia de la señal se
establece por medio del Timer2 y el tiempo que permanece a 1 (Duty cycle) se controla por medio de los registros
del CCP que se esté utilizando.
Microcontroladores Versión 1.41 29 oct. 05 pág. 30

Master Synchronous Serial Port


Este módulo implementa un interfaz de comunicaciones en serie. Existen multitud de dispositivos que permiten este
tipo de comunicación, tales como memorias EEPROM, conversores A/D, sensores de diferentes tipos (temperatura,
posición, distancia, ...), displays, otros microcontroladores, ...
El módulo puede operar en dos modos: SPI e I2C.

SPI: Serial Peripheral Interface. Este interface suele ser utilizado para comunicar dos dispositivos entre si, uno se
configura como master y el otro como esclavo. En este interface se definen las líneas:

· Serial Data Out (SDO)


· Serial Date In (SDI)
· Serial Clock (SCK)
Adicionalmente se puede usar un cuarto pin en modo esclavo.
· Slave Select ( SS )

Permite velocidades de hasta 8 Mbps con reloj a 20 MHz. El master inicia las transferencias activando la línea SCK,
el esclavo recibe y transmite información cuando detecta que la línea SCK se activa. Cada vez que recibe un byte, en
modo esclavo, se puede activar la interrupción correspondiente.

I2C: Inter-Integrated Circuit. Permite la interconexión de múltiples dispositivos formando un bus. A cada dispositivo
se le asigna una dirección y las tramas que se envían por el bus llevan direccionamiento para identificar los actores
de la misma. En general se configura un dispositivo como master y el resto como esclavos, no obstante, se permiten
buses multi-master, en este caso se dispone de mecanismos de detección de colisiones y gestión (arbitration) del
Bus. se pueden alcanzar velocidades de 1 Mbps, y conectar hasta 128 o 1.024 dispositivos en función del tipo de
direccionamiento utilizado..

Addressable Universal Synchronous Asynchronous Receiver


Transmitter (USART).
Este módulo implementa el popular interface de comunicaciones serie que tienen incluido gran cantidad de
ordenadores. Permite comunicación serie entre dos dispositivos, y en algunos modos de funcionamiento, permite la
conexión de más de dos dispositivos incluyendo 9 bits de direccionamiento (512 dispositivos).
Microcontroladores Versión 1.41 29 oct. 05 pág. 31

Analog/Digital Converter.
Este módulo permite la conexión de entradas analógicas para convertirlas en valores discretos obteniendo su valor.
El valor mínimo de una entrada es 0 y aparece si la tensión de esa entrada es menor o igual a VREF-. El valor
máximo es 1.023 (3FFH) si la tensión es mayor o igual que VREF+. Cualquier voltaje intermedio producirá un valor
proporcional al mism0 en el rango de 1 a 1.022. Aunque se dispone de un único conversor, el microcontrolador tiene
un multiplexor analógico que permite la conexión de hasta ocho entradas.

Para su uso se dispone de 4 registros de 8 bits: ADRESH, ADRESL, ADCON0 y ADCON1.

Los dos primeros son: ADRESH y ADRESL (parte alta y parte baja del resultado de la conversión AD) contendrán
el resultado de la última conversión. Se usan dos registros porque el conversor tiene una resolución de 10 bits. Si
ocho bits fueran suficientes para una aplicación determinada, se puede indicar al conversor que entregue el resultado
justificado a la izquierda y nos quedamos con el contenido de ADRESH.

Registros ADCON0 y ADCON1 (Registros de control del conversor). ADCON1 suele usarse en la parte de
inicialización del programa para asignar la función que debe corresponder a cada una de las posibles entradas
analógicas. ADCON0 debe ser accedido antes de cada conversión.

El bit de mayor peso de ADCON1 (ADFM) permite decidir si el resultado queda alineado a la izquierda (0) o a la
derecha (1).

ADRESH ADRESL
0 0 0 0 0 0 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0

Registros ADRESH y ADRESL con el resultado justificado a la derecha

ADRESH ADRESL
b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 0 0 0 0 0 0

Registros ADRESH y ADRESL con el resultado justificado a la izquierda


Microcontroladores Versión 1.41 29 oct. 05 pág. 32

Los cuatro de menor peso (PCFG3 al PCFG0) se usan según la siguiente tabla:

PCFG3: AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF- CHAN/
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 Refs
0000 A A A A A A A A VDD VSS 8/0
0001 A A A A VREF+ A A A RA3 VSS 7/1
0010 D D D A A A A A VDD VSS 5/0
0011 D D D A VREF+ A A A RA3 VSS 4/1
0100 D D D D A D A A VDD VSS 3/0
0101 D D D D VREF+ D A A RA3 VSS 2/1
011x D D D D D D D D VDD VSS 0/0
1000 A A A A VREF+ VREF- A A RA3 RA2 6/2
1001 D D A A A A A A VDD VSS 6/0
1010 D D A A VREF+ A A A RA3 VSS 5/1
1011 D D A A VREF+ VREF- A A RA3 RA2 4/2
1100 D D D A VREF+ VREF- A A RA3 RA2 3/2
1101 D D D D VREF+ VREF- A A RA3 RA2 2/2
1110 D D D D D D D A VDD VSS 1/0
1111 D D D D VREF+ VREF- D A RA3 RA2 1/2

Esto permite que todas las entradas sean analógicas o digitales o algunas combinaciones de analógicas y digitales.
También permite definir que valores se usarán como VREF+ y VREF-.

Los dos bits de mayor peso de ADCON0 (ADCS1 y ADCS0) permiten seleccionar la fuente de reloj a utilizar. En
general este parámetro no es crítico. Seleccionar los valores 01 ó 10 permiten realizar conversiones rápidas y
precisas.
Los bits 3 .. 5 se corresponde con CHS0 .. CHS2. Con esas tres líneas se gobierna el MPX analógico, y por tanto la
entrada sobre la que se quiere hacer la conversión.
El bit de menos peso (ADON) permite conectar o desconectar el conversor. Tenerlo desconectado permite reducir el
consumo del microcontrolador.
Finalmente el bit 2 GO/ DONE permite lanzar el proceso de conversión poniendo esta línea a 1, y comprobar si la
conversión ha finalizado.

Existen básicamente dos maneras de detectar cuando ha finalizado. Por interrupciones o por sondeo (polling). Si se
activan los bits de interrupción correspondientes (ADIE, PIE y GIE y se pone a 0 ADIF), se producirá una
interrupción cuando acabe la conversión en marcha, activando el ADIF.

Por sondeo el método es el siguiente: Activar el bit GO/ DONE y entrar en un bucle en el que se comprueba este
mismo bit. Mientras valga 1 la conversión está en curso. Cuando pasa a 0 la conversión finalizó y el resultado se
encuentra en los registros ADRESH y L.
Microcontroladores Versión 1.41 29 oct. 05 pág. 33

Microcontrolador 16F876
El 16F876 contiene el mismo núcleo que el 16F877, pero dispone de 28 pines, lo cual supone eliminar algunos de
los periféricos de los presentes en su hermano mayor.

Tal y como se muestra en la figura, se puede observar que carece de los puertos D (8 bits) y E (3 bits), y en cuanto a
periféricos, no existe el SPP (Slave Parallel Port) y el conversor A/D dispone de 5 entradas (frente a 8 del 16F877).
También se dispone de una entrada menos de alimentación (un único pin para VDD).
Microcontroladores Versión 1.41 29 oct. 05 pág. 34

Microcontrolador 16F84
El 16F84 es un microcontrolador de la gama media al igual que el 16F877 pero que carece de varios de los
periféricos de éste a cambio de ser un circuito más económico y más pequeño. Carece de conversor A/D, y dispone
de sólo 11 líneas de entrada salida.

Pines en el 16F84
Microcontroladores Versión 1.41 29 oct. 05 pág. 35

Electrónica

Componentes electrónicos

Resistencias
Pasivos Condensadores
Inductancias.

Componentes Diodos
electrónicos Transistores
Triacs
........ Reguladores de tensión
Activos Analógicos Amplificadores operacionales
..........
Circuitos
integrados Puertas
Multiplexores
Digitales Memoria
Microcontroladores
........

Resistencias
Resistencia eléctrica es la medida de la oposición que un material presenta al paso de la corriente eléctrica se mide
en ohmios. .
Una resistencia (también resistor) es un componente electrónico pasivo diseñado para introducir una resistencia
eléctrica determinada entre dos puntos de un circuito.
Los principales parámetros de un resistor son su resistencia y la potencia máxima que pueden disipar.

Fuente de alimentación

Esquema básico:

Transformador:
Microcontroladores Versión 1.41 29 oct. 05 pág. 36

Rectificador:

Media onda:

Onda completa con toma intermedia en transformador:

Onda completa sin toma intermedia en transformador:

Filtro:

Se construye con un condensador de alta capacidad entre la salida del rectificador y masa. Se recomiendan
capacidades de entre 2.000 y 5.000 mF por amperio que pueda proporcionar la F.A.
Microcontroladores Versión 1.41 29 oct. 05 pág. 37

A la salida del regulador se suelo poner otro condensador de filtro pero de una capacidad inferior (entre 100 nF. y 10
mF.)

Regulador:

La forma más simple utilizar reguladores integrados tales como la familia 78xx y 79xx.
Cortocircuitables.
Con protección térmica y contra sobrecargas.
Corrientes de hasta 1 A.

Dispositivos E/S
Interruptores/pulsadores:

Suelen utilizarse resistencias de Pull-up o Pull-down. Se debe disponer de un sistema de supresión de rebotes que
puede ser HW. (biestable, red RC, ...) o SW.

Teclados

También necesitan resistencias pull-up o Pull-down. Pueden conectarse de dos formas:

También es necesario resolver el problema de los rebotes.


Microcontroladores Versión 1.41 29 oct. 05 pág. 38

Otros dispositivos de entrada:

Existen múltiples dispositivos que permiten obtener información del 'exterior'. Sensores de temperatura, luz, presión,
y un largo etc. Es necesario acudir a los manuales de los fabricantes para conocer sus características, modo de
conexión, etc.

Un ejemplo de dispositivo es el CNY70, que contiene un emisor y un receptor de luz. Permite detectar por reflexión
de la luz, si está en la proximidad de un objeto de color claro.
Microcontroladores Versión 1.41 29 oct. 05 pág. 39

Dispositivos de salida:

Diodos LED

Funcionan a 1,8 V. 10-20 mA. Tienen polaridad

Displays 7 segmentos

Varios diodos LED agrupados con el ánodo o el cátodo común.


Microcontroladores Versión 1.41 29 oct. 05 pág. 40

Displays LCD
Microcontroladores Versión 1.41 29 oct. 05 pág. 41
Microcontroladores Versión 1.41 29 oct. 05 pág. 42
Microcontroladores Versión 1.41 29 oct. 05 pág. 43
Microcontroladores Versión 1.41 29 oct. 05 pág. 44

Transistores:
Existen enormes tratados sobre las diferentes maneras de conectar los transistores, y las diferentes formas en las que
pueden trabajar. Nosotros nos vamos a centrar en una forma de conectarlos (Emisor común) y dos zonas de trabajo
(corte y saturación). Trabajando en estas condiciones, son muy pocas las cosas que debemos tener en cuenta para
decidir que transistores utilizar y que componentes conectar asociados a los mismos.
Seleccionar un transistor: Los elementos a tener en cuenta son Ic, hFE y VCEO.

Ic: Define la máxima corriente que se puede controlar a partir de ese transistor. Será algo mayor que la corriente
máxima del circuito que vamos a conectar.
hFE: Define la ganancia. hFE = IC/IB. A partir de la ganancia, obtendremos la corriente que circulará por la Base, que
es la que suministraremos para activar el transistor.
VCEO Define la máxima diferencia de potencial entre colector y emisor, es decir la máxima tensión de trabajo.
Esquema básico:

IB es la corriente que suministrará nuestro circuito de control. Por ejemplo la salida máxima de un pin de I/O de un
PIC es de 25 mA: aunque no es conveniente llegar a las corrientes máximas.

La carga es el dispositivo que queremos controlar con el transistor: Un relé, un motor, una lámpara, ... Es importante
conocer la corriente máxima que circulará por el dispositivo, para seleccionar un transistor adecuado.

Transistores comerciales:

Existen miles de referencias diferentes. Mostraremos aquí solamente 4 referencias de transistores muy conocidos.
Microcontroladores Versión 1.41 29 oct. 05 pág. 45

BC107

Es un transistor de baja potencia. Su IC es de 100 mA, su hFE es 110 y VCEO es de 45 V. El transistor


complementario (mismas características salvo que es PNP, es el BC177).

Es muy adecuado para pequeñas cargas, tales como: el terminal común de un display de 7 segmentos, un relé, ...

Por ejemplo supongamos que se debe activar un relé de 12 V. 80 mA. desde un PIC. El circuito sería:

En el circuito vemos que la tensión aplicada al relé es de 12 V. mientras


que la que llega a RB es de 5 V. Esto no supone ningún problema
mientras no se sobrepasen los valores máximos del transistor (VCEO).

La IC será la del relé, es decir 80 mA. La ganacia del transistor es 110,


por lo que bastaría con una corriente de base IB = 80/110= 0,72 mA. No
obstante para asegurar que se entra en saturación vemos a hacer que IB=
1 mA. R=V/I, V=5V. - 0,7 V. (0,7 V. de la unión Base Emisor del
transistor). RB= 4,3/0,001=4300 W. El valor comercial más próximo por
debajo es 3.900 W

El diodo que aparece en el esquema, elimina los picos de tensión que


produce la bobina del relé al conectarla y desconectarla.

BD 139
Es un transistor de media potencia. Su IC es de 2 A, su hFE varía entre 25 y 60 en función de IC y VCEO es de 80 V.
El transistor complementario (mismas características salvo que es PNP, es el BD140).
Microcontroladores Versión 1.41 29 oct. 05 pág. 46

TIP122

Es un transistor de potencia darlington (dos transistores conevtados en cascada para aumentar la ganancia). Su IC es
de 5 A, su hFE es de 1.000 y VCEO es de 100 V. El transistor complementario (mismas características salvo que es
PNP, es el TIP 127).
Su elevada ganancia permite conectar la base al microcontrolador, y el colector a circuitos de elevada potencia, sin
ninguna etapa previa.

2N3055
Es un transistor de potencia. Su IC es de 15 A, su hFE varía entre 2 y 100 en función de IC y VCEO es de 60 V. El
transistor complementario (mismas características salvo que es PNP, es el MJ2955).
Microcontroladores Versión 1.41 29 oct. 05 pág. 47

TRIACS
Circuitos que pueden ser clasificados como relés para corriente alterna de estado sólido. Permiten conducir o
bloquear el paso de la corriente alterna.
Microcontroladores Versión 1.41 29 oct. 05 pág. 48

MOTORES

Motores CC

S1 S3

VCC

MOTOR

GND

S2 S4

ON OFF OFF ON IZQUIERDA


OFF ON ON OFF DERECHA
ON ON OFF OFF PARADO
OFF OFF ON ON PARADO
OFF OFF OFF OFF PARADO

Circuito L293

VCC T T L
EN1 1 16 Vcc TTL 1 L293B
IN1 IN4 O N/OFF 1 EN1
VCC
CO NT RO L 1 IN1 IN4 CON T ROL4
OUT1 OUT4
OUT 1 O UT 4
M OT O R 1 MO T OR 2
GND GND
GND G ND
GND GND GND
G ND
OUT2 OUT3
OUT 2 O UT 3
IN2 IN3 CO NT RO L2 CON T ROL3
IN2 IN 3
v+ motor 8 9 EN2 ON /O FF 2
v+ motor EN2

V+ MO T OR

CONTROL 1 CONTROL 2 ON / OFF 1 ESTADO MOTOR1


ON ON ON PARADO
ON OFF ON DERECHA
OFF ON ON IZQUIERDA
OFF OFF ON PARADO
X X OFF PARADO
Microcontroladores Versión 1.41 29 oct. 05 pág. 49

VCC TTL
1 L293B
ON/OFF 1 EN1
VCC
DIR1 IN1 IN4 DIR2
OUT1 OUT4
MOTOR 1 MOTOR 2
GND GND
GND
GND
OUT2 OUT3
IN2 IN3
ON/OFF 2
v+ motor EN2

V+ MOTOR

DIRECCIÓN 1 ON / OFF 1 ESTADO MOTOR 1


OFF ON IZQUIERDA
ON ON DERECHA
X OFF PARADO

Servocontrol

Discos/codificadores

Motores paso a paso

Motores Unipolares
Microcontroladores Versión 1.41 29 oct. 05 pág. 50

Motor Bipolar

Control de motores paso a paso

Motor Unipolar

A B C D S1 S2 S3 S4 CA CB CC CD
1 - - ON OFF ON OFF 1 0 1 0
2 - - OFF ON ON OFF 0 1 1 0
3 - - OFF ON OFF ON 0 1 0 1
4 - - ON OFF OFF ON 1 0 0 1

Motor bipolar

A B C D S1 S2 S3 S4 S5 S6 S7 S8 CA CB CC CD
1 - + - + OFF ON ON OFF OFF ON ON OFF 1 0 1 0
2 + - - + ON OFF OFF ON OFF ON ON OFF 0 1 1 0
3 + - + - ON OFF OFF ON ON OFF OFF ON 0 1 0 1
4 - + + - OFF ON ON OFF ON OFF OFF ON 1 0 0 1
Microcontroladores Versión 1.41 29 oct. 05 pág. 51

Circuitos específicos: SAA1027


+12 v
Reloj

N.C 1 16 N.C
B D
Reset Reset 2 15 Clock
Sentido Sentido 3 14 VCC 1
RX 4 13 VCC 2
GND GND 1 5 12 GND 2
A 6 11 D
A C
N.C 7 10 N.C
B 8 9 C

You might also like