TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: alogic.on en 24 de Junio de 2007, 08:40:53
-
hola a todos
tengo un problemilla con el cad , y es que no deberia usar datos superiores a 127 en el reg adresl, he pensado usar una tension de referencia mayor a la que entra por los comparadores ,he deducido(no soy muy bueno con las mates) que si tiene diez bits de resolucion adresh/adresl que son 1023 posiciones de resolucion, con diez voltios a hara un incremento en adresh/l cada 0,009...V entonces para 127 tendria que usar 127*0,009..= 1,24V aprox. como maximo para que no pase de 127 en adresl
otra forma que le estoy dando vueltas es la de dividir por dos 4 veces los diez bits 1023:8=127,875 que asi saldria proporcional y "casi" sin pasar del valor aunque no se como hacerlo con dos registros diferentes :?
que harian ustedes para no encontrar valores superiores a 127 en adresl por si conocen otra forma de hacerlo
gracias y un saludo
-
una pregunta, me parece que quieres conectarle 10V al pin análogo del pic?
-
hola , a los analogicos an1 an2 an3 y an5 de 0 a 1,24 y 10 al de vref, si utilizase seria 5v para vref y que el reg adresl no pase de 127 seria de 0 a 0,620 por los analogicos , si conoceis otra forma de hacer que la conversion del cad no de mas de 127 o como roto cuatro veces adresh y l que son dos reg y no uno, no logro imaginarme como dividirlo, estaria encantado de conocerla
un saludo y gracias
-
Amigo espero no hayas quemado tu Vref... los pics no soportan 10V de Vref.
Lee los electrical specifications del datasheet del pic que has elegido.
-
:? amigo los pics solo soportan 5V (5.6 creo como max). pobre pic.... :8}
-
hola, mirare en el datasheet cuanto soporta la Vref. Di por hecho que aguantaria mas :? gracias por vuestra observación
entonces como puedo hacer para que de una conversion con un maximo de 127 teneis alguna idea :mrgreen:
gracias y un saludo
-
pues creo que lo primero que deberias plantearte es como vas a reducir esos 10 voltios para sensarlo con el pic.
-
hola
no tengo ningun problema en que sea 5V la tension para Vref,o usar la Vdd, eso significa usar una tension de 0-0,620 para los canales analogicos y que la conversion no pase de 127 en adresl, por eso os preguntaba, si conociais alguna otra forma de hacerlo, usando los diez bits. siendo 1111111111=01111111=127 no conozco si se puede hacer una tabla comparativa ni si existe y que cada 8 valga 1 o si se puede dividir el registro entre 8 rotarlo 4 veces no se como hacerlo con dos registros al tiempo asi pues acudo al foro por si alguien a tenido un problema similar o sabe como ayudarme
gracias y un saludo
-
a ver lo que comprendo de tu problema es lo siguiente: quieres medir un valor de tensión cuyo máximo valor debe registrarse en el CAD del pic como 127 o en hexadecimal 0X7F? si es asi entonces hay una solución y es definiendo tu Vref+, sino explicame denuevo :-/ :mrgreen:
-
asi es¡¡ que de como maximo 127, perdona si no me habia explicado bien. :?
gracias por la santa paciencia que teneis
-
jajaja de santo no tengo nada jajjaaj pero bueno es que me llamo la atencion que querias clavarle 10 voltios al pic jijijijij pero bueno, a ver entonces ya que tenemos bien planteado el problema lo siguiente es entender el margen de captura máximo del conversor A/D, repasemos .... mmmm caballero nomas hay que dividir con rotaciones a la izquierda, mmm.... intenta lo siguiente:
- configura la lectura de 10bits con justificación a la izquierda. de tal manera que los 2 bits de menor peso esten ubicados en el adressL y los 8 de mayor peso en el registro adressH.
- entonces te olvidas del adressL, ahora fijate en el adresH, tiene 8 bits entonces le haces un desplazamiento a la derecha con RRF ADRESH,F (previamente limpia el bit C del registro status) entonces se dividira entre 2, osea si tu lectura fue la maxima digamos 0XFF ahora te quedara 0X7F, que es tu lectura máxima pero expresada en menor valor y perdiendo mucha precision debido a los calculos de aproximación.
-
con el adresl tienes para hacer esa funcion amigo.
al tener 1240mv en la entrada ra0 tendrias en la salida es 254 en binario. rotas este resultado a la derrecha y te daria 127
cogiendo los adresl como justificacion a la derecha.
saludos
-
muchas gracias por su ayuda, no entendia que era justificar a derecha o izq ahora ya si :-/
al tajo, a ver que sale
gracias y un saludo
-
Holas de nuevo, aqui estoy comiendome la cabesa con los simuladores :? si no es uno es otro
os hago un resumen de lo que hace el programa:(vaya ser que sea eso)
primero pone los pines 0 1 2 de PORTD a cero, asi elige el canal 1 del multiplexador ,seguido lee canal 1 (AN0) hace la conversion A/D, copia ADRESH en GUARDA, lo divide entre dos,y lo resta con el registro del potenciometro si no da cero salta a copiar el nuevo dato en el reg POTE1 y a la rutina ENVIA que manda los datos por la usart, si fueron iguales cambia al AN1 repite con POTE2asi repite hasta que completa 32 POTES cambiando entre los ocho canales de los multiplexores y los cuatro A/D AN0/1/2/4 y vuelve a empezar. Todo seria muy bonito si no fuese por que en el simulador se queda pillao con poner un valor diferente a cero , parece que no pone a uno el bit Z de STATUS si la resta que hace entre GUARDA y POTEX no es entre 0 y 0 :shock: eso en proteus y en picsimulator se queda dando vueltas en el envio de la usart cosa que en isis no sucede(estoy que me tiro de los pelos) he repasado el codigo un millon de veces y como en el simulador funcionan unas cosas y en otras no os voy a poner ese pedacito de programa que os he descrito , por si vosotros lo hariais de otra forma
bcf STATUS,5
movlw b'00000000'
movwf PORTD
clrf CONTROLADOR ;limpia el registro del numero del controlador 0-32
movlw b'00000101'
movwf ADCON0
dato1 btfsc ADCON0,2 ;bucle que testea hasta que termina la conversion AD
goto dato1
movf ADRESH,w
movwf GUARDA
RRF GUARDA,F
MOVF GUARDA,W
subwf POTE1,0 ;aqui en proteus si no es 0-0 no da cero nunca la resta, rarisimo con cualquier valor siempre salta a enviar cosa que no pasa en picsimulator
movf GUARDA,w ;esta parte la pondria dentro de la rutina envio pero ya la he probado aqui y alli. Y da igual el prog hace lo mismo
movwf POTE1 ;si fue igual deja lo mismo y si no otro
btfss STATUS,2 ;si esta a uno el resultado fue igual que el anterior
call envio ;si es diferente salta a enviar los datos por la usart y pone a cero el bit Z por si aca no lo hacia
retfie ;y va a por el pote2 cambiando el canal analogico a convertir cuando a leido los cuatro cambia la salida de portc a 001 y vuelve a convertir el canal uno pote5 canal1 pote6.......hasta 32
bcf STATUS,5
movlw b'00000001'
movwf PORTD
incf CONTROLADOR..........
etc etc etc...............POTE5
--------------------------------------------------------------------------
envio bsf STATUS, 5 ;pagina 1
bsf TXSTA,5 ;activo el emisor
bcf STATUS, 5 ;pagina 0
bcf STATUS,2
bcf INTCON,7 ;deshabilita las interrupciones
movf GUARDA,w ;señal de timming clock
movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG
bsf STATUS, 5 ;pagina 1
FIN btfss TXSTA, 1 ; Compruebo si el bit TMRT del registro esta
; a '1' o a '0'.
; Si esta a '0' es que esta lleno TMRT y no
; ha terminado de transmitir,
; para ello TRMT tiene que estar a 1, hasta
goto FIN ; entonces esperamos.aqui se queda pillao en picsimuator volviendo a FIN continuamente
bsf INTCON,7 ;activa las interrupciones
goto salida
he copiado las rutinas una detras de otra, quitando las instrucciones de CALL para que no pierda leerlas aun asi adjunto el asm por si pueden simularlo ustedes y aclarame que estoy haciendo mal
gracias y un saludo
a ver si tengo un rato y voy a la tienda por material pa clavarle unos voltios al pic y ver que pasa :mrgreen:
-
holas he modificado el codigo y parece que ya funciona :-/ :-/solo me falta montarlo y probar fuera del simulador
por si a alguien le sirve dejo como adjunto el asm y la simulacion en proteus, si teneis alguna critica constructiva hacedla que siempre viene bien un punto de vista diferente :-)
esta echo para 64 entradas analogicas con ocho 4051
un saludo y gracias por su ayuda que sin ella seguro que aun estaria colgado