SoloCodigo
Programación General => ASM (Ensamblador) => Mensaje iniciado por: Neopro en Viernes 11 de Junio de 2004, 22:01
-
Holas, saben, necesito un codigo de fuente de assembler que maneje el puerto paralelo de la forma que sea, tengo un circuito conectado a este puerto con 6 leds ubicados desde el pin 1 al 6, y conectados con el pin 18 para que exista la posibilidad de encenderlos. Necesito manejar los led's ya sea encenderlos y apagarlos o lo que sea, pero que funcione ojalá en un pentium 3.
Gracias, nos vemos.
-
unos mensajes abajo (buscalo Tommy es el iniciador) he puesto un codigo para comunicarte con el puerto paralelo ya sea enviando y recibiendo datos, en tu caso necesitaras estar enviando los datos como son seis leds tendrias que sacar el numero binario 111111 que en hexadecimal (el que usa el ensamblador) es "3F"
verifica el codigo cualquier duda escribela
:comp: adios
-
Gracias, tengo otra duda, pero la pondre en otro topico.
-
Es esta...
el puerto paralelo esta dividido en 3 direcciones
0378 salida de 8 bits de datos
0379 entrada de 5 bits
037a entrada o salida de 4 bits
En el registro DX se coloca la direccion del puerto y en el registro AL el dato que se quiere enviar (si estamos recibiendo en AL se guarda el dato recibido)"ESTO ES ASI SIEMPRE SIN EXCEPCION", asi si tu tienes los datos que quieres enviar de la direccion 0500 a la 0600
tienes que hacer lo siguiente
mov bx,0500 ;cargas en bx la direccion inicial
ot: mov al,[bx] ;guardas en AL lo que tiene adentro de la 0500 (dato a enviar)
mov dx,0378 ;pones la direccion del puerto (salida)
out dx,al ;sacas el dato por el puerto de salida
mov cx,00fff ;esto es un retraso que colocamos para darle tiempo
at loop at ; al receptor de recibir el dato
inc bx ;incrementamos bx para pasarnos a la siguiente direccion
cmp bx,0600 ;verificamos si ya enviamos todos los caracteres que estaban
; en la 0500 a la 0600
jnz ot ; si no es asi nos vamos a ot (seguimos enviando)
int 20 ;fin del programa
ahora si quieres recibir tienes que hacer lo siguiente
mov dx,0379; direccion del puerto que funciona como entrada
in al,dx ; guardas en AL el dato recibido
pero esto es si los datos que vas a recibir son solo de 4 bits, si son de ocho tienes que hacer otro paso mas
mov dx,037a
in al,dx ;con esto capturas los otros cuatro bits
CUANDO LA PRUEBE TE AVISO SI ME FUNCIONA, ADEMAS QUE HAY PROBLEMAS CON LOS PROCESADORES, ME HAN DICHO QUE LO MEJOR ES UN 486, PERO NADIE LOS TIENE. GRAX.
-
Aclaracion:
El puerto paralelo maneja maneja 3 registros cada uno de los bits de estos registro se "reflejan" fisicamente en el puerto DB25.
Puerto de datos (Entrada/Salida) de 8bits, dir:378h*
Puerto de Estado(Lectura) 5Bits,
Puerto de control(Escritura) 4Bits.
*No hay problema en leer o escribir datos de 8 Bits!!!!!
-
ERRORES
-
EL CODIGO QUE ESTA MAS ARRIBA NO COMPILA. LO PROBE CON MASM (AGREGANDO LO NECESARIO) Y CON CODEX QUE COMPILA TAL COMO ESTA, PERO ARROJO ALREDEDOR DE 10 ERRORES, ADEMAS QUE TUVE QUE ARREGLAR CIERTAS LINEAS, COMO:
at loop at ; al receptor de recibir el dato
QUE NUNCA HABIA VISTO EN ASSEMBLER.
PORFA, PUEDES REVISAR EL CODIGO Y REENVIARLO?
O DECIRME CON QUE LO COMPILASTE KAREN81?
GRACIAS
LO DE LAS DIRECCIONES DE LOS PUERTOS ESTA MAS QUE CLARO, MUCHAS GRACIAS.
-
Me hubiera gustado que me hubieras puesto el tipo de errores que te puso que habia ya que se pueden ver en el archivo .LST si son de sintaxis o de que???
Ahora, respecto a la instruccion at: loop at (talvez no te la entendio porque no le pusiste los dos puntos ya que at es una etiqueta igual cambiala por:
etiq: loop etiq, si quieres o cualquier etiqueta, lo que hace esta instruccion es estar saltando a ella misma hasta que CX valga cero, es decir cada salto decrementa cx (te ahorra estar decrementando manualmente cx para el retraso)
Ahora los errores que de seguro te dio fue porque solo copiaste lo que puse en el mensaje y lo pegaste y le pusiste la estructura de un archivo.asm.
Y no era asi la cosa, ese código es una idea basica para que supieras como se envian los datos, y esta echa para un principiante que apenas sabe usar el debug, pero creo que a ustedes no les enseñan el debug si no que de una vez el ensamblador , el debug trabaja con numeros hexadecimales mientras que el ensamblador trabaja con DECIMALES por eso te dio un error en mov cx,00FF, tenias que haber puesto mov cx,00FFh o pasar 00ff a decimal
otro error es esa instruccion int 20 ; que solo es para el debug (para que acabe porque ahi no se le puede poner END)
A CONTINUACION TE PONGO EL ARCHIVO COMO DEBE SER PARA EL ENSAMBLADOR (ya corregido todo)
ES EL ARCHIVO .LST QUE OBTUVE AL COMPILAR EL ARCHIVO.ASM Y VERAS QUE NO ME PUSO NI ERROR NI ADVERTENCIA NI NADA( Ahora segun la version de tu masm asi cambia la estructura, si me das tu correo te envio mi version de masm, si no te funciona en el tuyo)
The Microsoft MACRO Assembler , Version 1.25 Page 1-1
06-15-:4
1 ;PROGRAMA DE ENVIO
2
3
4
5
6
7 0000 datos segment
8
9
10
11 0000 datos ends
12
13 0000 pila segment stack
14
15 0000 80 [ db 128 dup ('pila')
16 70 69 6C 61
17 ]
18
19
20 0200 pila ends
21
22 0000 codigo segment
23
24 assume cs:codigo, ss:pila, ds:datos
25 0000 BB 0500 inicio: mov bx,0500h
26 0003 8A 07 ot: mov al,[bx]
27 0005 BA 0378 mov dx,0378h
28 0008 EE out dx,al
29 0009 B9 00FF mov cx,00FFh
30 000C E2 FE AT: loop AT
31 000E 43 inc bx
32 000F 81 FB 0600 cmp bx,0600h
33
34 0013 75 EE jnz ot
35
36
37
38 0015 codigo ends
39
40 end
The Microsoft MACRO Assembler , Version 1.25 Page Symbols
-1
06-15-:4
Segments and groups:
N a m e Size align combine class
CODIGO . . . . . . . . . . . . . 0015 PARA NONE
DATOS. . . . . . . . . . . . . . 0000 PARA NONE
PILA . . . . . . . . . . . . . . 0200 PARA STACK
Symbols:
N a m e Type Value Attr
AT . . . . . . . . . . . . . . . L NEAR 000C CODIGO
INICIO . . . . . . . . . . . . . L NEAR 0000 CODIGO
OT . . . . . . . . . . . . . . . L NEAR 0003 CODIGO
Warning Severe
Errors Errors
0 0
saludos y cualquier cosa aqui seguimos
:flower:
-
Gracias por la aclaracion, te aviso si no me resulta, tengo dos versiones del MASM.
Otra, pregunta, puse otro topic, porfa buscalo un poco mas abajo y si no entiendes te envio el codigo de fuente.
Gracias.
-
Me compilo bien, no envio ningun error, le hice las modificaciones para manejar lo que yo quiero que me muestre, pero no me funciona, que recomiendas utilizarlo bajo DOS, WIN98 o WINxXP?
O que mas habria que hacer?
Muchas gracias.
-
;) explicate mejor que es lo que quieres que te muestre
informacion en pantalla o que?, si es eso obviamente tienes que usar dos y las interrrupciones de ensamblador
-
Que encienda y apague leds conectados desde el punto 2 al 9 del LPT a traves de una protoboard, basado en una determinada secuencia o a traves de la pulsacion de teclas de el teclado. Lo unico que he visto com resultado es que se apaguen 3 y me mande errores de ejecucion del programa, y al omitir (en win xp), se vuelva a otro estado con otros 3 leds apagados, partiendo de que cuando enciendo el computador todos los leds estan encendidos.
-
Eso que al inicio los led esten encendidos creo que es normal ya que los pines se ponen en uno, podrias al iniciar el programa mandar un cero por el puerto, pero como te decia la rutina que te puse ahi es una guia, incluso creo que olvide ponerle algo a la estructura del masm podria ser eso, pero podrias hacer un menu si me das tu correo te mando un programa que con un menu hace diferentes cosas si le tecleas 1. hace una suma si tecleas dos saca raiz cuadrada etc, les puedes quitar esas rutinas y ponerle la de sacar los datos por el puerto paralelo.
otra cosa el numero que sacas por el puerto se queda enganchado hasta que sacas otro dato
cualquier cosa me avisas :hola:
-
Entendi como hacerlo por C++, pero necesito assembler, ya puedo setear las luces, pero no alcanzo a ver los cambios sino que hace todo en una instante, le puse que contara en binario desde 0 a 255, pero lo hace muy rapido, como puedo darle tiempo en assembler?.
Te doy mi correo ayq eu tengo que presentar una examen y quiza tu programa me ayude.
neoprogresivo@hotmail.com
Muchas gracias.
Espero tu pronta respuesta.
-
;) obviamente no puedes ver los cambios en los leds por que vas contanto en fracciones de segundo lo que debes hacer es colocarles un retraso que se yo de un segundo o mas entre cada dato que envias eso lo haces con lazos verifica en tu set de instrucciones cuanto se tarda cada instruccion y has tu lazo que se tarde un segundo en salirse de el.
este retraso que te pongo aqui se podria decir que es el maximo
lazo1 mov cx,ffffh
lazo2: loop lazo2
lo que se hace es repetirlo varias veces de la siguiente forma
mov bx,00ffh
lazo1 mov cx,ffffh
lazo2: loop lazo2
dec bx
jnz lazo1
pruebalo si es muy grande disminuyele bx y si no ves cambio porque el retraso es muy pequeño aumentale bx poco a poco hasta llegar a ffffh si es necesario
en cuanto al programa que te dije no lo tengo en la computadora lo tengo a mano tendria que digitarlo , estos dias estare ocupada si no te urge avisame asi podria digitarlo el fin de semana o cualquier dia de la otra semana pero si es urgente no te lo puedo mandar.
adios :comp:
-
:kicking: :D :D :D :D :D B) B) B) B) B) :smartass: :smartass: :smartass: Muchisimas gracias, por fin me resulto, tenias razon, la rutina me daba el tiempoi que necesitaba para poder ver los cambios. Acabo de entregar la tarea y ahora solo espero que le guste al profesor.
Nos vemos, y de nuevo muchas gracias.-
-
:) Espero que te pongan buena nota, cualquier otra duda aqui estamos
adios :hola: