Proyectos Con El PIC16F84
Proyectos Con El PIC16F84
Proyectos Con El PIC16F84
Capítulo 2
Proyectos con
el PIC16F84
+5V
Buffer
14 +5V
VDD
ULN2803 330Ω LED
13 RB7 2 1 18
RA3
12 RB6 1 2 17
+5V RA2
11 RB5 18 3 16
RA1
Interruptores 1K 10 RB4 17 4 15
RA0
9 RB3
+5V 8 RB2 PIC16F84
1K 7 RB1
RA4/TOCKI
6 RB0
20pF 4
MCLR
+5V
16 OSC1
4MHz 15 OSC2 10K
VSS 100Ω RESET
20pF 5
INICIO
Programar
puertos
Leer puerto B
(interruptores)
Invertir el valor
leído
Pasar dato al
puerto A
end
;=============================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
INICIO
Programar
puertos
Inicia conteo
en 0
Tecla NO
presionada
?
SI
Incrementar
contador
Retardo (ms)
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
Manejo de teclados
Inicialmente consideremos la implementación de un teclado sencillo, el cual consta
básicamente de 8 interruptores (dipswitch), tal como se muestra en la figura 2.7, en
donde a cada pin del puerto B del microcontrolador corresponde una determinada
tecla. Cuando estas teclas no están presionadas, el pin correspondiente estará conec-
tado a un nivel lógico alto, en cambio cuando alguna de ellas se presiona, el pin
correspondiente se conectará a un nivel lógico bajo; en este teclado por lo tanto se
lee “ceros”. Un aspecto que vale la pena tener en cuenta es que si el microcontrola-
dor tiene elementos pull-ups internos, las resistencias que se muestran pueden eli-
minarse, simplificando el circuito.
1K 14 16
100Ω
13 VDD 2 6 VCC Cátodo común
RB7 RA3 D a 13
12 1 2
RB6 RA2 C b 12
18 1
11
RB5 RA1 B c 11
17 7
10
RB4 RA0 A d 10
9
RB3 9368 e 9
+5V
8 PIC16F84 15
RB2 f
7 14
1K RB1 RA4/TOCKI 3 g
GND
6
RB0 3 8 +5V
20pF 4
MCLR
+5V 2N3904
16
OSC1 2.7K
4MHz 15
OSC2 10K
VSS 100Ω RESET
20pF 5
Programar
puertos
Iniciar display
Leer puertos
Tecla NO
presionada
?
SI
Mostrar datos
en display
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
4.7K
RB0
RB1
PIC16F84
RA0
RA1
RA2
RA3
14
g
PIC16F84 C D E F
GND 1
3 RA3
+5V 8
2N3904
2.7K 20pF
RB0
16
OSC1 RB1
4MHz
OSC2 RB2
15
RB3
20pF VSS
5
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
Si queremos explorar todo este teclado, bastará con rotar el cero circularmente, de
tal manera que solamente un cero se encuentre en las filas del teclado, cuando se
realiza las lecturas de las líneas de entrada (las columnas) como se muestra en la figura
2.12. Cuando el cero llegue a la fila más significativa del teclado, debe reingresar en la
próxima ocasión por la menos significativa, reiniciando la exploración del teclado. Un
diagrama de flujo para este proceso, en donde el microcontrolador queda enclavado
leyendo el teclado hasta que se detecta la presión de uno de sus elementos, se muestra
en la figura 2.13; en la figura 2.14 se tiene el programa respectivo. Como resultado del
programa, un valor comprendido entre 0 y 15 queda almacenado en un registro, dicho
valor se muestra en un display de 7 segmentos que se ha conectado a los pines RB4 a
RB7, para comprobar el funcionamiento del sistema.
El proceso se realiza a una gran velocidad, por lo que se tiene la sensación que
todo el teclado se está sensando permanentemente. En el programa realizado, por
ejemplo, la exploración total del teclado tarda menos de 60 µs, si consideramos que
el oscilador es de 4 MHz.
Otro aspecto que no se puede olvidar, son los rebotes causados por la pulsación
de una tecla. Cuando una tecla se oprime, sus contactos actúan como resortes, y la
unión eléctrica no es estable; se generan una serie de uniones y desuniones mecáni-
cas durante un intervalo significativo de tiempo. Estos rebotes pueden dar lugar a
que, en una aplicación real, el programa los interprete como si se hubieran generado
muchas pulsaciones, si es que no se toman los correctivos del caso. Para ello existen
LECTURA
DEL TECLADO
Colocar cero en
la primera fila
Desplazar
cero en filas
SI
NO Alguna
columna está
en cero
?
SI
Rutina de
tratamiento de
tecla
TERMINAR
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
14 4
VDD MCLR Displays de cátodo común
100Ω
RB7 dp
RB6 g
RB5 f
RB4 e
RB3 d
c
RB2
b
RB1 a
RB0
PIC16F84 2.7K 2N3904 2N3904 2N3904 2N3904
RA3
2.7K 2.7K 2.7K
20pF RA2
16
OSC1 RA1
4MHz
OSC2 RA0
15
VSS
20pF 5
las bases de éstos para que el transistor se comporte como un interruptor cerrado
y se presente dicha corriente. Pero aún cuando los transistores se comporten
como interruptores cerrados, no se encenderá ningún display si la salida del
puerto que maneja los segmentos tiene niveles lógicos bajos (ceros); para en-
cenderlo, es necesario colocar un nivel lógico alto en el pin de salida correspon-
diente a cada segmento.
Así por ejemplo, si queremos mostrar un tres en el segundo display menos signi-
ficativo debemos establecer básicamente los siguientes pasos:
Otra opción que permite obtener el mismo resultado, con un proceso diferente,
sería la siguiente:
Ahora, si pretendemos visualizar no uno sino los cuatro displays de siete seg-
mentos, es necesario empezar a controlar los transistores secuencialmente a la vez
que se envía por el puerto que controla los segmentos los datos correspondientes
al display en cuestión, realizando este proceso a una velocidad tal que de nuevo
parezca que el proceso se está realizando simultáneamente sobre todos los dis-
plays. El tiempo en que necesitamos sostener el dato en cada display puede variar
significativamente, dependiendo fundamentalmente del valor de las resistencias
limitadoras, del número de dígitos que se tengan por mostrar y de las característi-
cas propias del display; experimentalmente se encuentra que mostrar cada dígito
durante 3 milisegundos, cuando se tienen resistencias limitadoras de 100 ohm,
proporcionan un brillo aceptable de un display “estándar” y una buena visualiza-
ción a una distancia prudente.
Visualización
en DISPLAY
Apuntar al
primer digito
Colocar uno en
transistor que
habilita el display
menos significativo
Leer dato
señalado por
puntero
Incrementar
puntero
Enviar dato
a segmentos
Retardo para
visualización
Rotar uno
en
transistores
Enviar ceros a
los segmentos
el
uno de
habitación de SI
NO display está
en el cuarto
transistor
?
movwf dig2
movlw 03
movwf dig3
movlw 04
movwf dig4
end
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
+5V
14 4 +5V
VDD MCLR Displays de cátodo común
16
RB3 D 100Ω
g g
RB2 C
B f f
RB1
A e e
RB0
d d
c
9368 c b
b
a a
PIC16F84 3 8
2.7K 2N3904 2N3904 2N3904 2N3904
RA3
2.7K 2.7K 2.7K
20pF RA2
16
OSC1
4MHz RA1
OSC2
15 RA0
20pF VSS
5
+5V
0 1 2 3
RB0
4 5 6 7
RB1
8 9 A B
RB2
C D E F
RB3
Aquí se resumen los anteriores ejemplos para crear uno sólo. El disparo del tran-
sistor es simultáneo con la salida del dato para activar cada segmento dentro del
display, así que no es necesario preocuparse con apagar previamente los LED, antes
de rotar el cero en las bases de los transistores.
Memorias 24XX
1 A0 VCC 8
1,2,3 A0, A1, A2 Dirección del dispositivo en el bus
4 VSS Tierra
2 A1 WP 7 5 SDA Datos y direcciones seriales I/O
6 SCL Reloj
7 WP* Protección de escritura. Si está en 0 habilita
3 A2 SCL 6 escritura, en 1 la deshabilita
8 VCC +5V
1 VSS
4 SDA 5 * En la 24LC01 el pin WP no realiza ninguna función
24XX
Estas memorias utilizan el bus de 2 hilos para comunicarse con otros dispositivos.
Dado que cumplen con el protocolo I2C, tiene un pin llamado SCL que recibe los
pulsos generados por el dispositivo maestro (o sea el microcontrolador) y otro lla-
mado SDA que maneja el flujo de datos de forma bidireccional (entrada/salida). En
la figura 2.20 se muestra el diagrama de pines correspondiente a estas memorias.
Este dispositivo no requiere de un pin habilitador o chip select, ya que en este esquema
la transferencia de información solo se puede iniciar cuando el bus esté libre. En este caso,
como cada dispositivo tiene su dirección determinada mediante los pines A0, A1 y A2;
solamente responderá la memoria cuya dirección coincida con la dirección que va encabe-
zando la trama de información. En la figura 2.21 se muestra la capacidad de almacena-
miento de estos dispositivos y las posibilidades de direccionamiento que tienen.
Ejemplo de aplicación
El ejercicio consiste en hacer un contador de 0 a 9 con un interruptor pulsador y un
display de siete segmentos, similar al ejercicio de la figura 2.4. La diferencia radica
en que el número que se muestra en el display se va a almacenar simultáneamente en
una memoria 24LC01 (LC quiere decir que puede trabajar desde 2 voltios). Se va a
utilizar un microcontrolador PIC16F84 (aunque se puede utilizar un 16C61 o 16C71).
SCL
SDA
1 0 1 0 A2 A1 A0 W Ack A7 A6 A5 A4 A3 A2 A1 A0 Ack
1 2 3 4 5 6 7 *
1. Start bit 5. Reconocimiento enviado por la memoria
2. Código 1010 (propio de las 24XX) 6. Dirección de memoria que se va a trabajar
3. Dirección del dispositivo en el bus 7. Reconocimiento enviado por la memoria
4. W = 0 para escribir
A. Forma de direccionar la memoria 24XX
SCL
SCL
SDA
1 0 1 0 A2 A1 A0 R Ack d7 d6 d5 d4 d3 d2 d1 d0 Ack d7
SD
*1 2 3 4 5 6 7 8
C. Lectura de byte
Figura 2.22. Diagrama de tiempos para la lectura y la escritura
en una memoria 24LCXX
+5V
24LC01 +5V
1 8 +5V +5V
A0 VCC
2 7 14 16
A1 WP 4.7K
3 6 13 VDD VCC Cátodo común
A2 SCL RB7 RA3
2 6 D a 13
12
4
VSS SDA
5 RB6 RA2 1 2 C b 12
+5V
11 RB5 RA1 18 1 B c 11
10 RB4 17 7 d 10
RA0 A
READ 9 RB3 9
9368 e
+5V
8 PIC16F84 15
RB2 f
1K 7
RB1 RA4/TOCKI
3 g 14
READ/WRITE GND
6
RB0 3 8 +5V
20pF
MCLR 4
16 2N3906
OSC1 +5V 2.7K
4MHz 15
OSC2 10K
VSS 100Ω RESET
20pF 5
nop
nop
nop
nop
decfsz loops2 ;pregunta si termino 1 ms
goto top
decfsz loops ;pregunta si termina el retardo
goto top2
retlw 0
BITOUT ;Esta rutina toma el bit que se debe transmitir y lo saca al puerto
movlw b’00111111' ;además genera el pulso de reloj
tris ptob ;programa reloj y datos como salidas
bsf ptob,sdata ;asume que el bit es alto
btfss eeprom,do ;pregunta estado del bit a transmitir
bcf ptob,sdata ;si el bit es bajo pone la salida en bajo
clkout nop
nop
bsf ptob,sclk ;sube el nivel de la línea de reloj
nop ;para formar el pulso
nop
nop
nop
bcf ptob,sclk ;termina pulso de reloj
retlw 0
end ;
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
lisegundos luego de escribir un dato en la memoria. Se debe tener en cuenta que los
retardos están calculados para un oscilador de 4 MHz en el microcontrolador.
Cada vez que se enciende el sistema el microcontrolador lee el dato que se en-
cuentra en la primera posición de memoria y lo pasa al display. Cuando el pulsador
sea oprimido se debe incrementar dicho dato y se actualiza el display al tiempo que
se vuelve a almacenar ese número en la memoria. Un caso especial ocurre cuando se
enciende el sistema por primera vez, como el dato que se encuentra grabado en la
memoria es desconocido y podría ser superior a 9, este se debe probar y si se encuen-
tra que es mayor, se borra y se empieza el conteo en 0.
Las rutinas que permiten leer y escribir en la memoria 24LC01se pueden utilizar
como parte de cualquier programa sin que se tengan contratiempos, sólo se debe
tener en cuenta que las temporizaciones están calculadas para un oscilador de 4
MHz. Con las rutinas LEER y ESCRIB se tiene una velocidad de transferencia de
información de aproximadamente 60 kHz.
• La figura 2.25 muestra dos tipos de configuración de pines que se encuentran co-
múnmente, aunque cambian su ubicación, estos conservan las mismas funciones.
Algunos módulos LCD tienen luz posterior o “backlight”, para mejorar su visualiza-
Pin 14 Pin 1
Pin 14
Pin 1
ción, ésta se maneja a través de dos pines que normalmente se conectan a +5V y a
tierra. Para evitar que se presenten altas temperaturas, debido a la luz posterior, estos
pines se deben manejar de manera pulsante (encendiendo y apagando), con una fre-
cuencia de aproximadamente 60 Hz. Otra opción mucho más sencilla es utilizar una
resistencia de 10 ohmios (a 1/2W) para alimentar el positivo del backlight.
• Los pines de conexión de estos módulos incluyen un bus de datos de 8 bits, un pin
de habilitación (E), un pin de selección, que indica que el dato es una instrucción
o un caracter del mensaje (RS) y un pin que indica si se va a escribir o leer en el
módulo LCD (R/W). La figura 2.26 describe la función de cada uno de ellos.
RS
a) Instrucción
de control
R/W 450ns
140ns
E
BUS_DATOS VALIDO
RS
b) Dato
R/W 450ns
140ns
E
BUS_DATOS VALIDO
• Según la operación que se desee realizar sobre el módulo de cristal líquido, los
pines de control E, RS y R/W deben tener un estado determinado. Además, debe
tener en el bus de datos un código que indique un caracter para mostrar en la
pantalla o una instrucción de control. En la figura 2.27 se muestra el diagrama de
tiempos que se debe cumplir para manejar el módulo.
Encender/apagar pantalla 0 0 0 0 0 0 1 D C B Configura el estado ON/OFF de todo el display (D), el cursor (C) y
el parpadeo del caracter en la posición del cursor.
Acticar función 0 0 0 0 1 D/L N F * * Configura el tamaño de la interface (DL), el número de líneas del display
(N) y la fuente del caracter (F). N=0, 1 línea N=1, 2 líneas
0 0 BF Lectura de la bandera Busy Flag, indicando que operaciones internas son realizadas,
Bandera de ocupado AC
y lectura de los contenidos del contador de direcciones.
1 0 Escribe datos en la RAM DD o en la RAM CG.
Escritura CG RAM/DD RAM Escritura de Dato
LECTURA CG RAM/DD RAM 1 1 Lectura de Dato Lectura de datos desde la RAM DD o la RAM CG
C = 1 Activar cursor
= 0 Desactivar cursor
B = 1 Parpadea caracter señalado por el cursor
= 0 No parpadea el caracter
S/C = 1 Desplaza pantalla
= 0 Mueve cursor
RL = 1 Desplazamiento a la derecha
Figura 2.28. Conjunto de = 0 Desplazamiento a izquierda
DL = 1 Datos de ocho bits
instrucciones de los = 0 Datos de cuatro bits
módulos LCD BF = 1 Durante operación interna del módulo
= 0 Finalizada la operación interna
00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 10H ... 1FH
R E V I S T A E & C
20H 52H 45H 56H 49H 53H 54H 41H 20H 20H 45H 20H 26H 20H 43H 20H
40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH 50H ... 5FH
A N I V E R S A R I 0 # 3
20H 41H 4EH 49H 56H 45H 52H 53H 41H 52H 49H 4FH 20H 23H 33H 20H
• Es importante anotar que sólo se pueden mostrar caracteres ASCII de 7 bits, por lo
tanto algunos caracteres especiales no se pueden ver (se debe tener a la mano una
tabla de los caracteres ASCII para conocer los datos que son prohibidos) . Por otra
parte, se tiene la opción de crear caracteres especiales (creados por el programa-
dor), y almacenarlos en la memoria RAM que posee el módulo.
Para estos ejercicios en particular, sólo nos interesa escribir datos en la pantalla
(no hacer lectura); por lo tanto el pin de selección de lectura/escritura (R/W) en el
display, se conecta a tierra. El puerto B del microcontrolador se utiliza como bus de
datos, y el puerto A se encarga de generar las señales de control.
En la figura 2.31 se muestra el listado del programa. Para este caso, el ejemplo
consiste en hacer circular un mensaje en la línea superior de la pantalla. La explica-
ción de los pasos contenidos en él es la siguiente:
teres. El dato se puede deducir con la lista de las instrucciones que se muestra en la
figura 3. La rutina llamada CONTROL, se encarga de generar las señales y los
tiempos necesarios para que exista una correcta comunicación.
3. El segundo dato (07H), le dice al módulo que el mensaje se va a desplazar en la
pantalla.
4. El tercer dato (0CH), hace que se encienda el display.
5. El siguiente paso es entrar en un ciclo que hace una lectura de la tabla donde se
encuentra el mensaje y lo lleva a la memoria del módulo LCD. Cuando se termina
de enviar todos los caracteres, se inicia el ciclo nuevamente.
14 2
VDD MCLR +VCC
13 14
RB7 D7
12 13
RB6 D6
20pF 16 11 12
OSC1 RB5 D5
4 MHz 10 11
Módulo LCD
RB4 D4 +5V
OSC2 9 10
15 RB3 D3
PIC16F84
20pF
8 9
RB2 D2 3
VO 5KΩ
RB1 7 8 D1
+5V RB0 6 7 D0
10K Ajuste de
18 6 contraste
100Ω RA1 E
RESET 4 MCLR 17 4
RA0 RS
VSS R/W GND
5 5 1
En la figura 2.33 se muestra el listado del programa que realiza la tarea descrita
anteriormente, este sufre unas modificaciones respecto al ejemplo anterior. Los pa-
sos más importantes son:
+5V +5V
14 2
VDD +VCC
13 14
RB7 D7
12 13
RB6 D6
20pF 16 11 12
OSC1 RB5 D5
4 MHz 10 11
Módulo LCD
RB4 D4 +5V
OSC2
15
PIC16F84
20pF
3
VO 5KΩ
+5V
10K Ajuste de
7 6
RESET 100Ω RB1 E contraste
4 MCLR 6 4
RB0 RS
VSS R/W GND
5 5 1
btfss status,z
goto limpi
retlw 0
call control
movlw 28h ;display a 4 bits y 2 lineas
call control
movlw 0ch ;activa display
call control
movlw 06h ;hace que el mensaje permanezca fijo
call control
encarga de generar las señales y los tiempos necesarios para que exista una correc-
ta comunicación. Debe notarse que esta rutina ha cambiado respecto al primer
ejemplo.
4. El tercer dato (0CH), hace que se encienda el display.
5. El cuarto dato (06H), le indica al módulo LCD que el mensaje debe permanecer
fijo en la pantalla. Recuerde que en el ejemplo anterior, para desplazarlo se usó el
dato 07H.
6. El siguiente paso, es entrar en un ciclo que hace un borrado de la pantalla (con la
subrutina BLANK) y luego una lectura de la tabla donde se encuentra el mensaje,
para llevarlo a la memoria del módulo LCD. Esta lectura incluye una verificación
del momento en que se llena la primera línea de caracteres, con el fin de ubicar el
puntero de la RAM del módulo LCD, en la segunda línea de caracteres. Para esto
se envía el comando C0H al display (este dato se puede deducir observando la lista
de instrucciones de la figura 3).
Los módulos LCD tienen una instrucción especial para borrar la pantalla (co-
mando 01H), pero en las pruebas que se realizaron en diferentes tipos de módulo se
encontró que algunos no la aceptaban y otros requerían retardos diferentes. Por lo
tanto, se optó por hacer el borrado con una subrutina llamada LIMPIA, la cual se
encarga de mandar el dato correspondiente a un espacio en blanco (20H) a cada
posición de memoria del módulo.
0V
Bit de 1 2 3 4 5 6 7 8 Bit de
arranque parada
Orden de los Bits
Figura 2.34. Estructura de un caracter que se transmite serialmente
Ante la gran variedad de equipos, sistemas y protocolos que existen surgió la nece-
sidad de un acuerdo que permitiera que los equipos de varios fabricantes pudieran comuni-
carse entre sí. A principios de los años sesenta se desarrollaron varias normas que preten-
dían hacer compatibles los equipos, pero en 1962 se publicó la que se convirtió en la más
popular: la norma RS-232. Esta norma define la interface mecánica, las características, los
pines, las señales y los protocolos que debía cumplir la comunicación serial. La norma ha
sufrido algunas revisiones, como la RS-232C en 1969 y la la EIA/TIA-232E en 1991.
15 V
0
5V
0V Indeterminado
–5 V
1
–15 V
De todas maneras, todas las normas RS-232 cumplen básicamente con los mis-
mos niveles de voltaje, como se puede observar en la figura 2.35:
Por lo tanto, deben existir dispositivos que permitan convertir niveles TTL a
niveles RS-232 y viceversa. Los primeros dispositivos utilizados fueron los drivers
MC1488 y los receivers MC1489 de Motorola, de los que se desarrollaron versiones
mejoradas como los SN75188, SN75189 de Texas Instruments y algunos similares
de otros fabricantes. Todos los dispositivos nombrados anteriormente necesitan tres
voltajes diferentes para su operación cuando el equipo actúa como transmisor y
receptor, lo cual no representa ningún problema en computadores tipo PC, ya que se
disponen de estos voltajes en la fuente. Pero cuando se trata de sistemas de micro-
controladores, en las cuales el espacio es importante y no se puede disponer de
voltajes diferentes a 5 voltios, estos circuitos integrados no se pueden utilizar. Para
esto se han desarrollado alternativas muy útiles, como el integrado MAX232 que
describiremos más adelante.
Se debe tener presente que la norma RS-232 fue desarrollada hace más de
30 años, época en la cual los requirimientos y las capacidades de los equipos eran
diferentes. En la actualidad esta norma es un poco limitada, tanto para la distancia
a la cual se puede transmitir, como para la velocidad y número de transmisores y
receptores que pueden estar simultáneamente conectados. Existen otras normas
para la comunicación serial, en la cual se incrementa el número de trasmisores o
receptores, la velocidad de transmisión, la distancia, etc. Pero a pesar de esto, los
principios rectores siguen siendo los mismos de la comunicación asincrónica y de
la interface RS-232.
lógico 0 y voltajes mayores a 2.0 para representar el valor lógico 1. Por lo general,
cuando se trabaja con familias TTL y CMOS se asume que un “0” es igual a cero
voltios y un “1” a +5 V.
TRANSMITE RECIBE
-V -V
1 > 2.0V 1 > 2.0V
0 < 0.8V 0 < 0.8V
+V +V
RECIBE TRANSMITE
~
~
-V
-V
TIERRA
Bits de datos
0 0 0 1 1 0 1 0
+5V
MSB
LSB
0V
-5V
Bit de 1 2 3 4 5 6 7 8 Bit de
arranque parada
Orden de los Bits
Figura 2.37. Señal presente sobre una línea RS-232
Por lo general, se utiliza con las interfaces RS-232 cable multipar o cable ribbon
con un solo conductor como referencia de tierra. El ruido que se capta a través de la
línea aún puede originar problemas. Para reducir el efecto se suele conectar un con-
densador en paralelo con la salida del circuito transmisor. Según las reglamentación,
los estándares de la interface RS-232 permiten una separación máxima de 15 metros
a una velocidad de transmisión no mayor a 9.6 kbps (kilo bits por segundo). Sin
embargo, se realizan conexiones a distancias mayores sin problema alguno. En la
figura 2.38 se muestran los conectores de la interface RS-232.
El MAX232
Este circuito integrado soluciona los problemas de niveles de voltaje cuando se
requiere enviar señales digitales sobre una línea RS-232. El MAX232 se usa en
aquellas aplicaciones donde no se dispone de fuentes dobles de ±12 voltios; por
CAPACITANCIA (µF)
12 R1OUT R1IN 13
DISPOSITIVO C1 C2 C3 C4 C5
MAX220 4.7 4.7 10 10 4.7 SALIDAS 5K ENTRADAS
MAX232 1.0 1.0 1.0 1.0 1.0 TTL/CMOS 9 R2OUT
R2IN 8 RS-232
MAX232A 0.1 0.1 0.1 0.1 0.1
5K
GND
15
Una aplicación clásica consiste en conectar las salidas para trasmisión serial TX
y RX de un microcontrolador a una interface RS-232 con el fin de intercambiar
información con una computadora. La mayoría de los sistemas concentradores de da-
tos están compuestos por sensores conectados a microcontroladores que, a su vez, vía
RS-232 le comunican los datos recolectados a un computador central. El MAX232
implementa la interface con la misma fuente de alimentación de +5 voltios. En la
figura 2.41 se ilustra la conexión serial de un microcontrolador a través del MAX232.
LIMITES:
Fuente de alimentación -0.3 a +6V
Voltajes de entrada:
Tin -0.3V a ( VCC - 0.3V)
Rin ± 30V
Voltajes de salida:
Tout ±15V
Rout -0.3V a (Vcc + 0.3V)
Protección Corto Continua
Disipación de Potencia 842 mW
RECEPTOR
Rango de entrada ±30V
Entrada BAJA 0.8V 1.3V
Entrada ALTA 1.8V 2.4V
Resistencia de Entrada 3KΩ 5KΩ 7KΩ
+VCC
VCC
2 +
1 10 µF
16 -
MICROCONTROLADOR
+ C1+ +5V
10 µF +
- 3 - 10 µF
C1-
11 T1OUT 14
T1IN 13
12 RS-232
9 R1OUT R2IN 8 IN
RX R2OUT
TX
10 T2OUT 7 OUT
T2IN
4 15
+ C2+ GND + GND
10 µF - 5 C2- MAX232 - 10 µF
GND
+5V
MAX232
+5V
+ 1 C1+ VCC 16 + +5V +5V
10µF 2 10µF
+ V+ GND 15 16
3 C1- VDD 6 D VCC 13 Cátodo común
10µF T1OUT 14 RB7 RA3 a
4 C2+ 2 C 12
+ T11N 13 RB6 RA2 b
10µF 5 1 B 11
C2- R1OUT 12 RB5 RA1 c
+ 6 V- 7 A 10
T11N 11 RB4 RA0 d
7 T2OUT 9
T2IN 10 +5V RB3 9368 e
8 R21N PIC16F84 15
R2OUT 9 RB2 f
1K 3 14
5 RB1 RA4/TOCKI g
9 GND
4 RB0 3 8 +5V
8
3 Hacer estos 20pF 4
MCLR 2N3906
7 puentes en el +5V 2.7K
2 conector OSC1
6 4MHz
1 OSC2 10K
Conector DB9 VSS 100Ω
hembra RESET
20pF
Conectar al
computador
Dado que la conexión hacia la computadora se realiza con un conector de 9 pines, esta
se puede hacer directamente al puerto COM1 (de 9 pines), donde normalmente se conecta
el mouse. Si se desea que este permanezca en su sitio, se requiere un adaptador RS-232 de
9 a 25 pines para que se pueda hacer la conexión al COM2 (de 25 pines).
Una característica bien importante del programa es que al dato que se envía
hacia la computadora se le ha sumado la constante 30h (48 en decimal), esto se
hace para convertir el dato decimal en su caracter ASCII equivalente. Se hace la
conversión porque en transmisiones seriales es más común trabajar con caracteres
de este tipo, además cuando la computadora lo reciba, se puede pasar directamen-
te a la pantalla.
siguiente significado:
cmd Especifica la operación a realizar
abyte Es un caracter que se envia o recibe por el puerto serial
port Es la identificación del puerto serial (desde 0 para COM1
hasta 3 para COM4)
Para la inicialización del puerto, el caracter abyte toma los siguientes valores y
los suma para obtener el dato correspondiente:
Para configurar el puerto con algunos parámetros, bastará con realizar una ope-
ración OR con los deseados, por ejemplo, para el mismo ejemplo anterior, bastará
con seleccionar la palabra dada por:
o lo que es equivalente,
abyte = 0x83
Curso avanzado de Microcontroladores PIC • 73
Capítulo 2. Proyectos con el PIC16F84
Para configurar el puerto COM1 con los parámetros del ejemplo dado ante-
riormente, bastará con la instrucción:
Los programas en lenguaje C tienen su programa fuente con extensión .C, en este
caso el programa que recibe los datos del microcontrolador por el puerto COM1 se
llama RECIBE1.C. El programa que puede ejecutar el usuario se llama RECIBE1.EXE
y se puede correr desde el sistema operativo DOS. El listado completo se muestra en
la figura 2.44. Si se desea recibir los datos por el COM2 se debe usar la versión del
programa llamada RECIBE2.C y RECIBE2.EXE que también van en el disquete que
acompaña el curso. En la figura 2.45 se muestra un pantallazo del programa.
/* LA COMPUTADORA RECIBE LOS DATOS SERIALES ENVIADOS POR EL PIC */
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <bios.h>
int puerto,COM1,COM2;
int k,j,dato; /*definición de variables*/
int config;
int COM1,COM2;
char lectura[1];
char dato1[2];
char leer()
{
do{
dato=bioscom(2,0x83,puerto); /*leer dato recibido*/
} while (((dato<31)|(dato>127))&(!kbhit()));
return(dato);
}
void main(void)
{
COM1=0;
COM2=1;
puerto=COM1; /* definir cual puerto se utiliza */
clrscr(); /*limpiar pantalla*/
config=0x83; /*configurar puerto: 1200 baudios,dato de 8 bits,
no paridad, 1 bit de parada*/
bioscom(0,config,puerto); /*configuracion de los puertos*/
gotoxy(14,4);
printf("Curso de Microcontroladores PIC - CEKIT");
gotoxy(8,6);
printf("La computadora recibe los datos enviados por el micro - COM1");
gotoxy(29,8);
printf("Escape = Salir");
gotoxy(23,10);
printf("El dato del contador es:");
do{
if(!kbhit()) dato1[0]=leer();
if(!kbhit())
{
gotoxy(40,12);
printf("%1s",dato1);
}
}while(!kbhit());
clrscr();
printf("Elaborado por: Edison Duque");
}
Aquí son válidas todas las consideraciones que se hicieron en el ejemplo ante-
rior, por lo tanto dejamos al lector la tarea de estudiar el programa. En la figura 2.46
se muestra el listado completo con sus respectivos comentarios. Se debe notar que al
dato recibido se le resta el valor 30h (48 decimal) porque se supone que la computa-
dora envía es el caracter ASCII del número.
unoymedio ;rutina para retardar bit y medio con un cristal de 4.00 mhz.
movlw .249 ;carga para 1250 µseg. aproximadamente
goto startup ;ir a ejecutar el tiempo
delay1 movlw .166 ;carga para 833 µs aproximadamente
startup movwf r0e ;llevar valor de carga al retardo
redo nop ;limpiar circuito de vigilancia
nop
decfsz r0e ;decrementar retardo, saltar si cero
goto redo ;repetir hasta terminar
retlw 0 ;retornar
recibir nop
clrf recep ;limpiar registro de recepción
btfsc ptob,rx ;l¡nea de recepción est en bajo?
goto recibir ;si no lo est , volver a leer
call unoymedio ;llamar rutina uno y medio bits
rcvr movlw 8 ;cargar contador con
movwf conta ;el número de bits
rnext bcf status,c ;limpiar carry
btfsc ptob,rx ;preguntar por el estado de la l¡nea
bsf status,c ;activar carry si está en alto
rrf recep ;rotar registro de recepción
call delay1 ;llamar rutina de un bit
decfsz conta ;decrementar contador, saltar si cero
goto rnext ;repetir hasta completar dato
retlw 0 ;retornar
En la instrucción que envía el dato del conteo se suma el valor 30h (48 decimal),
para convertir el número del contador en su equivalente ASCII.
#include <conio.h>
#include <stdio.h>
#include <bios.h>
void main(void)
{
clrscr(); /*limpiar pantalla*/
COM1=0; /*constantes de los puertos del PC*/
COM2=1;
Puerto=COM1; /*Indicar si es COM1 o COM2*/
gotoxy(20,2);
printf(« Curso de Microcontroladores PIC «);
gotoxy(8,5);
printf("Envio de datos seriales hacia el microcontrolador - COM1");
gotoxy(10,7);
printf("Enter = Incremento del contador Escape = Salir");
gotoxy(24,10);
printf("El dato del contador es:");
contador=0;
while(!kbhit());
clrscr();
printf("Elaborado por: Edison Duque");
+5V +5V
Cátodo común
VDD VCC
RB7 RA3 D a
RB6 RA2 C b
RB4 RA0 A d
1K
RB3 9368 e
RB2 PIC16F84 f
RB1 RA4/TOCKI g
3 GND
RB0/INT
20pF +5V
MCLR 2.7K
OSC1 +5V 2N3904
OSC2 10K
VSS
100Ω RESET
20pF
Figura 2.49. Circuito del contador decimal que se utiliza en los ejercicios
Si el bit GIE (Global Interrupt Enable) se coloca en 0 deshabilita todas las inte-
rrupciones. Cuando una interrupción es atendida el bit GIE se coloca en 0 automáti-
camente para deshabilitar otras interrupciones que se puedan presentar, la dirección
actual del PC se carga en la pila o stack y el PC se carga con el valor 04h, por lo
tanto, la parte del programa que atiende las interrupciones se debe esribir a partir de
dicha dirección. Una vez en la rutina de servicio, la fuente de interrupción se puede
determinar examinando las banderas. Como la bandera que indica la causa se en-
cuentra en "1", el programa debe encargarse de ponerla en "0" nuevamente antes de
salir de la rutina que atiende las interrupciones, esto es para evitar que se vuelva a
atender la misma interrupción en repetidas veces.
Interrupción externa. Actúa en el pin RB0/INT y puede ser configurada para acti-
varse con el flanco de subida o el de bajada, de acuerdo al bit INTEDG del registro
OPTION, figura 1.15. Cuando se presenta un flanco válido en el pin INT, la bandera
INTF (INTCON,1) se coloca en "1" y el contador de programa o PC salta a la direc-
ción 04h. En ese momento se puede hacer la verificación de la causa de la interrup-
ción consultando el estado de la bandera, si es del caso también se debe probar el
estado de alguno de los pines del microcontrolador para confirmar. La interrupción
se puede habilitar o deshabilitar utilizando el bit de control INTE (INTCON,4) en
"0". Cuando se atiende la interrupción en la rutina de servicio, el programa debe
poner la bandera INTF en "0", antes de regresar al programa principal.
- Una subrutina de retardo de 100 milisegundos que sirve para comprobar que el
pulsador si fue oprimido y descartar los pulsos de rebote.
- Al inicio se programan los puertos en los registros TRISA y TRISB, al igual que se
habilita la interrupción externa con los bits respectivos en registro INTCON y
OPTION.
- El ciclo en que se queda enclavado el programa principal no hace nada, solamente
esperar a que se presente la interrupción para atenderla.
- La rutina que atiende la interrupción comprueba que el pulsador esté oprimido,
además de probar que se haya activado la bandera correspondiente a la interrup-
ción externa. Si las condiciones son favorables, se incrementa el contador y por lo
tanto el número que se muestra en el display.
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
Cuando el conteo del temporizador llega a 0FFh y pasa a 00h se genera una
interrupción (siempre y cuando esté habilitada), el bit TOIF (INTCON,2) se pondrá
en "1". El bit de control respectivo es TOIE (INTCON,5).
El ejercicio que realizamos para esta prueba consiste en el incremento del tem-
porizador por medio del reloj interno del microcontrolador, dicho conteo está afec-
tado por la máxima preescala que se puede seleccionar (división por 256). Como el
oscilador es un cristal de 4 MHz se tiene un ciclo de instrucción de 1 microsegundo,
por lo tanto, dado que el registro TMR0 es de 8 bits y que la preescala es de 256 , el
tiempo que se tarda en contar hasta 0FFh es de 256x256 microsegundos, es decir
65.536 microsegundos.
El tiempo logrado es muy pequeño para ser percibido , por lo que recurrimos a
establecer un contador dentro de la rutina que atiende las interrupciones, este se
incrementa cada vez que el programa pase por ese sitio, es decir cada 65,5 milise-
gundos. Cuando llegue a 10 hará que se incremente el contador decimal que se ha
venido tratando en los otros ejercicios. De esta manera el experimentador verá que
el display se incrementa cada 0.65 segundos aproximadamente.
En el programa que se muestra en la figura 2.52 se explica cada uno de los pasos
que se llevan a cabo. Los valores con que al inicio se programan el registro INT-
CON y el registro OPTION, se pueden comparar con las tablas que se muestran en
las figuras 1.14 y 1.15 para entender mejor la función de cada uno de ellos.
De esta manera comprobamos que el micro se está reseteando cada vez que
termina el conteo del watchdog y no se utiliza la instrucción CLRWDT para reini-
ciarlo. Luego de esta prueba quitamos el punto y coma ( ;) que precede a la instruc-
ción CLRWDT con el objeto de habilitarla. En este caso el display no cambia de
estado, lo que nos demuestra que el microcontrolador no está sufriendo reset como
en el caso anterior.
La lectura toma un ciclo del reloj de instrucciones (en este caso un microsegun-
do), mientras que la escritura, por ser controlada por un temporizador incorporado y
requerir una operación previa de borrado de la posición de interés, tiene un tiempo
nominal de 10 milisegundos; este tiempo puede variar con la temperatura y el volta-
je. Según el fabricante, el número típico de ciclos de borrado/escritura de la EE-
PROM de datos es de 1’000.000 (un millón).
goto ini2 ;
end ;
;======================================================================
; Fusibles de programación
; Osc XT
; Watchdog OFF
; Code protect OFF
; Power-Up-Timer ON
; Micro. PIC16F84
;======================================================================
+VCC
Rojos
Negros
Gris Gris
Amarillo
Amarillo
Q1 Q2 Q3 Q4
Este tipo de motores tiene la ventaja de operar con una sola fuente, mientras que
los motores de dos bobinas requieren polaridad positiva y negativa, haciéndose
necesario utilizar circuitos en puente. En la figura 2.55 también se muestra la forma
de conectar el motor de 8 cables. Debe notarse que los cables rojos y negros se unen
para conectarlos a la fuente positiva. De aquí se puede deducir como sería la co-
nexión para 6 y 5 cables. El transistor que se utiliza para activar las bobinas es el
típico TIP122, que es un Darlington con protección para el manejo de cargas induc-
tivas (diodo interno). Nótese que se ha invertido el orden de las bobinas de los
transistores Q2 y Q3.
Q1
Q2
Q3
Q4
(a)
Q1
Q2
Q3
Q4
(b)
Figura 2.56. Secuencias para manejar las bobinas del motor de paso.
a) una fase, b) dos fases
20pF 20pF
4MHz +5V
Conectar los
transistores a las
Q1 bobinas del motor 3.3K
TIP122
RA1
RA0
OSC2
OSC1
VDD
RB7
RB6
RB5
RB4
Q2 3.3K
TIP122
PIC16F84
RA4/TOCKI
Q3 3.3K
TIP122
MCLR
RA2
RA3
RB0
RB1
RB2
RB3
3.3K
VSS
Q4
TIP122
Q4 Q3 Q2 Q1
1 1 0 0
0 1 1 0 +5V
0 0 1 1
1 0 0 1
Figura 2.57. Diagrama del circuito para mover el motor a paso completo
Si se desea que el motor gire en sentido contrario al que se logró con la secuencia
anterior, sólo se debe invertir la secuencia, es decir, leer la tabla en sentido inverso
(de abajo hacia arriba). Cuando el motor no está en movimiento se debe garantizar
que todas las bobinas estén desenergizadas. Esto se hace con el fin de evitar posibles
daños del motor.
RA0
OSC2
OSC1
VDD
RB7
RB6
RB5
RB4
Q2 3.3K
TIP122
PIC16F84
RA4/TOCKI
Q3 3.3K
TIP122
MCLR
RA2
RA3
RB0
RB1
RB2
RB3
3.3K
VSS
Q4 Q3 Q2 Q1 Q4
1 0 0 1 TIP122
1 0 0 0
1 1 0 0
0 1 0 0
0 1 1 0
0 0 1 0 +5V
0 0 1 1
0 0 0 1
Para este ejercicio la idea es hacer que el motor gire en el sentido que se le indique
oprimiendo uno de los dos pulsadores dispuestos para tal fin. El motor debe moverse
tanto tiempo como esté oprimido el interruptor correspondiente. Para este ejercicio
empleamos el mismo circuito del ejemplo anterior, pero con unas pequeñas variacio-
nes. En la figura 2.59 se muestra el diagrama esquemático del circuito de control.
En los pines RB7 y RB6 del microcontrolador se han dispuesto los interruptores
pulsadores que se encargan de controlar el sentido y la duración del movimiento.
Además, en la gráfica se incluye la tabla con la secuencia que se requiere para que el
motor pueda moverse a 1/2 paso. Como se ve, ahora la tabla tiene ocho valores
diferentes. El microcontrolador se debe encargar de hacer la lectura de dichos valo-
res en orden ascendente o descendente para obtener el valor que debe entregar por el
puerto A para manejar las bobinas del motor.
END
contiene los valores que se deben entregar por el puerto del microcontrolador para
energizar las bobinas correspondientes. Esta tabla es la que se debe modificar para
conseguir movimiento a 1/4 o 1/8 de paso.
Como parte del ejercicio, el estudiante podría insertar un retardo entre cada mo-
vimiento (llamando una subrutina con un retardo largo), para ver en detalle como se
mueve el motor y comprobar que en un círculo completo se tienen 96 escalas o
posiciones de reposo.