Inoutdac.DLL


Como, el ADC, tiene que muestrearse rapidamente, nos conviene crear una libreria, que se encarge completamente, del tratamiento de la señal analoga y solo nos devuelva el valor en Bits, para este caso como es de 8 bits, nos tiene que devolver de 0 a 255. Para esto analizamos la imagen de los tiempos del ADC0832


Luego de observar detenidamente, nos damos cuenta que en la mitad de un flanco, ya sea hacia arriba, o hacia abajo, hay mediciones, por eso, nos conviene crear fucniones que realicen estos cambios, y para llamarlos, creo algunas macros.

Bueno, el archivo es un tanto extenso, asi que solo voy a colocar el archivo en ASM, para mas informacion, vean el Codigo donde se especifica lo demás.
;Esta Dll servira para poder usar el DAC y el ADC
;Para el control de un MOTOR DC mediante un control PID Discreto
;Para el ADC0832 (Intrada en Serie)
;Usamos:
;                ----------
; CH0 -->|               |<-- CLOCK = C2
;               | ADC     |<-- DI(Entrada) = ~C0
; CH1--> |    0832   |<-- ~CS (Chip Select) = ~C3
;               |               |---> D0 (Output) = S3
;                ----------

;
.386
.model flat,stdcall
option casemap :none
include inoutdac.inc
.stack 100h
.data
recogido db 8 Dup (?)
hInstance dd ?
.code
DllEntry PROC hInst :DWORD, Reason :DWORD, Reserved1 :DWORD
mov eax, hInst
mov hInstance, eax
xor eax, eax
inc eax
ret
DllEntry ENDP

;Hace un clock con un retardo de 1 ms
clock proc
push ax
_in 37AH ; Me regresa Dato en AL
and al,11111011b
_out 37AH ;Envio DAto con C2 = '0'
_demora
or al,000000100b ;Hago que C2 ='1'
_out 37Ah ;Envio C2 = '1'
_demora
pop ax
ret
clock endp


chip proc
pusha
push ax
_in 37Ah
and al,11110111b ;CS='0'
pop bx
.IF bl==1 ;Si bl ='1'
or al,00001000b ;Entonces CS='1'
.endif
_out 37Ah
popa
ret
chip endp
;Para este caso esta invertido
din proc
push ax
_in 37Ah
and al,11111110b ;DI='1'
pop bx
.IF bl==0 ;Si BL ='1'
or al,00000001b ;Entonces DI='0'
.endif
_out 37Ah
ret
din endp

dato proc
mov edi,7
xor ebx,ebx
mov ecx,8
@dato:
mov al,recogido[edi]
ror bl,1
OR bl,al
dec edi
loop @dato
xchg eax,ebx
ret
dato endp

demora1 proc
PUSHA
mov ecx,0Fh
@lazo1:push ecx
mov ecx,0Fh
@lazo2:nop
loop @lazo2
pop ecx
loop @lazo1
POPA
ret
demora1 endp

bit proc
Xor eax,eax
_in 379H
shr al,3 ;Roto 3 Bits, para tener en el LSB='S3'
and eax,1 ;Me Quedo con ese bit
ret
bit endp

sube proc
_in 37Ah ;reviso control para quedarme con Clk, que es C2
or al,100b;Luego obligo a que C2 sea '0' FLANCO HACIA ARRIBA ¡
_out 37AH ;y lo envio al Puerto
_demora1
ret
sube endp

baja proc
_in 37Ah ;reviso control para quedarme con Clk, que es C2
and al,11111011b;Luego obligo a que C2 sea '1' FLANCO HACIA ABAJO !
_out 37AH ;y lo envio al Puerto
_demora1
ret
baja endp

inver_byte Proc datillo2:BYTE
Xor ebx,ebx
XOR EAX,EAX
mov AL,datillo2
mov ecx,8
mov bx,0
lazo_inv:
rol ax,1
or bl,ah
and ah,0
loop lazo_inv
xchg bl,al
ret
inver_byte endp


datillo proc

pusha
_chip 0 ;Deshabilito Chip
_clock1

_din 1 ;START BIT
_chip 1 ;Habilito Chip

_clock1 ;Baja y Sube

_din 1 ;SGL/~DIF
_clock1

_din 0 ;DOD/SIGN
_clock1

_clock2 ; Para la sincronizacion
_clock1; en D0 (Mux Settling Time)
;_clock1
mov esi,0
@datillo:
_clock2
_sube
_bit
mov byte ptr recogido[esi],al
_baja
inc esi
cmp esi,8
jnz @datillo
call dato;'Recupero Datos
mov esi,0
mov byte ptr recogido,al
_chip 0
_clock1
popa
xor eax,eax
mov al,recogido
ret
datillo endp


_ror proc datillo3:byte,veces:byte

xor eax,eax
mov al,datillo3
mov cl,veces
ror al,cl
ret
_ror endp
_rol proc datillo3:byte,veces:byte
xor eax,eax
mov al,datillo3
mov cl,veces
rol al,cl
ret
_rol endp

_shl proc datillo3:byte,veces:byte
xor eax,eax
mov al,datillo3
mov cl,veces
shl al,cl
ret
_shl endp

_shr proc datillo3:byte,veces:byte
xor eax,eax
mov al,datillo3
mov cl,veces
shr al,cl
ret
_shr endp
binari proc datillo3:WORD

Xor eax,eax
mov ax,datillo3
xor ah,ah
ret
binari endp
end DllEntry



Yoel Ocmin

yoelocmin@hotmail.com


Como han podido observar, el crear una Dll enRadAsm, es mucho mas facil, Asi que se los recomiendo.


 [Regresar Anterior]                                                                [Principal]