Documentos de Académico
Documentos de Profesional
Documentos de Cultura
En primer instancia a Jehová Dios por la vida y todo lo maravilloso que nos
permite disfrutar. A los profesores Antonio Pateti, y Rafael Surga por su asesoría y
asistencia técnica haciendo disponible valioso material de consulta útil para el
desarrollo de este trabajo. A Manuel Gragirena, Sergio Velazquez, y Zulay Franco,
quienes me orientaron y me apoyaron de diversas formas y contribuyeron a la
realización de este trabajo y especialmente a Jehová el Dios Todopoderoso por
permitirme ver un día más de vida.
DEDICATORIA ........................................................................................................................ii
PRÓLOGO............................................................................................................................. 1
CAPÍTULO I ........................................................................................................................... 4
CAPÍTULO II ........................................................................................................................ 36
3. INTERRUPCIONES ....................................................................................................... 44
CAPÍTULO IV....................................................................................................................... 57
CAPÍTULO V........................................................................................................................ 83
Aplicación 5.1 Uso del modo captura para medir periodo de señal externa ................ 85
Aplicación 5.2 Uso del modo comparación para generar señales periodicas ............... 89
Aplicación 6.1 Uso del ADC para controlar velocidad de motor DC por PWM ............ 109
Aplicación 6.2 Uso del ADC para medir temperatura usando el sensor LM35 ............ 113
Pág.
Tabla 1.1: Resumen comparativo entre PIC16F877 Vs PIC16F1787……..…….. 6
Tabla 2.1 Registros asociados al manejo de puertos E/S……..……..……..……. 38
Tabla 2.2 Configuración de registro para el manejo de puertos ……..…………. 41
Tabla 4:1 PS2:PS0: Valor con que se programa el divisor de frecuencia……….. 59
Tabla 5.1: Selección de operación del modo captura……..……..……..………... 84
Tabla 6.1: Selección del canal entrada positiva diferencial del ADC……..……... 103
Tabla 6.2 Selección del Periodo para el reloj del conversor AD……..………….. 103
Tabla 6.3 Selección para la Auto conversión del ADC……..……..……..……… 104
Tabla 6.4 Selección del Periodo para el reloj del conversor AD……..………….. 105
Tabla 7.1 Sumario de registrosasociados al modo de tranmisión asíncrono……. 123
Tabla 7.2 Formulas de rata de baudios……..………..…..……..……..…………. 128
Pág.
Fig. 1.1: Diagrama de distribución de pines……..……..……..……..……..…….. 5
Fig. 1.2: Arquitectura Von Neumann……..……..……..……..……..…………… 7
Fig. 1.3: Arquitectura Harvard……..……..……..……..……..……..……..…….. 7
Fig. 1.4: Diagrama de bloques 16f1787……..……..……..……..……..……..…….. 8
Fig. 1.5: Diagrama de bloques del núcleo del 16f1787……..……..……..………….. 9
Fig. 1.6: Organización de la memoria de programa……..……..……..………….. 10
Fig. 1.7: Organización de la memoria de programa……..……..……..………….. 12
Fig. 1.8: Direccionamiento de la memoria de programa……..……..……..…….. 13
Fig. 1.9: Registros Núcleo en la memoria de datos……..……..……..………….. 14
Fig. 1.10: Registros de propósitos especiales SFR……..……..……..…………… 15
Fig. 1.11: Direccionamiento tradicional de la memoria de datos……..……..……..… 17
Fig. 1.12: Direccionamiento lineal de la memoria de datos……..……..……..……. 18
Fig. 1.13: Debugger>Select Tool>MPLAB SIM……..……..……..……………… 19
Fig. 1.14: Herramientas de simulation……..……..……..……..……..……..……..… 20
Fig. 1.15: Para visualizer la memoria de programa……..……..……..…………… 20
Fig. 1.16: Despliegue de la memoria de programa……..……..……..…………… 21
Fig. 1.17: Vista de la memoria Ram de datos……..……..……..………………… 21
Fig. 1.18: Vista de la opción Watch……..……..……..……..……..……..……..…… 22
Fig. 1.19: Formato numérico disponible……..……..……..……..……..……..…….. 23
Fig. 1.20: Comprobación valor 4 en nible alto registro 0x20. Salto a resta………. 23
Fig. 1.21: Llamada y ejecución de rutina de extracción BCD……………………. 27
Fig. 1.22: Complemento a 1 del NUM2, registros del 0x44 al 0x47……………… 27
Fig. 1.23 Comprobación de Resta con resultado positivo……..……..……..…… 28
Fig. 1.24 Llamado a la subrutina TABLA……..……..……..…………………… 28
Fig. 1.25 Ejecución de la subrutina TABLA……..……..……..………………… 29
Fig. 1.26 Resultado final. Resultados guardados en registros 0x22 y 0x23, Números 29
convertidos a 7SEG guardados en registros del 0x50 al 0x53…………………….
Fig. 1.27 (a), (b), (c) y (d) evolución de la simulación en MPlab……..……..…….. 31
RESUMEN
Finalmente tenemos los Capítulos 6 y 7, los cuales abarcan los módulos ADC
(Conversor Analógico Digital) y EUSART (Enhanced Universal Synchronous
Asynchronous Receiver Transmitter) respectivamente, lo que incluye principio de
funcionamiento, registros de configuración, ecuaciones características y simulación
de aplicaciones. Nota importante: a menos que se especifique la fuente, las
imágenes aquí utilizadas son en su mayoría tomadas del manual del fabricante del
microcontrolador (DS41637B), la empresa microchip y del material didáctico de
clases de los profesores Antonio Pateti y Rafael surga.
Puertos E/S 33 36
Temporizadores 1-16 bits, 2-8 bits, 1-WDT 1-16 bits, 2-8 bits, 1-WDT
CCP 2 3
Fuentes de Interrupción 14 22
Pila 8 16
Comparadores/OPAMP 0 4/3
Bus
Direcciones
Memoria
CPU Programa
+
Bus Datos
Datos
Bus Bus
Direcciones Direcciones
M. Datos M. Prog Memoria
Memoria
Datos
Bus
Datos
CPU Bus
Datos
Programa
M. Datos M. Prog
La figura 1.5 muestra el diagrama completo del núcleo del PIC, allí se observa
a detalles de cada elemento de su composición, los buses de conexión a los diversos
periféricos así como la relación del bloque ALU, el registro de trabajo W y los
métodos de direccionamiento. En los microcontroladores tradicionales todas las
operaciones se realizan sobre el acumulador. La salida del acumulador está conectada
a una de las entradas de la Unidad Aritmética y Lógica (ALU), y por lo tanto éste es
La memoria RAM de datos se divide en 32 bancos con 128 bytes por banco. Cada
banco está formado por:
• 12 Registros de núcleo duplicados en los 32 bancos para fácil acceso
• 20 Registros de funciones especiales (SFR)
• Hasta 80 bytes de RAM de uso general (GPR)
• 16 bytes de RAM común
Banco 0 Banco 1
000h 080h
Registros de Nucleo Registros de Nucleo
00Bh 08Bh
Este método consiste en acceder a la memoria a través del uso del puntero FSR, y
para leer o escribir en el registro que apunta el FSR se usa el INDF.
Los registros INDFn no son registros físicos. Alguna instrucción que accede a un
registro INDFn en realidad accede al registro en la dirección especificada por el
puntero de selección de registros (FSR). Se crea el valor de registro FSRn por el par
de registros FSRnH y FSRnL. Los registros FSR forman una dirección de 16 bits que
permite una abordar el espacio con 65536 ubicaciones. Estos lugares se dividen en
dos regiones de memoria
Para simular en MPLAB IDE 8.92 lo primero que se debe hacer es abrir el programa
y el código que queremos simular en la aplicación. Acto seguido, hay que
posicionarse en la barra de herramientas, en la parte superior, desde donde se debe
acceder a la casilla Debugger, luego se debe seleccionar la opción Select Tool y
escoger MPLAB SIM
Para acceder a la Memoria de programa, sólo se debe hacer click en la casilla View
de la barra de tareas. Luego se debe seleccionar la opción Program Memory.
Esto hará que se abra una nueva sub-ventana dentro del programa, la cual muestra la
memoria de programa del microcontrolador
Bajo el renglón Value se puede observar el valor actual del registro en hexadecimal,
no obstante también existe la posibilidad de verlo en otros sistemas numéricos con
sólo dar click derecho sobre la parte superior de la tabla y seleccionar una de las
opciones que se presentan. La opción seleccionada aparecerá como un nuevo renglón
en la tabla. La figura 1.19 muestra este hecho.
Para poder realizar operaciones con número BCD, se deben separar cada una
de las cifras en un registro independiente. Por ende cada registro en el cual está
contenido el número debe ser separado en los nibles que lo componen (alto y bajo) y
cada uno deberá ser guardado en registros auxiliares dentro de la memoria.
Figura 1.20. Comprobación valor 4 en nible alto registro 0x20. Salto a resta
Figura 1.26. Resultado final. Resultados guardados en registros 0x22 y 0x23, Números
convertidos a 7SEG guardados en registros del 0x50 al 0x53
(a)
(b)
(d)
Figura 1.28. Inicio del programa en la página 2 y datos cargados en las localidades
pertenecientes a las listas
2. PUERTOS ENTADA/SALIDA
REGISTROS FUNCIÓN
TRISn Permite configurar los puertos como entradas o salidas
PORTn Permite leer o escribir el puerto
LATn Permite leer o escribir latch del puerto
ANSELn Permite configurar el puerto como entrada/salida digital o entrada analógica
OPTION_REG Habilitador general de las resistencias Pull-Up mediante el bit 7
WPUn Permite habilitar las resistencias Pull-Up individualmente de cada puerto
OPTION_REG
WPUA
TRISA
Pin C2OUT
Pin CCP1
Pin SDO
Pin SCL / SCK
Pin SDA / SDI
Pin TX / RX
Pin CCP2
Pin CCP3
Simulación:
U1 DSW1
U1 DSW1 2 15 8 OFF ON
1
2 15 8 OFF ON
1 RA0 RC0
RA0 RC0 3 16 7 2
3 16 7 2 RA1 RC1
RA1 RC1 4 17 6 3 (COM)
4 17 6 3 (COM) RA2 RC2
RA2 RC2 5 18 5 4
5 18 5 4 RA3 RC3
RA3 RC3 6 23
6 23 RA4 RC4
RA4 RC4 7 24 DIPSW_4
7 24 DIPSW_4 RA5 RC5
RA5 RC5 14 25
14 25 RA6 RC6
RA6 RC6 13 26
13 26 RA7 RC7
RA7 RC7
33 19
33 19 RB0 RD0
RB0 RD0 34 20
34 20 RB1 RD1
RB1 RD1 35 21
35 21 RB2 RD2
RB2 RD2 36 22
36 22 RB3 RD3
RB3 RD3 37 27
37 27 RB4 RD4
RB4 RD4 38 28
38 28 RB5 RD5
RB5 RD5 39 29
39 29 RB6/ICSPCLK RD6
RB6/ICSPCLK RD6 40 30
40 30 RB7/ICSPDAT RD7
RB7/ICSPDAT RD7
8 8
RE0 RE0
9 9
RE1 RE1
10 10
RE2 RE2
1 1
RE3/MCLR/Vpp RE3/MCLR/Vpp
PIC16F1787 PIC16F1787
U1 DSW1
2 15 8 OFF ON
1 U1 DSW1
RA0 RC0 OFF ON
3 16 7 2 2
RA0 RC0
15 8 1
RA1 RC1
4 17 6 3 (COM) 3 16 7 2
RA2 RC2 RA1 RC1
5 18 5 4 4 17 6 3 (COM)
RA3 RC3 RA2 RC2
6 23 5 18 5 4
RA4 RC4 RA3 RC3
7 24 DIPSW_4 6 23
RA5 RC5 RA4 RC4
14 25 7 24 DIPSW_4
RA6 RC6 RA5 RC5
13 26 14 25
RA6 RC6
RA7 RC7 13 26
RA7 RC7
33 19
RB0 RD0 33 19
34 20 RB0 RD0
RB1 RD1 34 20
35 21 RB1 RD1
RB2 RD2 35 21
36 22 RB2 RD2
RB3 RD3 36 22
37 27 RB3 RD3
RB4 RD4 37 27
38 28 RB4 RD4
RB5 RD5 38 28
39 29 RB5 RD5
RB6/ICSPCLK RD6 39 29
RB6/ICSPCLK RD6
40 30 40 30
RB7/ICSPDAT RD7 RB7/ICSPDAT RD7
8 8
RE0 RE0
9 9
RE1 RE1
10 10
RE2 RE2
1 1
RE3/MCLR/Vpp RE3/MCLR/Vpp
PIC16F1787 PIC16F1787
U1 DSW1 U1 DSW1
OFF ON
2 15 8 OFF ON
1 2 15 8 1
RA0 RC0 RA0 RC0
3 16 7 2 3 16 7 2
RA1 RC1 RA1 RC1
4 17 6 3 (COM) 4 17 6 3 (COM)
RA2 RC2 RA2 RC2
5 18 5 4 5 18 5 4
RA3 RC3 RA3 RC3
6 23 6 23
RA4 RC4 RA4 RC4
7 24 DIPSW_4 7 24 DIPSW_4
RA5 RC5 RA5 RC5
14 25 14 25
RA6 RC6 RA6 RC6
13 26 13 26
RA7 RC7 RA7 RC7
33 19 33 19
RB0 RD0 RB0 RD0
34 20 34 20
RB1 RD1 RB1 RD1
35 21 35 21
RB2 RD2 RB2 RD2
36 22 36 22
RB3 RD3 RB3 RD3
37 27 37 27
RB4 RD4 RB4 RD4
38 28 38 28
RB5 RD5 RB5 RD5
39 29 39 29
RB6/ICSPCLK RD6 RB6/ICSPCLK RD6
40 30 40 30
RB7/ICSPDAT RD7 RB7/ICSPDAT RD7
8 8
RE0 RE0
9 9
RE1 RE1
10 10
RE2 RE2
1 1
RE3/MCLR/Vpp RE3/MCLR/Vpp
PIC16F1787 PIC16F1787
43
CAPÍTULO III
3. INTERRUPCIONES
Las interrupciones permiten que ciertos eventos anticipen el flujo normal del
programa. El código dentro de la rutina de servicio de interrupción (ISR) debe
determinar el origen de la interrupción encuestando los bits de las banderas de
interrupción individuales, esto debido a que existe un único vector de atención a
interrupciones, de manera que el programador determinara la prioridad, es decir a
saber.
44
Al salir de la rutina de servicio de interrupción, estos registros se restauran
automáticamente. Cualquier modificación en estos registros durante el ISR se
perderá. Si modificaciones a cualquiera de estos registros se desean, el
correspondiente registro sombra debe ser modificado y el valor se restablece al salir
de la ISR. La registros de sombra están disponibles en el Banco 31 son lectura y
escritura. Dependiendo de la aplicación del usuario, también pueden ser salvado otros
registros. La figura 3.1 muestra el circuito de la lógica de interrupción.
PEIE
PIRn<7>
PIEn<7> GIE
Los bits de la bandera de interrupción deben ser borrados antes de salir del ISR
(Interrupt Service Routine o servicio de atención a interrupción) para evitar repetir la
interrupción una y otra vez. Ahora bien, debido a que el bit GIE está desactivado
45
durante el ISR, cualquier interrupción que se produzca durante su ejecución se
grabará a través de su indicador de interrupción, pero no hará que el procesador
redirija al vector de interrupción. Algunas interrupciones se pueden configurar para
despertar la MCU del modo de suspensión.
INTCON
OPTION_REG
PIR1, PIR2, PIR3, PIR4
PIE1, PIE2, PIE3, PIE4
IOCAP, IOCAN, IOCAF
IOCBP, IOCBN, IOCBF
IOCCP, IOCCN, IOCCF
IOCEP, IOCEN, IOCEF
46
PEIE: Bit de habilitación de interrupciones no controlador por INTCON
1: Habilita todas las interrupciones periféricas para activadas de forma individual
0: Desactiva todas las interrupciones periféricas
47
PIE1: Registro de habilitación de interrupciones periféricas
48
PIR1: Registro de señalización de interrupciones periféricas
49
De manera similar se tratan los registros PIE2, PIE3, PIE4, PIR2, PIR3 y PIR4. Para
más detalles consulte la sección 8.8 del anexo 1.
Para permitir que los pines individuales generen una interrupción, se debe
configurar el bit IOCIE del registro INTCON. Si el bit IOCIE está deshabilitado, la
detección cambio en el pin seguirá ocurriendo, pero no se generará una interrupción.
50
Para permitir que un pin detecte un flanco ascendente, se pone a “1” el bit
asociado del registro IOCxP; lo mismo ocurre cuando se requiera detectar un flanco
descendente, colocando a “1” el bit asociado del registro IOCxN. Un mismo pin
puede configurarse para detectar flancos de subidas y bajadas simultáneamente al
poner a “1” los bits asociados en los dos registros IOCxP e IOCxN.
Los bits ubicados en los registros IOCxF son banderas de estado que
corresponden a los pines de interrupción IOC de cada Puerto. Si se detecta un flanco
activo en en el pin configurado, entonces la bandera para ese pin se pondrá a “1” y
se generará una interrupción si se habilitó el bit IOCIE.
MOVLW 0xff
XORWF IOCAF, W
ANDWF IOCAF, F
51
INTE del registro INTCON. La señalización del evento de interrupción se encuentra
el bit INTF del registro INTCON. Si el GIE y el INTE se habilitan, el procesador
redireccionará ejecución del programa al vector de interrupción cuando esta ocurra.
NOTA: En vista que solo existe un único vector de interrupción (Dir 04), puede
ocurrir tener habilitadas varias interrupciones simultáneamente; en este caso, el nivel
de prioridad lo establece el programador, encuestando en primera instancia la
interrupción que desee tener máxima prioridad según sea su necesidad.
Nota: El valor en 7 segmentos solo cambiará al pulsar interruptores (RB0, RB3, RB4)
independiente del valor de su entrada.
52
Diagrama de flujo de configuración de puertos.
53
Simulación:
(a)
(b)
(c)
54
(d)
(e)
(f)
Figura 3.3. (a), (b), (c), (d); (e) y (f) Resultado de la simulación en diferentes eventos
55
En la figura 3.3a se observa que se habilitaron todos los bits de A Y B del puerto
cuyo resultado es 14 mostrando el 4 en el display y encendiendo el led para indicar
decena. La suma ocurre solo al pulsar RB3 que cumple tal función.
La figura 3.3b se muestra que incluso al cambiar los bits de entrada no modifica el
resultado de su salida hasta tanto se presione el botón de función. En la figura 3.3c se
observa como ocurre un reset a presionar el botón (RB0) pautado para esta función
La figura 3.3d presenta la situación en que se restan dos números (A-B) donde A es
menor que B por lo que el resultado será negativo, de manera que al ingresar la
combinación A=000 y B=111 al pulsar el botón de resta (RB4) da un resultado de -7,
cabe de destacar que el led enciende lo que significa el numero negativo.
La figura 3.3e presenta la operación A= 111 (7) menos B= 101 (5) dando como
resultado 2 al pulsar nuevamente el botón de resta. Finalmente se observa en la figura
3.3f el resultado de la operación suma al ingresar A=5 y B=4 obteniendo 9 en el
display sin encender el Led.
56
CAPÍTULO IV
4. TEMPORIZADORES TIMERS
Temporizador/Contador 0 (TMR0)
Temporizador/Contador 1 (TMR1)
Temporizador 2 (TMR2)
57
El registro TMR0 (SFR) presente en la dirección 15H en la memoria RAM de datos
al ser de 8 bits permite un desbordamiento al pasar del valor FF a 00, lo que en
función de la frecuencia de oscilación configurada en el micro y el valor del
Pre_divisor seleccionado permite obtener diversas bases de tiempo, útiles para el
diseño de aplicaciones. El TMR0 solo generará interrupción si esta se configura a
través del registro INTCON, bit TMR0IE. La figura 4.1 muestra el diagrama de
bloques del TMR0.
OPTION_REG
58
PSA: Asignación del Divisor de Frecuencia.
0: El TMR0 con Divisor de Frecuencia.
1: El TMR0 sin Divisor de Frecuencia.
PS2:PS0: Valor con que se programa el divisor de frecuencia cuando se asigna al
TMR0.
59
La figura 4.2 muestra el bloque TMR0 configurado como temporizador con
Pre_divisor igual a 4.
Las actualizaciones se leen en el registro TMR0 con solo usar la instrucción movf
TMR0,w. la siguiente ecuación describe el comportamiento del TMR0 como
temporizador.
Donde
𝑇𝑜𝑠𝑐 es la frecuencia de oscilación
TMR0: Registro acumulador de 8 bit
𝑃𝑟𝑒_𝑑𝑖𝑣𝑖𝑠𝑜𝑟: Divisor de frecuencia
60
cualquier otro valor menor o igual a este valor, fijamos el pre_divisor según la tabla
4.1 y despejamos TMR0 quedando la siguiente expresión:
𝑇𝑇𝑀𝑅0
𝑇𝑀𝑅0 = 256 −
4 ∗ 𝑇𝑜𝑠𝑐 ∗ 𝑃𝑟𝑒_𝑑𝑖𝑣𝑖𝑠𝑜𝑟
Banksel OPTION_REG
movlw 0x07
movwf OPTION_REG;TMR0 modo temporizador, pre_divisor asignado al TMR0 y a 256
bcf INTCON,TMR0IF ; Reponemos la bandera
movlb 0
movlw .217
movwf TMR0; Inicializamos el registro TMR0
bcf INTCON,TMR0IF ; Reponemos la bandera
movlb 0
ciclo btfss INTCON,TMR0IF; Verificamos que ocurra desbordamiento transcurrido 10mS
goto ciclo; esperamos que valga “1”
El módulo TMR0 puede operar como contador de 8 bit, a través del pin externo
T0CKI (RA4), para ello colocamos a “1” el bit TMR0CS del registro OPTION_REG.
De manera que el registro TMR0 se incrementara según el pre_divisor que se
seleccione según ocurran un flanco activo en el pin externo, este se configura
mediante el bit TMR0SE. Cuando se encuentra en el modo Contador de 8 bits, el
61
flanco activo de incremento en el pin T0CKI debe estar sincronizado con el reloj
ciclo de instrucciones. La figura 4.3 muestra la configuración para este modo.
62
El TMR1 es un temporizador y contador con las siguientes características:
El hecho que sea de16 bits permite gestionar bases de tiempo muchos mayores, sobre
todo cuando se hace uso del pre_divisor.
63
Para la configuración del TMR1 se utilizan los siguientes registros: T1CON,
T1GCON, TMR1L, TMR1H e INTCON solo para el tratamiento de la interrupción
(opcional).
T1CON
64
TMR1ON: Bit de habilitación del Timer 1.
0: Timer 1 deshabilitado.
1: Timer 1 habilitado.
T1GCON
Para corregir este inconveniente se pueden utilizar las siguientes fuentes asíncronas:
65
4.3.1 Modo temporizador
𝑇𝑇𝑀𝑅1
𝑇𝑀𝑅1 = 65536 −
4 ∗ 𝑇𝑜𝑠𝑐 ∗ 𝑃𝑟𝑒_𝑑𝑖𝑣𝑖𝑠𝑜𝑟
Banksel T1CON
movlw 0x05 ; configuramos el TMR1 como temporizador Fosc/4
movwf T1CON
Banksel TMR1L
movlw 0xBA
movwf TMR1L
movlw 0xA9
movwf TMR1H ; Inicializamos el registro TMR1 con 43450
bcf PIR1,TMR1IF ; Reponemos la bandera ; Reponemos la bandera
ciclo btfss PIR1,TMR1IF ; Verificamos que ocurra desbordamiento transcurrido 22mS
goto ciclo ; esperamos que valga “1”
bcf PIR1,TMR1IF
66
A continuación la figura 4.5 muestra cómo quedaría la configuración para este
ejemplo:
67
Figura 4.6. Operación del TIMER1 modo temporizador
68
El oscilador requiere un tiempo de puesta en marcha y estabilización antes de
su uso. Por lo tanto, se debe configurar T1OSCEN y se debe observar un retraso
adecuado antes de usar Timer1. Se puede implementar un retardo adecuado similar al
retardo de OST en el software borrando el bit TMR1IF y luego prefijando el TMR1H:
TMR1L con el valor FC00h. la bandera TMR1IF se activará cuando hayan
transcurrido 1024 ciclos de reloj, lo que indica que el oscilador está funcionando y es
razonablemente estable.
.
En el modo Contador, el pin debe registrar un flanco descendente antes del
primer flanco ascendente incremental después de una o más de las siguientes
condiciones:
1. Timer1 habilitado después de POR
2. Escribir en TMR1H o TMR1L
3. Timer1 está deshabilitado
4. Timer1 está deshabilitado (TMR1ON = 0) cuando T1CKI es alto, entonces
5. Timer1 está habilitado (TMR1ON = 1) cuando T1CKI está bajo.
4.4 TIMER 2
El Timer 2 (Fig. 4.7) funciona solo como temporizador y opera con el reloj
interno de ciclo de instrucción (FOSC / 4). El registro TMR2 se incrementa desde
00h en cada flanco activo del reloj. Dispone de un predivisor de 2 bits en la entrada
del reloj la cual permite, división por 1, 4 y división por 16. Estas opciones son
seleccionadas por los bits de control del predivisor T2CKPS <1: 0> perteneciente al
registro T2CON. También dispone de un postdivisor de 4 bit configurable mediante
los bits T2OUTPS <3: 0> del mismo registro
69
Dispone de las siguientes características:
Los siguientes registros son utilizados por el TMR2: T2CON, TMR2, PR2, y para el
tratamiento de interrupciones: INTCON, PIR1 y PIE1 (opcional).
70
T2CON
00: Divisor/1
01: Divisor/4
10: Divisor/16
11: Divisor/64
71
Aplicación 4.1 Uso de teclado matricial y display
72
columnas, que en condiciones de tecla_no_presionada estarán en estado uno “1”
lógico, de esta manera al presionar cualquier tecla de esa fila la columna asociada
cambiara a “0” lógico indicando que esa tecla fue presionada. Por ejemplo
imaginemos que colocamos en el nible bajo del puerto A el valor “1101” lo que
indica que está habilitada la fila 2. Así esperamos algún cambio en las columnas lo
permitirá detectar los números 4, 5 ó 6 en las filas f1, f2 o f3 respectivamente. De
manera similar se utiliza el mismo método para las demás filas. Este proceso permite
detectar cualquier tecla presionada sobre el teclado.
Para establecer los tiempos de refrescamiento adecuado que permitan a los cuatros
display permanecer encendido utilizaremos el TMR0 con una base de tiempo de
aproximadamente 4 mS. Usando la ecuación 4.1 tenemos:
73
Simulación
Este circuito se configuró de tal manera que al energizar mostrara “----”, lo que
significa que no se han ingresado ningún valor y se espera que se ingrese.
Se ingresa 5 después de haber ingresado anteriormente 1234 por lo que ingresa desde
la derecha hacia la izquierda.
74
A continuación el resultado de la implementación práctica del diseño.
75
Aplicación 4.2 Temporizador programable
Principio de funcionamiento: Para esta aplicación usaremos el timer0 con una base
de tiempo de aproximadamente 5 mS, para ello se configura como temporizador, con
un pre_divisor igual a 32, obteniéndose un valor del registro TMR0 igual a 100. Esta
base de tiempo es multipropósito, ya que se usa para el barrido de displays y
apoyándose en registros adicionales como contadores, sirve para aumentar la base de
tiempo hasta aproximadamente 1 segundo. El diodo led D3 representa la carga que se
activaría al iniciar la temporización y se apagaría al finalizar la misma. Por otra parte
el diodo D1 representa un buzzer que sonará de manera intermitente cuando se agote
el tiempo parametrizado en el temporizador.
Simulación
1
A
1 2 3
U1
13
OSC1/CLKIN RB0/INT
33
B
4 5 6
14 34
OSC2/CLKOUT RB1
35
RB2
2 36
3
RA0/AN0
RA1/AN1
RB3/PGM
RB4
37
C
7 8 9
4 38
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC
6 40
7
RA4/T0CKI/C1OUT
RA5/AN4/SS/C2OUT
RB7/PGD D
0 #
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F1787
D3 D1
LED-BIGY LED-GREEN
76
Aquí se muestra el resultado de la simulación realizada en proteus, donde se observa
la condición inicial “0000” a la espera de ingresar el tiempo deseado por teclado. La
figura 4.15A muestra el ingreso de 1 minuto con 50 segundos esperando que se
presione la tecla “#” para dar inicio a la temporización regresiva. Las imágenes
posteriores (B, C) muestran el progreso del temporizador hasta llegar al final de la
temporización (D), en cuyo caso aparece en mensaje “End” seguido de tres beep
representados por el led verde (D1). El código fuente se encuentra en el anexo 4.2.
3
1
A
1 2 3 A
1 2 3
U1 U1
13
OSC1/CLKIN RB0/INT
33
B
4 5 6 13
OSC1/CLKIN RB0/INT
33
B
4 5 6
14 34
14 34 OSC2/CLKOUT RB1
OSC2/CLKOUT RB1 35
35 RB2
RB2 2 36
2
3
RA0/AN0
RA1/AN1
RB3/PGM
RB4
36
37
C
7 8 9 3
RA0/AN0
RA1/AN1
RB3/PGM
RB4
37
C
7 8 9
4 38 4 38
RA2/AN2/VREF-/CVREF RB5 RA2/AN2/VREF-/CVREF RB5
5 39 5 39
RA3/AN3/VREF+ RB6/PGC RA3/AN3/VREF+ RB6/PGC
6 40
6
7
RA4/T0CKI/C1OUT
RA5/AN4/SS/C2OUT
RB7/PGD
40
D
0 # 7
RA4/T0CKI/C1OUT
RA5/AN4/SS/C2OUT
RB7/PGD D
0 #
15 15
RC0/T1OSO/T1CKI RC0/T1OSO/T1CKI
8 16 8 16
RE0/AN5/RD RC1/T1OSI/CCP2 RE0/AN5/RD RC1/T1OSI/CCP2
9 17 9 17
RE1/AN6/WR RC2/CCP1 RE1/AN6/WR RC2/CCP1
10 18 10 18
RE2/AN7/CS RC3/SCK/SCL RE2/AN7/CS RC3/SCK/SCL
23 23
RC4/SDI/SDA RC4/SDI/SDA
1 24 1 24
MCLR/Vpp/THV RC5/SDO MCLR/Vpp/THV RC5/SDO
25 25
RC6/TX/CK RC6/TX/CK
26 26
RC7/RX/DT RC7/RX/DT
19 19
RD0/PSP0 RD0/PSP0
20 20
RD1/PSP1 RD1/PSP1
21 21
RD2/PSP2 RD2/PSP2
22 22
RD3/PSP3 RD3/PSP3
27 27
RD4/PSP4 RD4/PSP4
28 28
RD5/PSP5 RD5/PSP5
29 29
RD6/PSP6 RD6/PSP6
30 30
RD7/PSP7 RD7/PSP7
PIC16F1787 PIC16F1787
D3 D1 D3 D1
LED-BIGY LED-GREEN LED-BIGY LED-GREEN
(A) (B)
1
A
1 2 3 A
1 2 3
U1
13
OSC1/CLKIN RB0/INT
33
B
4 5 6 13
U1
33
B
4 5 6
14 34 OSC1/CLKIN RB0/INT
OSC2/CLKOUT RB1 14 34
35 OSC2/CLKOUT RB1
RB2 35
2 36
3
RA0/AN0
RA1/AN1
RB3/PGM
RB4
37
C
7 8 9 2
3
RA0/AN0
RB2
RB3/PGM
36
37
C
7 8 9
4 38 RA1/AN1 RB4
RA2/AN2/VREF-/CVREF RB5 4 38
5 39 RA2/AN2/VREF-/CVREF RB5
RA3/AN3/VREF+ RB6/PGC 5 39
6 40
7
RA4/T0CKI/C1OUT
RA5/AN4/SS/C2OUT
RB7/PGD D
0 # 6
7
RA3/AN3/VREF+
RA4/T0CKI/C1OUT
RB6/PGC
RB7/PGD
40
D
0 #
15 RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI 15
8 16 RC0/T1OSO/T1CKI
RE0/AN5/RD RC1/T1OSI/CCP2
9 17 8 16
RE1/AN6/WR RC2/CCP1 RE0/AN5/RD RC1/T1OSI/CCP2
10 18 9 17
RE2/AN7/CS RC3/SCK/SCL RE1/AN6/WR RC2/CCP1
23 10 18
RC4/SDI/SDA RE2/AN7/CS RC3/SCK/SCL
1 24 23
MCLR/Vpp/THV RC5/SDO RC4/SDI/SDA
25 1 24
RC6/TX/CK MCLR/Vpp/THV RC5/SDO
26 25
RC7/RX/DT RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20 19
RD1/PSP1 RD0/PSP0
21 20
RD2/PSP2 RD1/PSP1
22 21
RD3/PSP3 RD2/PSP2
27 22
RD4/PSP4 RD3/PSP3
28 27
RD5/PSP5 RD4/PSP4
29 28
RD6/PSP6 RD5/PSP5
30 29
RD7/PSP7 RD6/PSP6
30
RD7/PSP7
PIC16F1787
PIC16F1787
D3 D1
LED-BIGY LED-GREEN D3 D1
LED-BIGY LED-GREEN
(C) (D)
Figura 4.15 (A) Valor parametrizado a la espera de INICIO (B) Resta 1 minuto con 47
segundo. D3 encendido (C) Restan 3 segundos (D) Fin de temporización led D1 activo
77
Aplicación 4.3 Manejo de LCD 16x2
Enunciado: El siguiente apartado introduce el uso de pantallas LCD para ser usadas
en las aplicaciones posteriores. Aunque la explicación de su funcionamiento no entra
en el análisis de este material, mostraremos los parámetros necesarios para su
utilización. El siguiente ejemplo muestra la conexión de una LCD 16x2, a saber 16
caracteres y dos línea con un microcontrolador. La idea es mostrar sin mayores
detalles información en ambas líneas, según la necesidad. Usaremos los pulsadores
conectados a los pines RB0 y RB1 para mostrar en la segunda línea un mensaje
diferente para cada botón. Este ejemplo en principio fue desarrollado para el
microcontrolador PIC16F877A, de la misma familia, y de la misma gama, de manera
que migrar el código fuente y el hardware al PIC16F1787 resulta sumamente sencillo.
;**************************************************************************
;LCD_DATO: Escritura de datos en DDRAM o CGRAM. Envía el dato presente en el W
;
LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTD ;Valor ASCII a sacar por PORTD
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato).
goto LCD_E ;Genera pulso de E
;**************************************************************************
;LCD_REG: Escritura de comandos en el LCD. Envía el comando presente en el W
Este fragmento se encuentra detallado en el anexo 4.3, que sirve como librería para el
manejo de la LCD.
78
Para el manejo de la LCD se necesitan enviar comandos y datos. Los comandos son
parámetros para el control de la pantalla, nos permiten por ejemplo inicializarla,
borrarla, cambiarnos de línea, mover el cursor entre otros comandos. Los datos es la
información que se desea mostrar. La idea de este ejemplo es mostrar de manera
sencilla información en ambas líneas. El anexo 4.4 contiene el código fuente del
ejemplo, allí se describe al detalle el uso de las instrucciones.
R2(1)
R2(1)
U1 U1
13 33
OSC1/CLKIN RB0/INT 13 33
14 34 OSC1/CLKIN RB0/INT
OSC2/CLKOUT RB1 14 34
1 35 OSC2/CLKOUT RB1
MCLR/Vpp/THV RB2 1 35
36 MCLR/Vpp/THV RB2
RB3/PGM LCD1 36
2
RA0/AN0 RB4
37 2
RB3/PGM
37 LCD1
3 38 RA0/AN0 RB4
RA1/AN1 RB5 3 38
4 39 RA1/AN1 RB5
RA2/AN2/VREF- RB6/PGC 4 39
5 40 RA2/AN2/VREF- RB6/PGC
RA3/AN3/VREF+ RB7/PGD 5 40
6 RA3/AN3/VREF+ RB7/PGD
RA4/T0CKI 6
7 15 RA4/T0CKI
RA5/AN4/SS RC0/T1OSO/T1CKI 7 15
16 RA5/AN4/SS RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2 16
8 17 RC1/T1OSI/CCP2
RE0/AN5/RD RC2/CCP1 8 17
9 18 RE0/AN5/RD RC2/CCP1
RE1/AN6/WR RC3/SCK/SCL 9 18
VDD
VSS
VEE
RE1/AN6/WR RC3/SCK/SCL
VDD
VSS
VEE
RW
10 23
RS
D0
D1
D2
D3
D4
D5
D6
D7
RW
10 23
RS
RE2/AN7/CS RC4/SDI/SDA
D0
D1
D2
D3
D4
D5
D6
D7
E
RE2/AN7/CS RC4/SDI/SDA
E
24 24
RC5/SDO RC5/SDO
25 25
RC6/TX/CK RC6/TX/CK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
RC7/RX/DT 26
RC7/RX/DT
PIC16F877 19 PIC16F877 19
RD0/PSP0 RD0/PSP0
20 20
RD1/PSP1 RD1/PSP1
21 21
RD2/PSP2 RD2/PSP2
22 22
RD3/PSP3 RD3/PSP3
27 27
RD4/PSP4 RD4/PSP4
28 28
RD5/PSP5 RD5/PSP5
29 29
RD6/PSP6 RD6/PSP6
30 30
RD7/PSP7 RD7/PSP7
79
Aplicación 4.4 Manejo de LCD 16x4
LCD1
LM041L
U1
2 15
RA0 RC0
3 16
RA1 RC1
4 17
RA2 RC2
5 18
RA3 RC3
6 23
RA4 RC4
7 24
RA5 RC5
14 25
RA6 RC6
13 26
RA7 RC7
VDD
VSS
VEE
RW
RS
D0
D1
D2
D3
D4
D5
D6
D7
E
33 19
RB0 RD0
34 20
RB1 RD1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
35 21
RB2 RD2
36 22
RB3 RD3
37 27
RB4 RD4
38 28
RB5 RD5
39 29
RB6/ICSPCLK RD6
40 30
RB7/ICSPDAT RD7
8
RE0
9
RE1
10
RE2
1
RE3/MCLR/Vpp
PIC16F1787
80
Aplicación 4.5 Reloj digital usando TIMER1 como contador
𝑇𝑇𝑀𝑅1 1000000𝜇𝑆
𝑇𝑀𝑅1 = 216 − = 65536 − = 3276810
𝑇𝑂𝑆𝐶 ∙ 𝑃𝑟𝑒𝑑𝑖𝑣 1
1 ∙ ( ⁄32768 ∗ 10−6 )𝜇𝑆
81
Simulación:
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36
2
RB3/PGM
37 LCD1
(A)
RA0/AN0 RB4
3 38
RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
RE0/AN5/RD RC2/CCP1
9 18
RE1/AN6/WR RC3/SCK/SCL
VDD
VSS
VEE
RW
10 23
RS
D0
D1
D2
D3
D4
D5
D6
D7
RE2/AN7/CS RC4/SDI/SDA
E
24
RC5/SDO
25
RC6/TX/CK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
26
RC7/RX/DT
PIC16F877 19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36
2
RB3/PGM
37 LCD1
(A)
RA0/AN0 RB4
3 38
RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
RE0/AN5/RD RC2/CCP1
9 18
RE1/AN6/WR RC3/SCK/SCL
VDD
VSS
VEE
RW
10 23
RS
D0
D1
D2
D3
D4
D5
D6
D7
RE2/AN7/CS RC4/SDI/SDA
E
24
RC5/SDO
25
RC6/TX/CK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
26
RC7/RX/DT
PIC16F877 19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
82
CAPÍTULO V
En este capítulo explican los modos de operación del módulo CCP, a saber
Captura, Comparación y PWM, sus características, configuración y principales
aplicaciones. Asumiremos una frecuencia de oscilación de 4 MHz
83
5.2 Modo Captura
La función del modo de captura descrita en esta sección es idéntica para todos
los módulos CCP. El modo de captura utiliza el temporizador TMR1 de 16 bits como
recurso. Cuando ocurre un evento en el pin CCPx, el par de registros CCPRxH:
CCPRxL captura y almacena el valor de 16 bits presente en la pareja de registros
TMR1H: TMR1L, respectivamente. Cuando se realiza una captura, la bandera del
registro PIRx que señaliza interrupción se pone en “1” (CCPxIF=1). La bandera de
interrupción debe ser borrada en el software. Si ocurre otra captura antes que el valor
presente CCPRx, sea leído, el valor capturado antiguo es sobrescrito por el nuevo
valor capturado.
CCPxCON
84
El modo captura es especialmente útil, por ejemplo cuando se desea medir el periodo
de señales externas. Por ejemplo si se desea configurar el módulo CCP en modo
captura para en cada flanco descendente se haría la configuración según la figura 5.2.
Aplicación 5.1 Uso del modo captura para medir periodo de señal externa
85
(a)
(b)
(c)
86
(d)
Figura 5.3 Captura de señal de (a) 500Hz, (b) 1 KHz, (c) 4 KHz, (d) 13KHz
En este modo de operación al igual que en el modo captura, se hace uso del timer 1
aprovechando sus registro de 16 bit (TMR1H:TMR1L) para su funcionamiento.
87
CCPxCON
88
Aplicación 5.2 Uso del modo comparación para generar señales periodicas
Enunciado: Se desea diseñar una aplicación que permita sacar por el pin RB0 una
onda cuadrada periodica con frecuencia igual a 2 KHz usando el modulo CCP en
modo Comparacion con disparo de eventos especiales.
89
Simulación
(a) (b)
(c) (d)
La figura 5.6a muestra cómo evoluciona el TMR1, mientras esto ocurre el programa
se queda en un bucle infinito. La figura 5.6b muestra el momento en que ocurre la
comparación entre el TMR1 y los registros CCPRx, instante en que entra a la rutina
de interrupción para conmutar el pin RB0. Las figuras 5.6c y 5.6d nos presentan las
señales generadas de 2KHz y 1KHz respectivamente. Tanto en Mplab como en
Proteus se puede analizar el comportamiento de la aplicación sin problemas.
90
5.4 Modo PWM
La Modulación por Ancho de Pulsos o PWM por sus siglas en inglés, es una
técnica que consiste básicamente en generar señales cuyo ciclo útil, al que
llamaremos CU puede ser variable al igual que el periodo de la misma. Para ello se
utiliza el TMR2 como recurso periférico. Este modo de tiene muchas aplicaciones,
especialmente donde se requiera variar el voltaje promedio de la señal sin alterar la
frecuencia de la señal, por ejemplo en el control de velocidad de motores DC, en el
control de temperatura mediante el uso de resistencias como elemento calefactor,
modular señales infrarrojas, entre muchas otras. La figura 5.7 muestra el diagrama de
bloque del modo PWM. La salida de la señal PWM es por el pin CCPx
Cuando se compara el valor del registro PR2 y TMR2 y se detecta la igualdad se hace
un Set el flip-flop colocando su salida en “1”, a la vez que se resetea el registro
TMR2 y se carga al registro CCPRxH el valor contenido en el CCPRxL.
Por otra parte al ocurrir el Set del biestable se inicia en proceso de comparación pero
ahora entre comparan los 10 bits ([CCPRxH:CCP1CON(5:4)]) y TMR2 concatenado
91
con los dos bits de menor peso del reloj interno) y cuando son iguales ocurre un reser
del biestable, lo que pone a “0” su salida y el registro TMR2 no se resetea. De allí
nuevamente se repite el ciclo, siendo el PR2 quien determina el periodo de la señal y
el registro CCPRx determina el CU.
APFCON1
La mínima resolución (en tiempo) para el Ciclo Útil del módulo PWM depende del
Pre-Divisor del Timer 2
92
PWMCU = [CCPR1L:CCP1CON<5,4>]●Tosc●[PreDiv TMR2]
TPWM = [2b]●Tosc●[PD_T2]
TPW M
2b
Tosc PD _ T 2
log 2 b log
TPW M
Tosc PD _ T 2
TPW M
log
osc
T PD _ T 2
b
log( 2)
La figura 5.8 describe de forma gráfica la evolución del modo PWM, donde se
observa la comparacion entre los registros PR2 y TMR2 paradefinir el periodo de la
señal y posteriormente la comparación entre el TMR2 y CCPRxH para definir el ciclo
útil, y como este ciclo se repite de forma periodica.
93
Aplicación 5.3 Manejo de motor mediante PWM
1
𝑇𝑝𝑤𝑚 = 256μS = 4 ∗ ( )∗ (𝑃𝑅2 + 1) ∗ 1
4𝑀𝐻𝑧
Tomaremos la salida PWM por el pin RC2, para ello colocamos a “0” el bit
CCP1SEL del registro APFCON1. Calcularemos tres valores de ciclo útil, a saber
20%, 50% y 95%. Significa que para 20% tendremos 51.2 μS de CU, para 50% será
128 μS y para 95% será 243.2 μS. Haciendo uso de la ecuación. 5.4 tenemos:
Para 20% 𝐶𝑈𝑃𝑊𝑀 = 51.2µS = [𝐶𝐶𝑃𝑅1𝐿: 𝐶𝐶𝑃1𝐶𝑂𝑁 < 5,4 >] ∗ 0.25µS ∗ 1
[𝐶𝐶𝑃𝑅1𝐿: 𝐶𝐶𝑃1𝐶𝑂𝑁 < 5,4 >] = 204.8 ≅ 205
Para 50% 𝐶𝑈𝑃𝑊𝑀 = 128µS = [𝐶𝐶𝑃𝑅1𝐿: 𝐶𝐶𝑃1𝐶𝑂𝑁 < 5,4 >] ∗ 0.25µS ∗ 1
[𝐶𝐶𝑃𝑅1𝐿: 𝐶𝐶𝑃1𝐶𝑂𝑁 < 5,4 >] = 512
Para 95% 𝐶𝑈𝑃𝑊𝑀 = 243.2µS = [𝐶𝐶𝑃𝑅1𝐿: 𝐶𝐶𝑃1𝐶𝑂𝑁 < 5,4 >] ∗ 0.25µS ∗ 1
[𝐶𝐶𝑃𝑅1𝐿: 𝐶𝐶𝑃1𝐶𝑂𝑁 < 5,4 >] = 972.8 ≅ 973
94
Simulación
(a) (b)
(c) (d)
Figura 5.10 (a) 0% CU, (b) 20% CU, (c) 50% CU, (d) 95% CU
95
En las figuras 5.10 a, b, c y d se observa claramente el buen desempeño del módulo
PWM, tanto en periodo, como en los 3 CU calculados, los cuales se corresponde muy
bien con los obtenidos de forma numérica. En la gráfica del osciloscopio de la
simulación se aprecia que el ciclo útil igual al esperado.
96
CAPÍTULO VI
97
Acontinueación la figura 6.2 muestra los detalles que pudiera tener el controlador.
98
La ecuación de transferencia del ADC se muestra a continuación
D V VREF
Ecuación 6.1 in
(2 1) VREF VREF
n
Donde:
D es el valor digital resultante de la conversión
n es en número de bit del conversor
Vin es el voltaje de entrada al ADC
99
Para el microcontrolador PIC16F1787 tememos el siguiente diagrama de bloques:
100
Los siguientes registros ubicados en los bancos “0” y “3” son necesarios para operar
el conversor ADC:
ADCON0
101
Tabla 6.1 Selección del canal entrada positiva diferencial del ADC
ADCON1
102
ADNREF: Configuración de VREF-
0: VREF- es Vss
1: VREF- es conectado al pin VREF-
ADPREF<2:0>: Configuración de VREF+
00: VREF+ es conectado a VDD
01: VREF+ es conectado al pin VREF+
10: Reservado
11: VREF+ es conectado internamente a FVR
ADCON2
TRIGSEL<3:0> Función
0000 Deshabilitado
:
0001 Se da Inicio de Conversión por CCP1
0010 Se da Inicio de Conversión por CCP2
0011 Reservado. Deshabilitado
0100 Se da Inicio de Conversión por PSMC1
0101 Se da Inicio de Conversión por PSMC1
0110 Se da Inicio de Conversión por PSMC1
0111 Se da Inicio de Conversión por PSMC2
1000 : Se da Inicio de Conversión por PSMC2
1001 Se da Inicio de Conversión por PSMC2
1010 Se da Inicio de Conversión por PSMC3
1011 Se da Inicio de Conversión por PSMC3
1100 Se da Inicio de Conversión por PSMC3
1101 Reservado. Deshabilitado
1110 Reservado. Deshabilitado
1111 Reservado. Deshabilitado
103
Tabla 6.4 Selección del Periodo para el reloj del conversor AD
104
Figura 6.8 ADC 12 bit formato magnitud y signo y complemento a 2
105
El modelo análogo de entrada se muestra en la Figura 6.10.
Donde:
CPIN: Capacitor de Entrada
VT: Voltaje umbral del diodo
I Fuga: Corriente de fuga por las conexiones
RIC: Resistencia de interconexión
SS: Switch del S/H
CHOLD: Capacitor del S/H
106
6.4 Cálculo del tiempo de adquisición (TACQ)
Donde:
107
3. Configurar la interrupción ADC (opcional):
Borrar indicador de interrupción ADC
Habilitar la interrupción ADC
Habilitar la interrupción periférica
Habilitar la interrupción global
PIC 16F877
VDD
AN0 RC2
TMR2=PR2 TMR2=PR2
TMR2=AN0
El TPWM=4096 seg
Se debe dar un Inicio de Conversión cada 1 mS. Para ello se utiliza el CCP modo
comparación con disparos de eventos especiales para dar inicio periódicamente al
ADC.
108
Diagrama de flujo
Aplicación 6.1 Uso del ADC para controlar velocidad de motor DC por PWM
109
en modo captura con disparos de eventos especiales para dar inicio al ADC
periódicamente cada 50m y el módulo CCP3em modo PWM con un periodo de 1mS
(1KHz). El hardware necesario para el diseño se muestra en la figura 6.14.
Calculando los valores de las contantes del modo de disparo de eventos especiales
TIC=(CCPRx +1)*(4*Tosc)*Pre.Divisor (Si se programa el Timer 1 a Fosc/4)
Con Tic= 50 milisegundos, Pre_divisor=1, Tosc=0,25 microsegundo
Así CCPRx=C34FH=49999D
Resultando CCP1RH=C3H y CCP1RL=4FH
Calculando el valor de PR2 para el modo PWM del módulo CCP1
TT2= (PR2+1)*4/Fosc*pre_divisor (del TMR2)
Si Fosc = 4 MHz , TT2 = 1 milisegundo , pre_divisor = 4 y Post_divisor =1
Entonces PR2 = 249 =F9H
110
Simulación: Para la simulación utilizaremos un voltímetro para observar el voltaje
analógico en la entrada del canal AN0 y un osciloscopio para ver la formad de onda
de salida PWM, el periodo y como varia el ciclo útil en la proporción en que varía el
voltaje de entrada.
111
Figura 6.17 (a) 97% Cu de PWM (b) 98% Cu de PWM
La figura 6.15a muestra la salida de PWM en 0% loque significa que la entrada del ADC esta
en 0Vdc, la 6.15b muestra un Cu de 25% lo que es 250S en alto, a la entrada se observa
un voltaje de 1.25Vdc que corresponde al 25%. La figura 6.16a y 6.16b muestran Cu
de 50% y 75% respectivamente con 500S y 750S en cada caso. A la entrada del
canal AN0 se observa con el multímetro los voltajes para el 50% a saber 2.5Vdc y
3.75Vdc para 75%. Finalmente para la figura 6.17a y un valor analógico de 97%
(4.85Vdc) se observa en el osciloscopio un Cu cercano al 100% (970S); para la
figura 6.17b el PWM está saturado.
112
Aplicación 6.2 Uso del ADC para medir temperatura usando el sensor LM35
𝐷 = 1023 ∗ 𝑉𝑖𝑛
Para lograr obtener la temperatura en °C tenemos:
𝐾 = 100⁄1023 = 0.0977
Donde K serála constante que multiplicaremos por el valor digital que resulta del
ADC, por ejemplo si el LM35 mide 50°C tendra como salida 500mV, este valor
representa 511D, el cual multiplicado por K=0.0977 nos da 49.9247°C. En vista de
que es asm es complicado multiplicar cifras con punto flotante usaremos un artificio
sencillo; se trara de usar una rutina que multiplique dos numeros de 16 bit cada uno.
K seria 977 en vez de 0.0977 asi en el ejemplo anterior el valor 511D * 977 es
499247 este valor queda expredado en binario y luego mediante otra rutina se
convierte a BCD, pero solo nos quedaremos con los 3 digitos mas significativos,
ejemplo del 499247 nos quedamoscon 499 y al mostrarlo en la pantalla LCD seria 49
seguido mostramos el punto decimal y 9. A saber 49.9 °C.
113
Simulación:
114
Figura 6.18b Temperatura de 87.9 °C y 99.9 °C
En las figuras 6.17a y 6.17b se observa la respuesta del convertidor ADC ante las
variaciones de voltaje en el canal AN0, de manera que cumple con el objetivo de la
aplicación, por ejemplo para una entrada de 0 Vdc seobserva una temperatura de 00.0
°C, para 0.5 Vdc tenemos una temperatura calculada de 49.9 °C, para 1Vdc
observamosuna temperatura de 99.9 °C. lo que muestra un error despreciable en la
medida. El anexo 6.2 muestra el código fuente de esta aplicación.
115
CAPÍTULO VII
116
Figura 7.1. Comunicación asíncrona y síncrona
117
Detección automática y calibración de la velocidad de transmisión
Activación mediante rotura de recepción (Line-Break)
13 bits de transmisión en (Line-Break)
118
7.4.1 Normas mecánicas
Tiene que ver con el tipo de conector: los utilizados son el DB-25 y DB-9
Tiene que ver con los niveles de tensión con que se transmiten o reciben los datos
119
Figura 7.7. Driver MAX232
120
El EUSART transmite y recibe primero la LSb. El transmisor y el receptor de
EUSART son funcionalmente independientes, pero comparten el mismo formato de
datos y la velocidad en baudios. La paridad no es compatible con el hardware, pero
puede implementarse en el software y almacenarse como el noveno bit de datos.
RC6/RB6/TX
FOSC
Divisor entre n
n
BRG16
MULTIPLI
+1 CADOR
X4 X16 X64
SYNC 1 X 0 0 0
BRG16 X 1 0 1 0
121
Para la conexión física se utilizan los pines RC6, RC7, RB6 y RB7
TXSTA
122
BRGH: Solo modo Asíncrono
0: Baudios en Baja Velocidad.
1: Baudios en Alta Velocidad
TRMT: Bit de estado del Transmit Shift Register (TSR)
0: TSR está lleno.
1: TSR está vacío.
TX9D: 9º Bit de Dato en la Transmisión (ejmp. Bit de Paridad)
BRG (Clock)
RC6/TX/CK (pin) Bit START Bit 0 Bit 1 Bit 7/8 Bit STOP
Dato Tx
TRMT
123
A continuacion se presenta un diagrama de flujo para la transmisión y un fragmendo
de código fuente:
124
7.5.3 Uso de interrupción por recepción
Se establece el bit de bandera de interrupción RCIF del registro PIR1 siempre que el
receptor EUSART esté habilitado y haya un carácter no leído en la recepción FIFO.
El bit de indicador de interrupción RCIF es de solo lectura, no se puede setear ni
borrar por software.
El bit indicador de interrupción RCIF se pone a “1” cuando haya un carácter no leído
en la FIFO, independientemente del estado de los bits de habilitación de interrupción
125
RCSTA
126
7.6 Generador de Baud Rate (BRG)
127
Para la configuración del generador de baudio tenemos el regstro BAUDCON, cuya
descripción se hace a continuación:
BAUDCON
APFCON1
128
RXSEL: Selección del pin de entrada de RX.
0: Rx es RC7
1: Rx es RB7
129
TIC=(CCPRx +1)*(4*Tosc)*Pre.Divisor (Si se programa el Timer 1 a Fosc/4)
Con Tic=1 segundo
Pre.Divisor=8
Tosc=1 microsegundo
Entonces CCPRx=7A11H=31249D
Resultando CCP1RH=7AH y CCP1RL=11H
Para la velocidad de TX con BRGH=1
Si BR=2400 , Fosc=1Mhz
Entonces SPBRG=25
Haremos uso de la aplicación 5.3 para la configuración del módulo CCP1 en modo
PWM. Solo utilizaremos los 8 bit más significativos para el control del PWM
(CCPR1L). La figura 7.13 muestra el hardware necesario para la simulación.
R5(1)
D1
LED-GREEN
U1 DSW1 U2 Q1
OFF ON
2N3904
2 15 16 1 2 15
RA0 RC0 RA0 RC0
3
RA1 RC1
16 15 2 3
RA1 RC1
16 R17
4 17 14 3 4 17 3k
RA2 RC2 RA2 RC2
5 18 13 4 5 18
RA3 RC3 RA3 RC3
6 23 12 5 6 23
RA4 RC4 RA4 RC4
7 24 11 6 7 24
RA5 RC5 RA5 RC5
14 25 10 7 14 25
RA6 RC6 RA6 RC6
13 26 9 8 13 26
RA7 RC7 RA7 RC7
33 19 DIPSW_8 33 19
RB0 RD0 RB0 RD0
34 20 34 20
RB1 RD1 RB1 RD1 A
35 21 35 21
RB2 RD2 RB2 RD2
36 22 36 22
RB3 RD3 RB3 RD3 B
37 27 37 27
RB4 RD4 RB4 RD4
38 28 38 28
RB5 RD5 RB5 RD5 C
39 29 39 29
RB6/ICSPCLK RD6 RB6/ICSPCLK RD6
40 30 40 30
RB7/ICSPDAT RD7 RB7/ICSPDAT RD7 D
VDD
8 8
RE0 RE0
9 9
RE1 RE1
10 10
RE2 RE2
1 1
RE3/MCLR/Vpp RE3/MCLR/Vpp
PIC16F1787 PIC16F1787
130
Simulación:
131
Figura 7.16 Transmisión y recepción del valor 1111001
Para simular esta aplicación se debe gargar el archivo .HEX para cada
microcontrolador, a saber el archivo para el micro transmisor y el de receptor, luego
al iniciar la simulación se ejecuta el código en cada uno obteniendo los resutados que
se describen a continuación: las figuras desde 7.14 hasta 7.17muestran como se
transmite por el módulo USART desde el modulo transmisor el dato presente en los
dipswich y como éste es recibido correctamente el micro receptor. Como a la vez se
132
visualiza y varía el ciclo útil, por ejemplo en la figura 7.15 se envía el valor
100000012 ó 10110 de manera que el ciclo útil seria aproximadamente el 50% y al
observar el osciloscopio inferior vemos como se cumple ésta premisa. Para ver
detalles del código fuente para el transmisor ver anexo 7.1 y el anexo 7.2 para el
receptor.
133
CONCLUSIONES
134
Por tanto queda a disposición de estudiantes, docentes, aficionados y
profesionales una completa herramienta de consulta relacionada con el diseño, y
simulación de aplicaciones para microcontroladores PIC de 8 bit, a la vez que la
asignatura microprocesadores I, que se imparte en la carrera de ingeniería electrónica
de la UNEXPO vice-rectorado puerto Ordaz, contar con tal herramienta.
135
REFERENCIAS
136
ANEXOS
137