Microcontrolador 16F877 - Ejemplos
Microcontrolador 16F877 - Ejemplos
Microcontrolador 16F877 - Ejemplos
INDICE
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
Registros Registros
de propósito de propósito
general general
96 bytes 80 bytes
Registro de estado
Registro de estado
7 0
IRP RP1 RP0 TO PD Z DC C
Direccionamiento Reset Flags ALU
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
Set de instrucciones.
Formato de una instrucción:
[etiqueta] mnemónico [operando1[, operando2]] [; comentario]
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
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
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
Proceso de ensamblado
CBLOCK
CBLOCK [<expresión>]
<NomVar>[:<incremento>][,<NomVar>[:<incremento>][, ...]]
ENDC
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>]
ORG
[Etiqueta] ORG <expresión>
ORG 0x20
EQU
<NomVar> EQU 0x20
#DEFINE
#define <nombre> [<cadena_de _caracteres>]
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
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
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
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
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
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
main
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
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
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:
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:
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON &
_LVP_ON & _DEBUG_OFF & _CPD_OFF
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
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).
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:
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.
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.
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.
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
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:
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..
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.
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
ADRESH ADRESL
b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 0 0 0 0 0 0
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:
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
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
Displays 7 segmentos
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 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:
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
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
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
Servocontrol
Discos/codificadores
Motores Unipolares
Microcontroladores Versión 1.41 29 oct. 05 pág. 50
Motor Bipolar
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
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