El conector del puerto paralelo del PC Definición de los

Anuncio
El conector del puerto paralelo del PC
EMBED Word.Picture.8
Definición de los pines
Pin
1
2
3
4
5
6
7
8
9
Señal
-Strobe
Datos 0
Datos 1
Datos 2
Datos 3
Datos 4
Datos 5
Datos 6
Datos 7
Bit
C0
D0
D1
D2
D3
D4
D5
D6
D7
Dirección
Salida
E/S
E/S
E/S
E/S
E/S
E/S
E/S
E/S
Pin
10
11
12
13
14
15
16
17
18-25
Señal
-Ack
Busy
Paper feed
Select
-Auto feed
-Error
-Init
-Select
Tierra
Bit
S6
S7
S5
S4
C1
S3
C2
C3
Dirección
Entrada
Entrada
Entrada
Entrada
Salida
Entrada
Salida
Salida
Programa primero
#include <stdio.h>
#include <unistd.h> //asm/io.h donde están las funciones ioperm() y outb()
#include <asm/io.h>
#define DATAPORT 0x378 /* Direccion más frecuente para el puerto paralelo*/
int main()
{
//Obtenemos permiso acceso a la direccion de DATAPORT y las 2 siguientes
if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;}
while(1) //Entramos en un bucle infinito
{
int input;
//Le pedimos al usuario que introduzca un número
printf("Introduce un número entre 0 y 255 (-1 para salir)\n");
scanf("%d", &input); //Leemos valor introducido.Lo guarda en "input"
if(input==-1) break; //Si "input" vale "-1" salimos del bucle
//Si "input" no está entre "0" y "255" (y no era "-1" no nos
//interesa, así que volvemos directamente al comienzo del bucle
if(input < 0 || input > 255) continue;
//Si hemos llegado hasta aqui es que "input" vale entre "0" y
1
}
//"255" y podemos sacarlo por el puerto paralelo
outb(input, DATAPORT);
//Antes de terminar el programa dejamos permisos de acceso como estaban
if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;}
//El programa termina sin errores
return 0;
}
Programa segundo
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#define DATAPORT 0x378 // lpt1 Direccion más frecuente para el puerto paralelo
#define DELAY 150000
//Duración de cada paso en microsegundos
#define REPEAT 4
//Numero de veces que se repite cada secuencia
void Blink();
void Alternate();
void ZigZag();
int main()
{
//Obtenemos permiso de acceso para la direccion de DATAPORT y 2 siguientes
if (ioperm(DATAPORT, 3, 1)) {perror("ioperm"); return 1;}
int mode=0; //mode indica que secuencia es la que se esta ejecutando
while(1)
{
int i;
for(i = 0 ; i < REPEAT; i++)
{
int reset=0;
switch (mode)
//Comprueba el valor de mode
{
case 0:
//Si vale 0 toca parpadeo
Blink();
break;
case 1:
//Si vale 1 toca alternar pares e impares
Alternate();
break;
case 2:
//Si vale 2 toca hacer un ZigZag
ZigZag();
break;
default:
//Si vale otra cosa, vovemos a empezar: ponemos mode a -1
mode=-1;
}
}
//Despues de repetir REPEAT veces una secuencia pasamos a la siguiente
mode++;
// suma 1 a mode
}
//Volvemos a cerrar los puertos
if (ioperm(DATAPORT, 3, 0)) {perror("ioperm"); return 1;}
return 0;
2
}
void Blink() //Esta función hace parpadear los LEDS.
{
outb(255,DATAPORT); //Ponemos todos los led a 1
usleep(2*DELAY);
//Y esperamos 2*DELAY microsegundos
outb(0,DATAPORT);
//Luego ponemos todos los leds a 0
usleep(2*DELAY);
//Y volvemos a esperar
}
void Alternate() // Enciende alternativamente los LEDS pares y los impares
{
int i;
for(i=0;i<4;i++)
//repetimos cuatro veces
{
int output = 85;
//Primero ponemos 85 que es 01010101 en binario,se iluminan los LEDS impares
outb(output,DATAPORT);
usleep(2*DELAY);
// y esperamos 2*DELAY
}
// Desplazamos los bits de output un lugar a la izquierda, queda "10101010"
output = output << 1;
outb(output,DATAPORT); // Al sacar en el puerto se iluminan los LEDS pares
usleep(2*DELAY);
}
void ZigZag()// Esta función enciende las luces al estilo del coche fantastico
{
int output = 1; // output solo tiene el último bit distinto de 0
//direction indica sentido movimiento de la luz: 1 izquierda, 0 derecha.
int direction = 1; // Empezamos hacia la derecha
while (output !=0)
{
outb(output, DATAPORT);
// Sacamos output por el puerto
usleep(DELAY);
if(direction) //Si dirección distinto de cero movemos bits output hacia izq
output = output << 1;
else
//Si no, los movemos hacia la derecha
output = output >> 1;
//Si output vale 256 es que se nos ha salido
//la luz por la izquierda así que cambiamos la dirección
if(output==256)
{
output = output >> 1;
direction = !direction;
}
}
}
Peso de cada bit del puerto paralelo de la impresora
Pin 2
Pin 3
Datos0
Datos1
1
2
00000001
00000010
3
Pin 4
Pin 5
Pin 6
Pin 7
Pin 8
Pin 9
Datos2
Datos3
Datos4
Datos5
Datos6
Datos7
4
8
16
32
64
128
00000100
00001000
00010000
00100000
01000000
10000000
Circuitos ejemplo de interconexión con el mundo real
Módulo oscilador: basado en el CI 555
Módulo C A/D y Comparador
4
Display LCD HD44780
5
6
Descargar