TARJETA DE DESARROLLO PARA PUERTO PARALELO LPT BYM V2.0
Manual de referencia
Soluciones Electrónicas Integradas BYM
INDICE:
Nº Pagina
1. Introducción.
6
2. Listado de componentes de la tarjeta LPT- BYM.
7
3. Equipo de Experimentos DISEN-EXP.
8
4. Puertos de E/S de la Tarjeta LPT- BYM.
9
5. Descripción del PPI 82C55 de la Tarjeta LPT- BYM.
10
5.1 Modos de Operación del PPI.
11
5.2 Programación del PPI.
11
6. Descripción del TIMER 82C54 de la Tarjeta LPT- BYM
13
6.1 Modos de Operación del TIMER
14
6.2 Programación del TIMER
15
7. Descripción del Conversor Análogo Digital ADC0804 de la Tarjeta LPT- BYM
19
8. Descripción del Conversor Digital Análogo DAC0830 de la Tarjeta LPT- BYM
22
8.1 Estructura interna del ADC030
22
9. Sistema Operativo y uso de la Tarjeta LPT ByM
24
9.1 Uso del UserPort (Win2000 o WinXP)
24
9.2 Estructura de un programa en Lenguaje C
25
10. Aplicaciones del PPI 82C55
26
10.1 LEDS y DIPSWITCH
26
• • •
•
Programa 10.1: Lectura del dato de un dipswitch de 8 bits conectado al PORTB y lo envía por el PORTA para ser visualizado en 8 leds. Programa 10.2: Prende y apaga (intermitencia) 8 leds conectados al PORTA. Programa 10.3: Produce prendido secuencial a la izquierda y se apaga secuencialmente a la derecha. Programa 10.4: Prende secuencialmente los leds desde los extremos hacia el centro y luego se apaga hacia los extremos.
26 27 27 28
10.2 DISPLAY DE CRISTAL LÍQUIDO (LCD) •
29 29
Programa 10.5: Programa que envía 2 mensajes al LCD (manejo básico).
10.3 TECLADO HEXADECIMAL 4x4 • •
33
Programa 10.6: Lectura del teclado hexadecimal conectado al PORTC del PPI mediante exploración de teclas. El valor leído lo envía al PORTA. Programa 10.7: Manejo del Teclado hexadecimal conectado al PORTC del PPI usando el decodificador 74C922. El valor leído lo envía al PORTA.
34 37
10.4 DISPLAY 7 SEGMENTOS • •
38 39 40
Programa 10.8: Manejo de 4 displays multiplexados en el tiempo, conectados al PPI. Programa 10.9: Manejo de 8 displays multiplexados en el tiempo, conectados al PPI.
10.5 MOTOR DE PASO A PASO • • • •
42 42 44 45 46
Programa 10.10: Control de un motor de paso en modo paso completo. Programa 10.11: Control de un motor de paso en modo medio paso. Programa 10.12: Control de un motor de paso en modo una sola bobina. Programa 10.13: (PPI_13.CPP) Control de la velocidad de un motor de paso (paso completo).
Ing. Javier Barriga Hoyle
[email protected]
i
Soluciones Electrónicas Integradas BYM
11. Aplicaciones del TIMER 82C54
48
11.1 GENERACION DE SEÑALES A DIFERENTES FRECUENCIAS (MODO 2 y 3) • • • •
Programa 11.1: (TIMER_1.CPP) Programa 11.2: (TIMER_2.CPP) Programa 11.3: (TIMER_3.CPP) Programa 11.4: (TIMER_4.CPP)
48 48 49 50 52
Uso del TIMER en modo 2 y 3. Uso del TIMER en modo 3, cascada. Uso del comando de enclavamiento. Uso del comando Read-Back.
11.2 PROGRAMAS QUE GENERA SONIDO y PWM • • • •
53 53
Programa 11.5: (TIMER_5.CPP) Genera sonido en el parlante de la PC: Usar Turbo C++ 3.0. Programa 11.6: (TIMER_6.CPP) Genera sonido en el parlante conectado al TIMER de la tarjeta LPT. Programa 11.7: (TIMER_7.CPP) Control de la velocidad de un motor DC usando PWM a través del teclado de la computadora. Programa 11.8: (TIMER_8.CPP) Control de la velocidad de un motor DC usando PWM a través de un teclado 4x4 hexadecimal.
54 56 59
12. Aplicaciones del ADC 0804 (Sin interrupciones) • • • •
63
Programa 12.1: (ADC_1.CPP) Leer el voltaje de un potenciómetro (Técnica de espera). Programa 12.2: (ADC_2.CPP) Leer el voltaje de un potenciómetro (Técnica de polling). Programa 12.3: (ADC_3.CPP) Leer el voltaje de un potenciómetro y mostrarlo en un LCD (Técnica de polling). Programa 12.4: (ADC_4.CPP) Control de la velocidad de un motor DC usando PWM y un potenciómetro conectado al ADC.
63 65 66 70
13. Aplicaciones con interrupciones: Pulsadores, ADC0804, TIMER, etc.
73
13.1 Aplicaciones con interrupciones: Sistema Operativo Win2000 o WinXP. • •
•
73 73
Programa 13.1: (IRQ0_1.CPP) Cuenta las interrupciones producidas por la IRQ0. Programa 13.2: (IRQ0_2.CPP) Utiliza las interrupciones generadas por la IRQ0 para producir retardos. Programa 13.3: (IRQ0_3.CPP) Utiliza las interrupciones generadas por la IRQ0 para producir retardos en el desplazamiento de bits y también capturar datos analógicos.
74 76
13.2 Aplicaciones con interrupciones: Sistema Operativo Win98. • • • • • •
79
Programa 13.4: (IRQ7_1.CPP) Cuenta las interrupciones producidas por un pulsador sin rebotes conectado a la línea IRQ7. Programa 13.5: (IRQ7_2.CPP) Utiliza la IRQ7 para leer el dato del dipswitch conectado al PortB del PPI y lo muestra en PortA del PPI. Programa 13.6: (IRQ7_3.CPP) Muestra en el LCD el número de interrupciones generadas por la IRQ7, mientras la CPU desplaza bits por los LEDS del PortC. Programa 13.7: (IRQ7_4.CPP) Usa la técnica de interrupciones para leer el voltaje analógico del ADC (la línea IRQ7 se conecta al pin INTR del ADC). Programa 13.8: (IRQ7_5.CPP) Uso de las interrupciones IRQ7 (ADC) e IRQ0 (TIMER de la PC) para muestrear datos analógicos. Muestra en pantalla los datos leídos. Programa 13.9: (IRQ7_6.CPP) Uso de las interrupciones IRQ7 (ADC) e IRQ0 (TIMER de la PC) para muestrear datos analógicos. Almacena en un archivo de texto los datos leídos.
79 81 83 88 91 93
14. Aplicaciones del DAC 0830 • •
96
Programa 14.1: (DAC_1.CPP) Programa de prueba del DAC. Programa 14.2: (DAC_2.CPP) Programa que lee un voltaje del ADC0804, lo convierte a digital y luego lo envía al DAC0830 para que lo muestre el voltaje en un multímetro.
Apendices: A. Driver L293D. B. Temporizador 8253 de la PC. C. Modulación por Ancho de Pulsos (PWM). C.1 Generación de PWM con TIMER C.2 Driver L293D
Ing. Javier Barriga Hoyle
[email protected]
96 97 99 100 101 101 103
ii
Soluciones Electrónicas Integradas BYM
D. Interrupciones. D.1 Conceptos. D.2 Interrupciones en la PC D.3 Controlador de interrupciones programable PIC 8259ª D.4 Vectores de interrupción D.5 Instalación de vectores de interrupción D.6 Máscara de interrupción (IMR): D.7 Instalación de rutinas de servicio de interrupción (RSI) E. Esquematicos de algunos circuitos E.1 Salida de datos por LEDS E.2 Entrada de datos de 8 bits usando un dipswitch E.3 Displays (cuatro) multiplexados en BCD E.4 Displays (cuatro) multiplexados en HEXADECIMAL E.5 Displays (ocho) multiplexados en salida binaria codificada en software E.6 Control de un motor de pasos con el PORTA del PPI E.7 Control de un motor DC usando el TIMER (PWM) y el PPI
104 104 104 106 107 107 108 109 110 110 110 110 111 111 111 112
Bibliografía
112
Ing. Javier Barriga Hoyle
[email protected]
iii
Soluciones Electrónicas Integradas BYM
1. Introduccion Tarjeta de desarrollo para puerto paralelo LPT- BYM V2.0 Se trata de una tarjeta de circuito impreso metalizado de dimensiones 110x120 mm, provista de un conector DB25H para comunicarse con el puerto paralelo de la computadora. Contiene los siguientes Circuitos Integrados: (1) Interfase de puertos programables PPI 82C55, (1) Temporizador Programable TIMER 82C54, (1) Convertidor Análogo/Digital ADC0804 de 8 bits de resolución, (1) Convertidor Digital/Análogo de 8 bits de resolución, (1) Línea de conexión para generar interrupciones a través de la IRQ7 del computador. Todos los Circuitos Integrados que contiene la tarjeta sirven de soporte al microprocesador y microcontrolador, por lo tanto su estudio y el manejo práctico de estos, servirán para una buena formación del profesional, permitiéndole afrontar con éxito en el futuro cualquier diseño basado en microprocesadores o microcontroladores. La tarjeta se puede programar en Lenguaje Ensamblador o Lenguaje C (DOS o Windows), para ello se ha diseñado unas librerías de Macros y Funciones para cada uno de los lenguajes mencionados que permitirán manejar la tarjeta y cualquier aplicación que se desee realizar. La siguiente fotografía muestra la tarjeta LPT-BYM V2.0. El manual contiene el manejo y algunas aplicaciones que se le puede dar, así como la descripción de sus chips.
Fotografía 1. Tarjeta LPT-BYM V2.0 OBS: La tarjeta está diseñada para que pueda ser utilizada con el módulo de experimentos DISENEXP (fotografía 2), o desarrollar sus propias aplicaciones.
Ing. Javier Barriga Hoyle
[email protected]
1
Soluciones Electrónicas Integradas BYM
2. Lista de componentes de la tarjeta LPT- BYM V2.0 •
Circuitos Integrados: Se emplea Chips con tecnología CMOS. (U1) 74HC245 (U2) 74HC373 (U3) 74LS257 (U4) Interfase Periférica Programable – PPI 82C55 (U5) Temporizador / Contador Programable – TIMER 82C54 (U6) Convertidor Análogo Digital de 8 bits – ADC0804 (U7) Convertidor de Digital a Analógico de 8 bits – DAC0830
•
Componentes discretos. (OSC1) Oscilador de 8 MHz. (D1) Diodo 1N4007 (R2) Potenciómetro de 10 K. (R1,R3,R4) Resistencias de 10 K / ¼ de Vatio (C1) Condensador electrolítico de 10 µF / 25V (C2) Condensador cerámico monolítico de 150 pF / 50V (*) (C3,C4,C5,C6,C7) Condensadores cerámicos monolíticos de 1 nF / 25V (*) (C8) Condensador de Tantalum de 10 µF / 25V (*) (C9,C10,C11) Condensadores electrolíticos de 100 µF / 25V
•
Conectores. (1) Conector DB 25 pines hembra / 90º (PUERTO PARALELO) (3) Molex de 10 pines. (PORT_A, PORT_B, PORT_C)) (1) Molex de 4 pines. (IN_ADC) (1) Dipswitch de 4 bits. (SW TIMER) (1) Bornera de dos pines. (POWER) (1) Bornera de 4 pines. (IN_ADC) (1) Bornera de 5 pines. (DAC_OUT) (1) Bornera de 6 pines. (TIMER)
(*) Estos condensadores pueden ser también de otra calidad.
Ing. Javier Barriga Hoyle
[email protected]
2
Soluciones Electrónicas Integradas BYM
3. Equipo de Experimentos DISEN-EXP Permite la experimentación práctica con elementos reales de carácter analógico o digital. El equipo se describe completamente en el capítulo 10 del manual Aplicaciones prácticas con el µC 8051. Va montado en una caja de plástico de dimensiones: 260x185x75 mm, véase fotografía número 2. La caja incluye la fuente de alimentación. Los módulos de prácticas que incorpora son: • • • • • • • • • • • • • • •
Puerto de salida digital con 8 indicadores LED. Puerto de entrada digital con 8 interruptores con supresor de rebotes. Cuatro pulsadores (dos con rebotes y dos sin rebotes). Cuatro relés de doble contacto conmutado. Dos potenciómetros lineales (Valor analógico entre 0 y 5 V) Indicador analógico (vúmetro) con 10 diodos LED. Teclado matricial de 12 teclas. Display de cuatro dígitos de 7 segmentos. Display de cristal líquido (LCD) de 2 líneas de 16 caracteres. Generador de onda cuadrada con ajuste de los tiempos Ton y Toff. Emisor y Receptor de infrarrojos. Amplificador de audio y altavoz. Control de temperatura de un conjunto calefactor-termistor. Conjunto Motor DC, excitador para motor, y encoder óptico incremental. Regulación de luminosidad de una lámpara de 12 V por control de fase mediante triac.
Fotografía 2. Equipo de experimentos DISEN - EXP. Nota: Módulo desarrollado por el Ing. Javier Martínez Pérez, autor del libro “Prácticas con Microcontroladores de 8 bits: Aplicaciones industriales” Ing. Javier Barriga Hoyle
[email protected]
3
Soluciones Electrónicas Integradas BYM
4. Puertos de E/S de la Tarjeta LPT- BYM V2.0 La tarjeta ha sido diseñada de tal manera que todos los circuitos integrados principales operen como si estuvieran trabajando con el puerto ISA. Es decir, todos tienen una dirección de acceso independiente del puerto paralelo, que tiene su dirección base 378h. El siguiente cuadro muestra los puertos de E/S del PPI, TIMER, ADC y DAC. Circuitos Integrados DAC 0830 ADC 0804
Direcciones Puerto único = 5C h Puerto único = 6C h
TIMER 82C54
Canal 0 (CH0) = 74 h Canal 1 (CH1) = 75 h Canal 2 (CH2) = 76 h Registro de Control (RC) = 77 h
PPI 82C55
Puerto A (PA) = 78 h Puerto B (PB) = 79 h Puerto C (PC) = 7A h Registro de Control (RC) = 7B h
Cuadro 1. Mapeo de los Circuitos Integrados dentro del puerto paralelo. Las instrucciones diseñadas para el manejo de los puertos de E/S de la tarjeta son las siguientes: Lenguaje Ensamblador Para salida de datos por el puerto: XOUT
PUERTO, AL
Para entrada de datos por el puerto: XIN
AL, PUERTO
Donde: PUERTO: Es la dirección de E/S de cada circuito integrado (ver cuadro 1). AL: Es el registro que el Microprocesador emplea para enviar datos al exterior o para almacenar el dato leído desde el exterior. Lenguaje C Para salida de datos por el puerto: xout (puerto, dato);
Para entrada de datos por el puerto: y = xin (puerto);
Donde: puerto: Es la dirección de E/S de cada circuito integrado (ver cuadro 1). dato: Es el valor (constante tipo unsigned char) que el Microprocesador enviará hacia el exterior. y: Es una variable declarada como unsigned char, almacenará dato leído del puerto. Ing. Javier Barriga Hoyle
[email protected]
4
Soluciones Electrónicas Integradas BYM
5. Descripción del PPI 82C55 de la Tarjeta LPT- BYM V2.0 El Interfaz Periférico Programable PPI 82C55, es un dispositivo de E/S general, programable, capaz de controlar 3 puertos de 8 bits cada uno (24 líneas en total) con diferentes configuraciones de entrada/salida y en hasta 3 modos de operación. PA3 PA2 PA1 PA0 RD CS GND A1 A0 PC7 PC5 PC4 PC3 PC0 PC1 PC2 PC3 PB0 PB1 PB2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21
82C55
PA4 PA5 PA6 PA7 WR RESET D0 D1 D2 D3 D4 D5 D6 D7 VCC PB7 PB6 PB5 PB4 PB3
82C55 Bus de datos
D7-D0
Puerto A
PA
Puerto B
PB
Puerto C
PC
RD WR A1 A0 CS
Función de los pines A1 y A0 A1 0 0 1 1
A0 0 1 0 1
FUNCION Puerto A Puerto B Puerto C Registro de control
Figura 5.1. Diagramas del PPI 82C55 y función de los pines de control. R1
C1
J2 VCC
10k
34 33 32 31 30 29 28 27
SD0 SD1 SD2 SD3 SD4 SD5 SD6 SD7 P14 P1 A0 A1
RD WR
CS_PPI
5 36 9 8 35 6
10uF
U4 D0 D1 D2 D3 D4 D5 D6 D7 RD WR A0 A1 RESET CS
VCC
PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
37 38 39 40 1 2 3 4
PORT_A J3 VCC
25 24 23 22 21 20 19 18 10 11 12 13 17 16 15 14
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 PORT_B J4
VCC
82C55
1 2 3 4 5 6 7 8 9 10 PORT_C
Figura 5.2. Esquemático del PPI 82C55 dentro de la Tarjeta.
Ing. Javier Barriga Hoyle
[email protected]
5
Soluciones Electrónicas Integradas BYM
Los puertos del PPI se llaman normalmente: Puerto A (PA), Puerto B (PB), Puerto C (PC) y Puerto de configuración interno (RC).
5.1
Modos de Operación del PPI
El PPI presenta tres modos de operación: Modo 0, Modo 1 y Modo 2. •
Modo 0: (Entrada/Salida básica) En este modo, los puertos A, B y C pueden ser individualmente programados como puertos de entrada o salida. El puerto C es dividido en dos grupos de 4 bits, direccionables cada uno en forma independiente.
•
Modo 1: (Comunicación paralela unidireccional) En este modo el puerto A o el B funcionan como registros de entrada. Esto permite que los datos externos enviados se almacenen en el puerto hasta que el Procesador esté listo para leerlos. En cambio el puerto C se utiliza para gestionar las señales de reconocimiento o control que hacen funcionar al puerto A o al puerto B como puertos de entrada mediante una señal de habilitación estroboscópica.
•
Modo 2: (Comunicación paralela bidireccional) Este modo sólo es válido para el grupo A, donde el puerto A se vuelve bidireccional permitiendo transmitir y recibir datos en los 8 bits del bus. Los bits PC3, PC4, PC5, PC6 y PC7 son usadas como líneas de control en el protocolo de comunicación. Las 3 líneas restantes del puerto C, pueden estar como E/S convencionales. El puerto B, puede hacerlo en modo 0 o modo 1 simultáneamente al puerto A.
En este manual sólo vamos a utilizar el Modo 0, por ser el más empleado. Sin embargo, puede también usarse en los otros modos, para lo cual recomiendo leer bien la hoja de datos del fabricante.
5.2
Programación del PPI
Para utilizar el PPI en cualquier aplicación, lo primero que se tiene que hacer es configurarlo. Es decir, enviarle al puerto de configuración un valor (constante) obtenido de la figura 5.3a, donde se le indica la forma como va a operar cada puerto. Para programarlo sólo se emplea dos comandos básicos. Donde el bit 7 del registro de control selecciona los comandos A o B. •
Si el bit 7 = 1, el comando A es seleccionado, y sirve para programar la función del grupo A y B en modo 0, 1 o 2. 7
6
5
4
3
2
1
0
1 Grupo A
Grupo B
Modo 00 = modo 0 01 = modo 1 1X = modo 2
Puerto C (PC3 a PC0) 1 = entrada 0 = salida Puerto B 1 = entrada 0 = salida
Puerto A 1 = entrada 0 = salida
Modo 00 = modo 0 01 = modo 1
Puerto C (PC7 - PC4) 1 = entrada 0 = salida
Figura 5.3a. Byte de comando A. Ing. Javier Barriga Hoyle
[email protected]
6
Soluciones Electrónicas Integradas BYM
•
Si el bit 7 = 0, el comando B es seleccionado, y permite que cualquier bit del PC se active (1) o se desactive (0) si el 8255 se programa en el modo 1 o 2. 7
6
5
4
0
X
X
X
3
2
1
0
Activar y desactivar bit 1 = activar 0 = desactivar Selecciona un bit
Figura 5.3b. Byte de comando B. a)
CONFIGURACIÓN.- Para configurar el PPI se empleará la figura 3a.
La instrucción a emplear sería: xout
(0x7B, constante);
Donde: constante; es el obtenido de la palabra de control. 0x7B; es la dirección del puerto de configuración. Ejemplo 5.1: Configurar el PPI como: PA = entrada, PB = salida, y PC = entrada; MODO 0 Palabra de control:
1 0 0 1 1 0 0 1 = 99h
La instrucción sería:
xout (0x7B, 0x99);
Ejemplo 5.2: Configurar el PPI como: PA = salida, PB = entrada; MODO 1 (PC es no importa) Palabra de control:
1 0 1 0 X 1 1 X = A6h
La instrucción sería:
xout (0x7B, 0xA6);
Ejemplo 5.3: Configurar el PPI como: PA = salida; MODO 2 (PC es no importa) Palabra de control:
1 1 0 0 X 0 0 X = C0h
La instrucción sería:
xout (0x7B, 0xC0);
b) ESCRITURA: Para enviar cualquier dato de 8 bits en sus puertos, se puede hacer de 2 formas; (1) a través de una variable tipo char, y (2) enviar directamente el valor.
c)
Escribir en el PA:
xout (0x78, var);
o
xout (0x78, 0x00);
Escribir en el PB:
xout (0x79, var);
o
xout (0x79, 57);
Escribir en el PC:
xout (0x7A, var);
o
xout (0x7A, 0xFF);
LECTURA.- Para leer cualquier dato de 8 bits colocados en sus puertos es necesario designar una variable tipo unsigned char para almacenar el dato leído. Leer del PA:
y = xin (0x78);
// y, almacena dato leído del puerto.
Leer del PB:
z = xin (0x79);
// z, almacena dato leído del puerto.
Leer del PC:
p = xin (0x7A);
// p, almacena dato leído del puerto.
Ing. Javier Barriga Hoyle
[email protected]
7
Soluciones Electrónicas Integradas BYM
6. Descripción del TIMER 82C54 de la Tarjeta LPT- BYM V2.0 El Temporizador Programable TIMER 82C54, es un dispositivo de E/S que contiene tres contadores (temporizadores) de 16 bits independientes. Cada contador es capaz de contar en binario o decimal codificado en binario (BCD). La frecuencia máxima de entrada permitida para cualquier contador es de 10 MHz. Este dispositivo es útil siempre que el microprocesador deba controlar eventos en tiempo real. También se lo emplea para el control de velocidad y dirección de un motor de corriente continua (pwm). El TIMER puede programarse para trabajar con los tres contadores simultáneamente y bajo 6 modos de operación cualesquiera cada uno. Por ejemplo, se puede tener el contador 0 (CH0) operando a la frecuencia de 1 MHz - Modo 2, al contador 1 (CH1) operando a la frecuencia de 5 KHz – Modo 3 y al contador 2 (CH2) operando a la frecuencia de 200 Hz – Modo 4. D7 D6 D5 D4 D3 D2 D1 D0 CLK0 OUT0 GATE0 GND
1 2 3 4 5 6 7 8 9 10 11 12
82C54
24 23 22 21 20 19 18 17 16 15 14 13
82C54
VCC WR RD CS A1 A0 CLK2 OUT2 GATE2 CLK1 GATE1 OUT1
Bus de datos
D7-D0
Canal 0
CLK GATE OUT
Canal 1
CLK GATE OUT
Canal 2
CLK GATE OUT
RD WR A1 A0 CS
Figura 6.1. Diagramas del TIMER 82C54. 10K VCC
1 7
OSC1 N/C
+5 VDC
GND
OUTPUT
14 8
GATES
R3 VCC 8 MHz
8 MHz
8MHz
DATOS P14 P1 A0 A1 CS_TIMER
SD0 SD1 SD2 SD3 SD4 SD5 SD6 SD7
8 7 6 5 4 3 2 1
RD WR
22 23 19 20 21
G1 G2 CLK1 CLK2
U5 D0 D1 D2 D3 D4 D5 D6 D7 RD WR A0 A1
CLK0 G0 OUT0 CLK1 G1 OUT1 CLK2 G2 OUT2
9 11 10
1 2 3 4
S1
8 7 6 5
SW TIMER
15 14 13
CLK1 G1 OUT1
18 16 17
CLK2 G2 OUT2
CLK1 CLK2 G1 G2 OUT1 OUT2
J9 1 2 3 4 5 6 TIMER
CS 82C54
Figura 6.2. Esquemático del TIMER 82C54 dentro de la Tarjeta.
El 82C54 se selecciona con su terminal CS para programarla (leer o escribir) en cada contador. La selección de sus contadores se logra mediante los terminales A1 y A0.
Ing. Javier Barriga Hoyle
[email protected]
8
Soluciones Electrónicas Integradas BYM
A1 0 0 1 1
A0 0 1 0 1
FUNCION Canal 0 (CH0) Canal 1 (CH1) Canal 2 (CH2) Registro de control
El TIMER de la tarjeta de interfase, tiene tres canales o contadores independientes CANAL 0 (CH0), CANAL 1 (CH1) y CANAL 2 (CH2). De los cuales: •
CANAL 0: Opera con una frecuencia de entrada de 8 MHz (fija) proporcionada por un oscilador y es usado para generar retardos de precisión, por lo que su salida OUT 0, no está disponible para el usuario.
•
CANAL 1: Está disponible y puede operar a la frecuencia de 8 MHz colocando G1 (Gate) y CLK1 en el SW TIMER en ON. Pero, si desea usar distintas frecuencias de entrada, se tiene que colocar CLK1 en OFF, para impedir que ingrese los 8 MHz.
•
CANAL 2: Opera similar al canal 1, sólo que se controla con G2 y CLK2.
6.1
Modos de Operación del TIMER
El TIMER presenta seis modos de operación para cada uno de los contadores: Modo 0 a Modo 5. •
Modo 0: Permite usarlo como un contador de eventos. Por ejemplo, si es programada una cuenta de 7, la salida toma el valor 0 lógico por 7 cuentas iniciando en N. N
1
2
3
4
5
6
7
CLK OUT Cuenta de 7 cargada
•
Modo 1: Funciona como un multivibrador monoestable redisparable. Por ejemplo, si la cuenta es 5, la salida toma el valor 0 lógico durante 5 periodos de reloj. 1
2
3
4
5
CLK G OUT Disparo con cuenta de 5
•
Modo 2: Permite que el contador genere una serie continua de pulsos (duty cycle aproximado de 90%). Se utiliza bastante para generar interrupciones. Por ejemplo, para una cuenta de 5, la salida toma el valor 1 lógico durante 4 periodos de reloj y el valor 0 lógico durante un periodo. 1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
CLK OUT Cuenta de 5 cargada
Ing. Javier Barriga Hoyle
[email protected]
9
Soluciones Electrónicas Integradas BYM
•
Modo 3: Permite generar una onda cuadrada en su salida (duty cycle aproximado de 50%). Si la cuenta es par, la salida permanece en 1 durante la mitad de la cuenta y en 0 durante la otra mitad. Si la cuenta es impar, la salida permanece en 1 por un periodo de reloj más del tiempo que está en estado 0. Por ejemplo, para una cuenta de 5, la salida es 1 durante tres periodos de reloj y en 0 durante dos periodos. 1
2
3
4
5
6
1
2
3
4
5
6
1
2
3
4
5
6
1
CLK OUT Cuenta de 5 cargada
•
Modo 4: Permite que el contador genere un solo pulso en su salida. Por ejemplo, si la cuenta es programada con un 8, la salida permanece en alto durante 8 periodos de reloj y en estado bajo durante un periodo. 1
2
3
4
5
6
7
8
CLK OUT Disparo con cuenta de 8
•
Modo 5: Un circuito monoestable disparado por hardware que funciona como el modo 4, excepto que es iniciado por un pulso de disparo en la terminal G, en vez de por software. Este modo también es parecido al modo 1 porque es redisparable. 1
2
3
4
5
CLK G OUT Disparo con cuenta de 5
NOTA: Para mayor información sobre estos modos, puede consultar el datasheet del 82C54. 6.2
Programación del TIMER
Cada contador es programado individualmente escribiendo una palabra de control, seguida por la cuenta inicial. La figura 6, muestra la estructura de la palabra de control, que permite al programador seleccionar al contador, el modo y el tipo de operación (lectura o escritura).
0 0 1 1
0 1 0 1
D7
D6
D5
D4
D3
D2
D1
D1
SC1
SC0
RW1
RW0
M2
M1
M0
BCD
Elegir contador Contador 0 Contador1 Contador 2 Comando Read Back
0 0 1 1
0 1 0 1
Operación: Comando de enclavamiento Leer/escribir byte bajo Leer/escribir byte alto Leer/escribir byte bajo y después el alto
0 0 x x 1 1
0 0 1 1 0 0
0 1 0 1 0 1
Modo: Modo 0 Modo 1 Modo 2 Modo 3 Modo 4 Modo 5
Contador: 0 Binario 16 bits 1 BCD de 4 décadas
Figura 6.3. Palabra de control del TIMER. Ing. Javier Barriga Hoyle
[email protected]
10
Soluciones Electrónicas Integradas BYM
La palabra de control selecciona también una cuenta binaria o BCD. Cada contador puede programarse con una cuenta de 1 a FFFFh. Una cuenta de 0 es igual a FFFFh + 1 (65536) o 10000 en BCD. La cuenta mínima de 1 es aplicable a todos los modos de operación excepto los modos 2 y 3, las cuales tienen una cuenta mínima de 2. a)
CONFIGURACION:
Ejemplo 6.1: Configurar el CH0 del TIMER en modo 2, cuenta binaria, operación leer y escribir byte bajo y luego el byte alto. Palabra de control: La instrucción sería:
00110100 = 34h xout (0x77, 0x34);
Ejemplo 6.2: Configurar el CH1 del TIMER en modo 3, cuenta binaria, operación leer y escribir byte bajo y luego el byte alto. Palabra de control: La instrucción sería:
01110110 = 76h xout (0x77, 0x76);
Ejemplo 6.3: Configurar el CH2 del TIMER en modo 4, cuenta binaria, operación leer y escribir byte bajo y luego el byte alto. Palabra de control: La instrucción sería:
10111000 = 0B8h xout (0x77, 0xB8);
b) OPERACIONES DE ESCRITURA: El 82C54 es muy flexible a la hora de ser programado. Basta con tener en cuenta dos cosas: • •
Primero, escribir siempre la palabra de control, antes de enviar la cuenta inicial al contador. Segundo, dicha cuenta inicial debe seguir exactamente el formato seleccionado en la palabra de control (enviar sólo Byte bajo, enviar sólo Byte alto, o bien enviar ambos consecutivamente). Teniendo en cuenta que cada contador tiene su propio puerto y que la palabra de control indica el contador al que está asociada, no hay que seguir un orden especial a la hora de programar los contadores. Esto significa que, por ejemplo, se puede enviar la palabra de control de cada contador seguida de su cuenta inicial, o bien enviar todas las palabras de control para los 3 contadores y después las 3 cuentas iniciales.
Ejemplo 6.4: Programe el CH0 del TIMER para obtener una señal cuadrada con frecuencia de 200 Hz, sabiendo que la frecuencia de entrada es de 8 MHz. void main () { // Configura el canal 0 (CH0) xout(0x77, 0x36);
// CH0, Modo 3, cuenta binario
// Frecuencia de entrada al CH0 = 8 MHz. Para obtener una frecuencia de 200 Hz // (T=5 ms), se tiene que dividir (8 MHz/200 Hz)= 40000; ==> el factor N = 9C40h xout (0x74, 0x40); xout (0x74, 0x9C);
// Se envía Byte LSB al CH0 // Se envía Byte MSB al CH0
}
Ing. Javier Barriga Hoyle
[email protected]
11
Soluciones Electrónicas Integradas BYM
Ejemplo 6.5: Programe el CH1 y CH2 del TIMER para obtener una señal cuadrada con frecuencia de 1 KHz en el CH1 y una señal para generar interrupciones de 250 Hz en el CH2. La frecuencia de entrada es de 8 MHz. void main () { /* Configura el canal 0 (CH0) y el canal 1 (CH1) */ xout(0x77, 0x76); // CH1, Modo 3, cuenta binario xout(0x77, 0xB4); // CH2, Modo 2, cuenta binario /* Frecuencia de entrada al CH1=CH2= 8 MHz. Para obtener una frecuencia de 1 KHz en CH1, se tiene que dividir (8 MHz/1 KHz)= 8000; ==> el factor N1 = 1F40h. Para obtener una frecuencia de 250 Hz en CH2, se tiene que dividir (8 MHz/250 Hz)= 32000; ==> el factor N2 = 7D00h. */ xout xout xout xout
(0x75, (0x75, (0x76, (0x76,
0x40); 0x1F); 0x00); 0x7D);
// // // //
Se Se Se Se
envía envía envía envía
Byte Byte Byte Byte
LSB MSB LSB MSB
al al al al
CH1 CH1 CH2 CH2
}
c)
OPERACIONES DE LECTURA:
Existen tres posibles métodos para leer el valor de un contador en el 8254. El primero es el comando de enclavamiento, el segundo consiste en el comando Read-Back, sólo disponible en el 8254 (y no en el 8253), y el tercer método consiste en leer simplemente el contador accediendo al puerto correspondiente (este método requiere inhibir la entrada CLK al contador) con objeto de evitar leer la cuenta en medio de un proceso de actualización de la misma, lo que daría un resultado incorrecto. •
Comando de enclavamiento D7
D6
D5
D4
D3
D2
D1
D0
SC1
SC0
0
0
X
X
X
X
Selecciona contador 00 - Contador 0 01 - Contador 1 10 - Contador 2
Figura 6.4. Comando de enclavamiento. •
Comando Read-back: D7
D6
D5
D4
D3
D2
D1
D0
1
1
COUNT
STATUS
CNT 2
CNT 1
CNT 0
0
Selecciona bits del contador Estado del registro de los contadores seleccionados Cuenta del registro de los contadores seleccionados
Figura 6.5. Comando Read-Back. Cuando se hace uso de este comando enviando 11010010, el TIMER devuelve solo la cuenta actual del contador 0; pero si se envía 11000010, el TIMER devuelve la cuenta en el contador 0 y su registro de estado con la información de la figura 6.6. Ing. Javier Barriga Hoyle
[email protected]
12
Soluciones Electrónicas Integradas BYM
D7 OUTPUT
D6 NULL COUNT
valor de la patilla OUT
D5
D4
D3
D2
D1
D0
RW1
RW0
M2
M1
M0
BCD
Operación de lectura/escritura
Modo del contador
1 "Null Count" 0 Cuenta disponible para ser leído
Contador: 0 - Binario 16 bit 1 - BCD 4 décadas
Figura 6.6. Registro de estado (status). Ejemplo 6.6: Leer la cuenta del canal 1 (CH1) y canal 2 (CH2) usando el comando de enclavamiento (sólo se muestra las instrucciones principales). void main () { unsigned char X1, X2, Y1, Y2;
}
xout(0x77, 0x40); X1 = xin(0x75); X2 = xin(0x75);
// Se envía palabra de enclavamiento del CH1 // Lee Byte LSB // Lee Byte MSB
xout(0x77, 0x80); Y1 = xin(0x76); Y2 = xin(0x76);
// Se envía palabra de enclavamiento del CH2 // Lee Byte LSB // Lee Byte MSB
Ejemplo 6.7: Leer las cuentas del canal 0 (CH0), canal 1 (CH1) y canal 2 (CH2) usando el comando Read-Back (sólo se muestra las instrucciones principales).. void main() { unsigned char X1,X2,Y1,Y2,Z1,Z2;
}
xout(0x77, 0xDE);
// Se envía comando Read-back
X1 = xin(0x74); X2 = xin(0x74);
// Lee Byte LSB del CH0 // Lee Byte MSB del CH0
Y1 = xin(0x75); Y2 = xin(0x75);
// Lee Byte LSB del CH1 // Lee Byte MSB del CH1
Z1 = xin(0x76); Z2 = xin(0x76);
// Lee Byte LSB del CH2 // Lee Byte MSB del CH2
Ejemplo 6.8: Usando el comando Read-Back, leer la cuenta y estado del canal 1 (CH1). Almacenar en “estado” el Byte de estado y en “data” la cuenta (sólo se muestra las instrucciones principales). void main() { unsigned char estado, data_low, data_high; unsigned int data; xout(0x77, 0xC4); estado = xin(0x75); data_low = xin(0x75); data_high = xin(0x75); data = data_high Execute program (Ctrl + F5) e) Ejecute su programa dándole diferentes valores al dipswitch y observará que el valor colocado se visualizará en los leds. f) Repita el paso (e) cuantas veces crea necesario. Autor: Ing. Javier Barriga Hoyle *******************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
Ing. Javier Barriga Hoyle
[email protected]
// Dirección del puerto paralelo
21
Soluciones Electrónicas Integradas BYM
unsigned char data; void main (void) { inicio_tarjeta(); xout(0x7B, 0x82); data = xin(0x79); xout(0x78, data);
// Inicia programa principal // Inicializa Tarjeta de interfase LPT V2.0 // Configura PPI -> PA=out, PB=in, PC=out // Se lee dato del PB del PPI // Se envía por PA del PPI
}
Programa 10.2: (PPI_2.CPP) /******************************************************************************** PPI_2.CPP Este programa emplea el PA del PPI para generar intermitencia en los 8 leds. Es decir, envía el dato 0xFF (leds ON) luego de 1/2 Seg. se envía 0x00 (leds OFF). La operación se realiza 10 veces. Descripción: a) Conecte con un cable flat el PA del PPI con 8 leds que permita ver los datos digitales enviados por el Computador. b) Escriba el programa en Visual C++ (modo consola) c) Compile (Ctrl + F7) -> Build (F7) -> Execute program (Ctrl + F5) Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
// Dirección del puerto paralelo
int i; void main (void) { inicio_tarjeta(); xout(0x7B, 0x82); for(i=0; i PA=out, PB=in, PC=out // Bucle de 10 veces de repetición // Leds ON // Retardo de 200 ms // Leds OFF
}
Programa 10.3: (PPI_3.CPP) /******************************************************************************** PPI_3.CPP Este programa a través del PA del PPI genera prendido secuencial a la izquierda y luego se apaga secuencialmente a la derecha. La operación se realiza 10 veces a intervalos de 150 ms. Descripción: a) Conecte con un cable flat el PA del PPI con 8 leds que permita visualizar los datos digitales enviados por el microprocesador a través del PPI. b) Escriba el programa en Visual C++ (modo consola) c) Compile (Ctrl + F7) -> Build (F7) -> Execute program (Ctrl + F5) Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include
Ing. Javier Barriga Hoyle
[email protected]
22
Soluciones Electrónicas Integradas BYM
#include #include #include "BymWin.h"
// Librería usada por la tarjeta LPT V2.0
int Base = 0x378;
// Dirección del puerto paralelo
/* Variables globales */ int i; unsigned char p; /* Inicia programa principal */ void main () { inicio_tarjeta(); xout(0x7B, 0x82);
// Inicializa Tarjeta de interfase LPT V2.0 // Configura PPI -> PA=out, PB=in, PC=out
/* Prendido secuencial a la izquierda */ p = 0x01; // p = 0000 0001b for(i=0; i 1; } } xout(0x78, 0x00); }
// Se envía al PA del PPI // Retardo de 150 ms // Desplaza un bit a la derecha // Se apaga los leds
Programa 10.4: (PPI_4.CPP) /******************************************************************************** PPI_4.CPP Este programa prende secuencialmente los bits desde los extremos al centro y luego se apaga hacia los extremos (muy vistoso). Descripción: a) Conecte con un cable flat el PA del PPI con 8 leds que permita ver los datos digitales enviados por el Computador. b) Escriba el programa en Visual C++ (modo consola) c) Compile (Ctrl + F7) -> Build (F7) -> Execute program (Ctrl + F5) Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
// Dirección del puerto paralelo
/* Variables globales */ unsigned char x, y, z; int i, j; void main(void)
Ing. Javier Barriga Hoyle
[email protected]
// Inicia programa principal
23
Soluciones Electrónicas Integradas BYM
{
inicio_tarjeta(); xout(0x7B, 0x82); x = 0; for(i=1 ;i Build (F7) -> Execute program (Ctrl + F5). d) Ejecute su programa. Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
// Dirección del puerto paralelo
#define #define #define #define #define
// Constante para el display LCD // Constante para el display LCD // Display ON, cursor ON, blink OFF
CONTROL 0 DATO 1 DISPLAY_ON 0x0E BORRAR_LCD 0x01 UCHAR unsigned char
/* Prototipos */ void PutcharLCD(UCHAR direc, UCHAR dato); void BorraLCD(void); void InitLCD(void); void GotoxyLCD(UCHAR fila, UCHAR columna); /* Mensajes */ char Mensaje1[30] = {"TARJETA LPT BYM V2.0"}; // Ambas filas char Mensaje2[30] = {"** LO MAXIMO **"}; // Ambas filas /* Variables globales */ int j; /* Inicia programa principal */ void main(void) { inicio_tarjeta(); xout(0x7B, 0x80); InitLCD();
// Inicializa Tarjeta de interfase LPT V2.0 // Configura PPI como PA = PB = PC = outs // Inicializa LCD
/* Envía mensaje1 */ while(j0; ncol--) { xout(0x7A, scan); // Envía dato al PortC Sleep(10); // Retardo de 10 ms car = xin(0x7a); // Lee el teclado (columna, fila) if((scan-car) != 0) // ¿Se ha pulsado tecla? { tecla = kbRead(car); // Devuelve código tecla válido printf("Tecla pulsada = %c \n",tecla); Sleep(200); // Retardo para eliminar rebote xout(0x78, tecla); // Se envía a los leds } scan = (scan Build (F7) -> Execute program (Ctrl + F5). e) Ejecute su programa. Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
// Dirección del puerto paralelo
void retardo(void);
// Prototipo de función retardo
/* Variables globales */ unsigned char tabla[4]={0x75,0xB7,0xD9,0xE3}; // Defino el arreglo tabla int i,j; void main(void) { inicio_tarjeta(); xout(0x7B, 0x80); for(i=0; i Build (F7) -> Execute program (Ctrl + F5) Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
// Dirección base del puerto paralelo
void main (void) { inicio_tarjeta();
// Inicia programa principal
// Configura los canales 1 y 2 xout(0x77, 0x76); xout(0x77, 0XB6);
// Inicializa Tarjeta de interfase LPT V2.0 // CH1, Modo 3, binario // CH2, Modo 3, binario
/* Frecuencia de entrada al CH1 = 8 MHz. Para obtener (T = 6.25 ms), se tiene que dividir (8 MHz/160 Hz) ==> el factor N1 = C350h */ xout(0x75, 0x50); // Se envía Byte xout(0x75, 0xC3); // Se envía Byte
una frecuencia de 160 Hz. = 50000 = C350h; LSB al CH1 MSB al CH1
/* Frecuencia de entrada al CH2 = 160 Hz. Para obtener una frecuencia de 1 Hz (T = 1 Seg), se tiene que dividir (160 Hz/1 Hz) = 160 = 00A0h; ==> el factor N2 = 00A0h. */ xout(0x76, 0xA0); // Se envía Byte LSB al CH2 xout(0x76, 0x00); // Se envía Byte MSB al CH2 } /* FIN de main */
Programa 11.3: (TIMER_3.CPP) Uso del comando de enclavamiento. Realice las conexiones mostradas en la figura 11.2 y siga las instrucciones dadas en el programa. Este programa usa el comando de enclavamiento para leer el registro contador. /******************************************************************************** TIMER_3.CPP: Este programa muestra como usar el comando de enclavamiento para leer la cuenta actual del registro interno de 16 bits del contador CH1. Descripción: Realice las siguientes conexiones sobre el canal 1 del TIMER. a) Coloque los bits 1 y 2 del SW TIMER en ON, para que los GATES de los 2 canales estén habilitados. b) Coloque los bits 3 y 4 del SW TIMER en ON, para que ambos canales reciban los 8 MHz como frecuencia de entrada.
Ing. Javier Barriga Hoyle
[email protected]
45
Soluciones Electrónicas Integradas BYM
c) Programe al CH1 en modo 3 a una frecuencia de 5 KHz (N1 = 640h). d) Conecte la salida del canal 1 (out1) al osciloscopio y observe la señal de salida. e) Escriba el programa en Visual C++ (modo consola) f) Compile (Ctrl + F7) -> Build (F7) -> Execute program (Ctrl + F5) Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378;
// Dirección base del puerto paralelo
/* Variables globales */ unsigned char CuentaLow, CuentaHigh, Ch; unsigned int Cuenta; const int ESC = 0x1B; void main (void) { inicio_tarjeta();
// Inicia programa principal // Inicializa Tarjeta de interfase LPT V2.0
printf("\n******* LECTURA DEL REGISTRO CONTADOR DEL TIMER *******\n\n"); printf("\t ***** (Metodo de enclavamiento) *****\n\n"); printf("\nPara salir del programa pulse ...: (ESC)ape\n"); printf("\nPara leer la cuenta pulse .......: (L)eer\n\n\n"); /* Configura al canal 1 */ xout(0x77, 0x76);
// CH1, Modo 3, binario
/* Frecuencia de entrada al CH1 = 8 MHz. Para obtener una frecuencia de 5 KHz (T = 200 µs), se tiene que dividir (8 MHz/5 KHz) = 1600 = 0640h; ==> el factor N1 = 0640h. Envío la cuenta al contador 1 */ xout(0x75, 0x40); // Se envía Byte LSB al CH1 xout(0x75, 0x06); // Se envía Byte MSB al CH1 /* Envía el comando de enclavamiento y luego lee la cuenta del contador 1 */ while(Ch != ESC) { Ch = getch(); Ch = toupper(Ch); // Convierte a mayúscula if(Ch == 'L') { xout(0x77, 0x40); // Se envía 01000000 (enclava) CuentaLow = xin(0x75); // Lee Byte LSB CuentaHigh = xin(0x75); // Lee Byte MSB Cuenta = (CuentaHigh Build (F7) -> Execute program (Ctrl + F5) Autor: Ing. Javier Barriga Hoyle ********************************************************************************/ #include #include #include #include "BymWin.h" // Librería usada por la tarjeta LPT V2.0 int Base = 0x378; // Dirección base del puerto paralelo /* Variables globales */ unsigned char CuentaLow, CuentaHigh, Ch, Estado; unsigned int Cuenta, ESC=27; void main (void) { inicio_tarjeta();
// Inicia programa principal // Inicializa Tarjeta de interfase LPT V2.0
printf("\n******* LECTURA DEL REGISTRO CONTADOR DEL TIMER *******\n\n"); printf("\t ***** (Metodo de Read-Back) *****\n\n"); printf("\nPara salir del programa pulse ...: (ESC)ape\n"); printf("\nPara leer la cuenta pulse .......: (L)eer\n\n\n"); /* Configura al canal 1 */ xout(0x77, 0x76);
// CH1, Modo 3, binario
/* Frecuencia de entrada al CH1 = 8 MHz. Para obtener una frecuencia de 5 KHz (T = 200 µs), se tiene que dividir (8 MHz/5 KHz) = 1600 = 0640h; ==> el factor N1 = 0640h. Envío la cuenta al contador 1 */ xout(0x75, 0x40); // Se envía Byte LSB al CH1 xout(0x75, 0x06); // Se envía Byte MSB al CH1 /* Envía el comando Read-Back y luego lee el estado y la cuenta del CH1 */ while(Ch != ESC){ Ch = getch(); Ch = toupper(Ch); // Convierte a mayúscula if(Ch == 'L') { xout(0x77, 0xC4); // Se envía 11000100 (Read-Back) Estado = xin(0x75); // Lee Byte de estado CuentaLow = xin(0x75); // Lee Byte LSB CuentaHigh = xin(0x75); // Lee Byte MSB Cuenta = (CuentaHigh Build (F7) -> Execute program (Ctrl + F5). h) Ejecute su programa. Autor: Ing. Javier Barriga Hoyle ******************************************************************************/ #include
Ing. Javier Barriga Hoyle
[email protected]
61
Soluciones Electrónicas Integradas BYM
#include #include #include "BymWin.h"
// Librería usada por la tarjeta LPT V2.0
int Base = 0x378;
// Dirección del puerto paralelo
#define #define #define #define #define
// Constante para el display LCD // Constante para el display LCD // Display ON, cursor ON, blink OFF
CONTROL 0 DATO 1 DISPLAY_ON 0x0E BORRAR_LCD 0x01 UCHAR unsigned char
/* Prototipos LCD */ void PutcharLCD(UCHAR direc, UCHAR dato); void BorraLCD(void); void InitLCD(void); void GotoxyLCD(UCHAR fila, UCHAR columna); void PrintNumLCD(float numero, UCHAR fila, UCHAR columna); /* Mensajes a enviar */ char Mensaje1[30] = {"TARJETA LPT BYM V2.0"}; // Ambas filas char Mensaje2[20] = {" LECTURA DE ADC "}; // Fila 1 char Mensaje3[10] = {"X(vol)="}; // Fila 2 /* Variables globales */ unsigned char dato_adc; int i, j, m, flag_int, num, divisor, cociente, residuo; float voltios; /* Inicia programa principal */ void main(void) { inicio_tarjeta(); xout(0x7B, 0x80); InitLCD();
// Inicializa Tarjeta de interfase LPT V2.0 // Configura PPI con PA=PB=PC= OUTs (modo 0) // Inicializa LCD
printf("\t****************************************************\n"); printf("\t* LECTURA DE UNA SENAL ANALOGICA USANDO EL ADC0804 *\n"); printf("\t* *\n"); printf("\t* Captura 20 muestras a intervalos de 2 segundos, *\n"); printf("\t* lo imprime en pantalla y en el LCD de 2x16. *\n"); printf("\t* Varie el potenciometro para muestras diferentes. *\n"); printf("\t****************************************************\n\n"); /* Envía mensaje1 a ambas filas del LCD while(j