# Necesito usar STROBE del puerto paralelo



## pedroagusb (Oct 23, 2012)

Hola gente, este es mi primer post, si ya existe este tipo de duda o si no lo estoy posteando en el lugar correcto les pido disculpas...
Vamos al grano, resulta ser que estoy haciendo un cartel de led de 7x32, manejado por puerto paralelo (nada de pic)... basicamente consiste en que por los pines de Data (D0-D6), yo manejo las filas del cartel de led y mediante 4 latch (74LS164), controlo las columnas, ahora bien, para manejar el Clock y el Data de los Latch utilizo los pines C0 (Strobe) y D7 (q me sobra) respectivamente, el inconveniente se produce con que yo no soy capaz de manipular correctamente el C0, no se como se hace, se que debo usar la funcion "outb" y que el registro de control es la direccion base+2; he intentado colocando la linea "outb(1,0x37a);" (mi puerto base esta en 0x378h) pero al leer el pin no modifica su estado...
Lo estoy programando mediante el lenguaje C sobre Ubuntu. A cualquiera que me pueda ayudar desde ya le agradezco


----------



## miguelus (Oct 24, 2012)

Buenos días pegroagusb.

Ten en cuenta que de las cuatro señales del Registro de Control, C3, C1 y C0 son negadas.

Mira este tutorial, quizás te sirva de ayuda.

http://cfievalladolid2.net/tecno/cyr_01/control/puerto_paralelo.htm.


Sal U2


----------



## pedroagusb (Oct 24, 2012)

Hola miguelus, claro, yo cuando leia el estado del pin C0 cada vez que intentaba cambiarle el estado me leia siempre 1 (o sea, q esta bajo).... Yo quisiera ver como hacer para cambiarle el estado, no importa que me lo expliques en C, C++, o alguno parecido, quiero tener una idea de como comunicarme con ese pin...
A la pagina esa ya la habia visto  , igualmente te agradezco por haberme ayudado 

Ojala que puedan ayudarme


----------



## miguelus (Oct 24, 2012)

Buenas tardes pedroagusb
Hace tiempo que no hago ningún control por el Puerto Paralelo, los controles los hacía en Visual Basic 6.0, para ello utilizaba una libreria la "IO.DLL", que creo que esta DLL también funciona en C.

La instrucción es la típica ... 

PortOut Port, Dato '_ Para enviar Dato a Bus de Datos_
PortOut Port + 2, Dato ' _Para enviar Dato a Bus de Control_

Poco más puedo decirte, nunca tube problemas con ella.

P.D. Esta librería está por Internet y es gratuíta si la utilizas sin fines comeciales.

Sal U2


----------



## pedroagusb (Oct 24, 2012)

Hola Miguelus, gracias nuevamente... exactamente, esos son las instrucciones que uso para los Registros de Data.... Cuando los uso para el registro de Control, falla. Si podes, decime si hago algo mal...

Mi puerto base es 0x378, entonces para interactuar con el registro de control uso 0x37A. Esta bien ese puerto?

Donde pones "PortOut Port + 2, Dato", en la parte de Dato, iria un 1, no? (xq 2^0 = 1, siendo 0 el numero del pin STR de control), o cual seria el numero que iria en Dato?


Muschas gracias


----------



## miguelus (Oct 24, 2012)

pedroagusb dijo:


> Hola Miguelus, gracias nuevamente... exactamente, esos son las instrucciones que uso para los Registros de Data.... Cuando los uso para el registro de Control, falla. Si podes, decime si hago algo mal...
> 
> Mi puerto base es 0x378, entonces para interactuar con el registro de control uso 0x37A. Esta bien ese puerto?
> 
> ...




Port = 888  ' En decimal
Dato = 1
PortOut Port + 2, Dato 

Como el Bit C0 es negado en realidad estás enviando un  "0"

Port = 888 ' En decimal
Dato = 0
PortOut Port + 2, Dato

Ahora estamos enviando un "1"

Como te comenté, hace mucho que no hago nada con el Puerto Paralelo y esto intentando recordar pero la cosa era más o menos así.

Si no te funciona intenta cambiar alguno de los otros tres Bit, para ello solo tienes que enviar un número comprendido entre 0 y 15 (0 y F en hex)
Pudiera ser que esté mal la salida del Pin 1

Ya contarás como te va.

Sal U2


----------



## pedroagusb (Oct 24, 2012)

miguelus, muchas gracias por tu ayuda 

Lo mas probable que he hecho algo mal, ya voy a "traducir" esa info a C a ver que tal me va... dentro de unos dias te estoy comentado que tal ha ido  . Gracias nuevamente! Saludos!


----------



## Daniel Meza (Oct 25, 2012)

el bit que controla ese pin (Strobe) es el número 0 del registro de control ubicado en la dirección 0x37A (en la mayoría de ordenadores). Al igual es importante mencionar que en algunos casos ese pin es de colector abierto. Conecta un resistor de unos 4.7k para polarizarlo en alto.
Acá te dejo la hoja de datos del PPIA 8255, es un CI obsoleto pero es la base del funcionamiento del puerto paralelo; allí muestran los bits que intervienen en el registro de control. Saludos


----------



## miguelus (Oct 25, 2012)

Buenos días.

Hace agunos años me tocó tener que realizar el control de unos equipos por medio de un PC.
Ese control se utilizó en muchos PC´s, de distintas marcas y modelos y nunca nos encontramos con salidas en Open Colector en ninguno de los Pc´s.

Puede ser que algún Clon "Raro" lo haga así, en Open Colector, pero lo veo muy raro.

Pedroagusb, aunque supongo que ya lo conocerás, te dejo el PDF que explica como utilizar la librería IO.DLL.

Sal U2


----------



## Dr. Zoidberg (Oct 25, 2012)

Pedroagusb dijo:
			
		

> Lo estoy programando *mediante el lenguaje C sobre Ubuntu*. A cualquiera que me pueda ayudar desde ya le agradezco





miguelus dijo:


> Pedroagusb, aunque supongo que ya lo conocerás, te dejo el PDF que explica como utilizar la librería IO.DLL.


Todavía no has leído que Pedroagusb *ESTA USANDO UBUNTU*????
Como pretendés que cargue una DLL de Windows sobre Linux para manejar el hardware?   
Dejen de mandar fruta y lean la pregunta!!!!





​
==================================================================

@Pedroagusb:
Si pretendés acceder *DIRECTAMENTE *al hardware desde Linux, solo tenés dos alternativas:


Te logueas como root, usás la llamada ioperm para liberar las direcciones de hardware necesarias y luego usás la outp/inp para acceder al hardware. Es un método poco recomendable para un trabajo serio, pero bue...funciona. *Acá *tenés un documento que mas o menos lo explica.
Escribís un device driver , lo cargás en el kernel y hacés una interfaz de comunicación usando la system call *ioctl*. Esto es lo correcto, pero tenés que saber programar o vas a hacer un desastre.
Y por supuesto, antes de hacer todo esto tenés que estudiar como trabaja un sistema operativo que virtualiza el hardware...


----------



## pedroagusb (Oct 25, 2012)

Daniel Meza y Miguelus gracias por seguir colaborando, todavia no he podido probar nada, cuando lo haga les comento  

ezavalla, no podes poner un foto de frutas y verduras   jajajajja.... cualquier cosa me sirve, mientras mas ideas tenga, mejor es  ... lamentablemente uso la 1era alternativa xq es la 1era vez que programo con puerto paralelo, ya voy a ver tu documentacion. Investigare mas a fondo para poder usar la 2da alternativa  (entre mas ideas mejor  )...

saludos y gracias a todos!


----------



## pedroagusb (Oct 27, 2012)

ezavalla, me podrias proporcionar alguna informacion sobre la creacion de device drivers (no importa si esta en español o ingles), porque programar en C se, pero programar hardware no se, soy bastante novato jajaja... gracias!


----------



## Dr. Zoidberg (Oct 27, 2012)

Andá leyendo esto:
http://www.xml.com/ldd/chapter/book/index.html
http://lwn.net/Kernel/LDD3/
Y buscá la cuarta edición que debe ser para los kernels mas nuevos.

Te aviso que vas a tener que dedicarle tiempo....


----------



## pedroagusb (Oct 27, 2012)

gracias ezavalla, y si, a estas cosas si hay que dedicarle tiempo para poder emprender bien  ... pero en algun momento se debe empezar 

muchas gracias por la data... saludos desde Cba!


----------

