TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: lawren en 22 de Junio de 2012, 05:45:46
-
bueno amigos del foro, estoy realizando un programa que convierta un dato analogo a digital el cual debe ser visualizado en la PC, para lo cual estoy utilizando visual basic, lo que quiero es que tome un dato en la entrada analoga lo convierta a digital y luego la envie, mientras no hay variacion en la entrada analoga no envie, solo que envie una sola ves por cada variacion de la entrada, es donde tengo un problema ya que el programa que estoy relizando envia constamtemente, haber si alguien me puede hechar una manito en esto. adjunto el circuito y el programa que abanse . Gracias..
LIST P=16F877A
__config 3f32
INCLUDE <P16F877A.INC>
INCLUDE <MACROPIC.INC>
ORG 0000H
banco 1
bcf TRISC,6 ; RC6 como salida
mov SPBRG,.129 ; Vtx = 9600bps
mov TXSTA,B'00100100' ; TX-ON / 8 bits /BRGH=1
banco 0
;===========================================
movlw B'10101001' ; Tad = 1.6us /CH-5 /ON
movwf ADCON0
bsf RCSTA,SPEN
OTRA
bsf ADCON0,GO ; Inicio de conversión
btfsc ADCON0,GO
goto $-1 ; ¿Fin?
movf ADRESH,0 ; W <-- ADRESH
call TX_DATO
call RET30us
goto OTRA
;=========================================
TX_DATO
banco 1
btfss TXSTA,TRMT
goto $-1
banco 0
movwf TXREG
return
;=========================================
RET30us
movlw .30
movwf 20H
LAZO
nop ; 0.2us
nop ; 0.2us
decfsz 20H,1 ; 0.2us
goto LAZO ; 0.4us
return
END
-
Pues cuando haces la conversion comparas con la anterior haciendo la resta SUBWF o XORWF si da 0, STATUS,Z=1, no transmites ya que es igual al anterior, si STATUS,Z=0 transmites y lo guardas en un reg. de RAM para comparar en la proxima conversion.
-
ademas deberias poner un margen del valor del A/D.ya que las pequeñas interferencias hacen que los valores del A/D varien un valor ariba/abajo.
y seguiria mandndote datos por la usart.aunque en este caso serian valores diferentes.
-
hola tapi8 gracias por responder mi pregunta seguiendo tu instruccion hice esto. me puedes decir en que estoy mal un favor.
LIST P=16F877A
__config 3f32
INCLUDE <P16F877A.INC>
INCLUDE <MACROPIC.INC>
CBLOCK 0X20
VAR1
ENDC
ORG 0x00
banco 1
bcf TRISC,6 ; RC6 como salida
mov SPBRG,.129 ; Vtx = 9600bps
mov TXSTA,B'00100100' ; TX-ON / 8 bits /BRGH=1
banco 0
;===========================================
movlw B'10101001' ; Tad = 1.6us /CH-5 /ON
movwf ADCON0
bsf RCSTA,SPEN
OTRA
bsf ADCON0,GO ; Inicio de conversión
btfsc ADCON0,GO
goto $-1 ; ¿Fin?
movf ADRESH,0 ; W <-- ADRESH
ENVIO call TX_DATO
movf VAR1 ; el dato enviado guardo en este variable
call RET30us
goto OTRA2
OTRA2
bsf ADCON0,GO ; Inicio de conversión
btfsc ADCON0,GO
goto $-1 ; ¿Fin?
movf ADRESH,0 ; W <-- ADRESH
subwf VAR1,W ;comparo si el dato guardado es igual o diferente al nuevo conversio que realice
btfss STATUS,Z
goto ENVIO; es cero por lo que envio y guardo
bcf STATUS, Z ; es uno borro el flag
goto OTRA2
;=========================================
TX_DATO
banco 1
btfss TXSTA,TRMT
goto $-1
banco 0
movwf TXREG
return
;=========================================
RET30us
movlw .30
movwf 20H
LAZO
nop ; 0.2us
nop ; 0.2us
decfsz 20H,1 ; 0.2us
goto LAZO ; 0.4us
return
END
-
Creo que el fallo es que no guardas el valor de ADRESH en VAR1:
movf VAR1 ; el dato enviado guardo en este variable
Seria:
movwf VAR1
Ademas a ENVIO el programa llega de dos formas (lo estoy mirando a ojo sin simular) desde OTRA donde no miras si hubo cambio, y desde OTRA2 aqui si miras si hubo cambio, guarda el valor despues de "btfss STATUS,Z" tampoco borres el FLAG Z.
ademas deberias poner un margen del valor del A/D.ya que las pequeñas interferencias hacen que los valores del A/D varien un valor ariba/abajo.
y seguiria mandndote datos por la usart.aunque en este caso serian valores diferentes.
Esto que te dice Groundman tambien es cierto, aunque tu no utilizas los dos ultimos bits (ADRESL) y esto te amortiguara variaciones pequeñas, habra que ver si es suficiente.
-
Groundman gracias por tu aporte la verdad soy novato en programacion recien estoy comensando y lo que entendi es lo siguente: el registro ADRESH tiene 10 bit no es cierto y el ADRESL 6 bits, como yo esoty utlizando el adresh y mi conversor es de 8 bit me queda 2 bits el cual hace que mi ad varie de arriba/abajo y como puedo poner esos margenes y no utilizar los esos dos ultimos bits
-
No, ambos reg. tienen 8 bits, como todos en estos PICs, pero pero el ADC es de 10 bits, puedes hacer conversion a 8bits con uno solo, o usar los dos, mirate en el datasheet ese apartado.
Si no controlas mucho ingles mirate esto:
http://www.alos.5u.com/indexpic877.htm
-
lawren.es como dice tapi8.el ADC tiene 10 bit.asi que si el pic trabaja con niveles logicos de 5v. cada bit del ADC se incrementa cada 5/1024=0.0048v
pero si solo utilizamos ADRESL.solo podremos llegar a visualizar 1,24v en un solo registro.y luego volveria a 0v para seguir incrementandose.
por eso si quieres visualizar hasta los 5v en un solo registro,tendras que utilizar los bits b1 y b0 del registro ADRESH y los bits d7,d6,d5,d4,d3 y d2.del registro
ADRESL. lo que pasa es que tendras menos precision en la lectura del valor analogico.con un valor minimo de 0.019v.que tampoco esta tan mal.
y que aun asi puede que el valor oscile por las interferencias.
espero no haberme equivocado en los calculos.ya hace mucho tiempo que no trabajo con los A/D.
-
muchas gracias por su ayuda amigos del foro y la verdad me salio queria compartilos gracia a ustedes.
LIST P=16F877
__config 3f32 ; para 20MHZ
;__config 3f31 ; para 4MHZ
INCLUDE <P16F877.INC>
INCLUDE <MACROPIC.INC>
;*************************************************************
CBLOCK 0x20
VAR1
VAR2
ENDC
ORG 0x00
;**************************************************************
banco 1
mov ADCON1, b'00001110' ;Justificamos el resultado de los registros
;ADRES a la izquierda (ADMF=0). Solo el pin RA0 será canal analógico
;y las tensiones de referencia para el ADC serán VREF+=VDD y VREF-= VSS
bsf TRISA,0 ;Canal AN0 como entrada
bcf TRISC,6 ;RC6/TX salida, pin de transmisión
mov SPBRG,.129 ; Vtx = 9600bps
mov TXSTA,b'00100100' ; TX-ON / 8 bits /BRGH=1
banco 0
;**************************************************************
movlw B'01000001' ; Tad = 1.6us /CH-0 /ON/FOSC/8
movwf ADCON0
bsf RCSTA,SPEN ; SPEN = 1
INICIO
bsf ADCON0,GO ; Inicio de conversión
btfsc ADCON0,GO ;pregunto si la conversion termino
goto $-1 ; ¿Fin?
movf ADRESH,W ;Si, W=ADRESH
GUARDA movwf VAR1 ;cargo el dato convertido en esta variable
call TX_DATO ;llamo para enviar
NUEVO
bsf ADCON0,GO ; Inicio la nueva conversión
btfsc ADCON0,GO ;pregunto si la conversion termino
goto $-1 ; ¿Fin?
movf ADRESH,W ;Si, llevo a W=ADRESH
movwf VAR2 ;guardo la nueva conversion
subwf VAR1,W ;comparo si el dato enviado es igual a la nueva conversion
btfss STATUS,Z ;pregunto por el flag
goto Z_0 ;la comparacion es diferente ?
goto Z_1 ;la comparacion es igual ?
Z_0 movf VAR2,W ;si es diferente saco el nuevo dato a W
goto GUARDA ;me voy pra enviar
Z_1 bcf STATUS,Z ;si es igual borro el flag inicio la nueva conversion
goto NUEVO
;**************************************************************
TX_DATO
banco 1
btfss TXSTA,TRMT ;pregunto si la linea de transmision esta libre
goto $-1
banco 0
movwf TXREG ;el dato que esta en W es enviado
btfss PIR1,TXIF ;Espera hasta que transmisión culminó
goto $-1
return
END
-
Me alegro por tu logro.la primera vez que use el a/d.me satifacio mucho.
Lo principal de la programación de pics es aprenderse el funcionamiento
De los módulos internos.y luego ir avanzando a otros pic más avanzados.
Los módulos en distintas series se parecen.pero no son iguales.
Saludos
-
Me alegro que te haya salido, lawren :-/ :-/