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.