Leer puerto de serie
Hola,
Estoy intentando leer desde ensamblador (8086) el puerto de serie. De momento sé que la interrupción asociada es 0c. Se me ha ocurrido sustituir la ISR por una mía que lea lo que hay en el puerto de serie. Hay alguna forma más fácil de hacerlo?
Esto es lo que tengo:
INTER SEGMENT AT 0 ; segmetno en la tabla de vectores para manejar los vectores como si fueran variables.
org 4*0C ; con esto marco un offset inicial, asÌ la variable empieza en el offset donde esta la isr del puerto de serie. Sin inicializar para no machacar el valor que hay
vector_ip dw (?) ; primero esta el offset, luego la direccion de segmento
vector_cs dw (?)
INTER ENDS
cambia proc
cli;
mov ax,vector_ip
mov guarda_ip,ax
mov ax,vector_cs
mov guarda_cs,ax ; guardo lo que hay
mov vector_ip,offset rutina ; redirecciono a mi rutina
mov vector_cs,cs ;
sti
ret
cambia endp
rutina proc far
;obtener datos del arduino/serie, de un registro?
; poner datos leídos en una cadena
mov dx, offset cadena
mov ah,9 ; para visualizar cadenas con la interrupción 21h
int 21h ; hay que pasarle en DX la dirección de la cadena (no lo
rutina endp
Voy bien? Qué pasa cuando se lanza la isr? se guarda en algún registro la info del puerto de serie? supongo que será algo más complejo y habrá que trabajar con la velocidad, paridad, etc, no?
he dado con está web http://hgr.tripod.com/puertos_ensamblador.html
parece que hace justo lo que quiero pero más sencillo a ver si puedo probarlo y os digo, muchas gracias!!
parece que hace justo lo que quiero pero más sencillo a ver si puedo probarlo y os digo, muchas gracias!!
parece que he cantado victoria antes de tiempo. Leer datos funciona sin problemas pero escribir nada de nada, siempre me da un 80H, que significa un time out
El código es el siguiente
enviar proc
MOV AH,00 ;inicializar el puerto
MOV AL,11101011b ; velocidad 9600, N,un bit de stop, 8 bit de datos....
MOV DX,00 ; puerto com1
INT 14H
MOV AH, 1 ; enviar
MOV AL, 'S' ; envio un caracter
MOV DX, 00 ; puerto com1
INT 14H
RET
enviar endp
El código de recibir es el siguiente (funciona bien):
recibir proc
push bx
MOV AH,00 ;inicializar el puerto
MOV AL,11110011b ; velocidad 49600, N,un bit de stop, 8 bit de datos....
MOV DX,00 ; puerto com1
INT 14H
Esperar:
mov dx,0000
mov ah,03h
int 14h
test ah,01h; si el bit 1(dato listo) esta puesto a cero no hay dato listo
jz Esperar ;salta y vuelve a verificar
mov dx,0000
mov ah,02h
int 14h
mov car, al
pop bx
ret
recibir endp
El código es el siguiente
enviar proc
MOV AH,00 ;inicializar el puerto
MOV AL,11101011b ; velocidad 9600, N,un bit de stop, 8 bit de datos....
MOV DX,00 ; puerto com1
INT 14H
MOV AH, 1 ; enviar
MOV AL, 'S' ; envio un caracter
MOV DX, 00 ; puerto com1
INT 14H
RET
enviar endp
El código de recibir es el siguiente (funciona bien):
recibir proc
push bx
MOV AH,00 ;inicializar el puerto
MOV AL,11110011b ; velocidad 49600, N,un bit de stop, 8 bit de datos....
MOV DX,00 ; puerto com1
INT 14H
Esperar:
mov dx,0000
mov ah,03h
int 14h
test ah,01h; si el bit 1(dato listo) esta puesto a cero no hay dato listo
jz Esperar ;salta y vuelve a verificar
mov dx,0000
mov ah,02h
int 14h
mov car, al
pop bx
ret
recibir endp
hola una consulta que significa
mov car, al
OSEA ESPECIFICAMENTE ESE "CAR"