TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Acumulador13 en 27 de Julio de 2009, 07:49:56
-
Hola a tod@s otra vez, ultimamente estoy experimentado con el conversor A/D del pic16f88 y la verdad es que hasta ahora no me ha dado mayores problemas.
En principio le daba unos valores a unos registros nombrados por mi y comparaba ese valor con el que adquiria por la Ra0 (A/D) y todo perfecto!. Ahora estoy intentando que el valor leido por la Ra0 me lo guarde en un registro al que yo llamo VBat1 para luego hacer una comparación, pues bien, no me la guarda en el registro VBat1, cuando muevo el valor a PORTB me sale el valor que en el apartado EQU le puse a VBat. :? :shock:
Ejemplo:
VBat1 EQU 0Dh
....
....
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W
movwf VBat1 ;pasamos w a la memoria VBat1
....
....
movf VBat1, ;pasamos w a la memoria VBat1, LO HE PROBADO CON movlw
movwf PORTB ;ME INDICA EL 0Dh!!!!
Bueno, pues cuando quiero utilizar mas adelante VBat1 y reflejarlo en PORTB me sale el valor 0Dh, no acabo de entenderlo por mas vueltas que le doy y mas
pruebas que hago. Quiero realizar un programa que mientras que el último valor de Ra0 sea mayor que el primero siga el programa, pero si es menor que me lo indique y pare el programa. no quiero qUe nadie me haga el programa, lo que necesito es saber como puedo guardar el dato que recojo del Ra0 en un registro y que se quede ahi castigado hasta que yo le levante el castigo.
Recibir un saludo de mi parte y que os duren las vacaciones. 8)
-
no pasa el valor porque estas en otro banco.
ADRESL esta en el banco 1 (80-FF)
y Tu registro en el banco 0.
Pero Vbat es igual a 0x0D y esa posicion en el banco 0 esta ocupada por PIR2
Asi que escribirias en ese registro.
En el mapa d ememoria de ese pic , los registros libres comienzan desde 0x20.
VBat1 equ 0x20 ;Vbat1 equivale a 0x20
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W(este registro esta en banco1)
BANKSEL VBat1 ;Cambia al banco donde se localice Vbat1
movwf VBat1 ;pasamos w a la memoria VBat1
....
....
movf VBat1,w ;pasamos w a la memoria VBat1, LO HE PROBADO CON movlw
movwf PORTB ;ME INDICA EL 0Dh!!!!
con eso deberia andar.
(http://img194.imageshack.us/img194/9452/bancosr.th.jpg) (http://img194.imageshack.us/i/bancosr.jpg/)
Tiene tiempo que no toco assembly
Saludos
-
Gracias AKENAFAB, acabo de llegar y he leido tu respuesta, muchas gracias por tu atención, voy a probarlo y mañana posteo el resultado, como funcione sepas que un pedazo de tu saber estará en los sistema que de aqui salgan. solo decir que espero algún dia el pode ayudar yo tambien.
Muchas gracias y ya te digo algo... :)
-
:? Hola, sigue sin ir, me sale el valor 0x20, voy ha seguir probando cosas y si no , veré de hacerlo de otra forma... Con lo que sea en tener la solución la posteo, el caso es que creo que lo tengo claro...Es cojer el dato de Ra0....Luego guardarlo en un registro llamado VBat1.... vuelvo a capturar otro de Ra0...llamo y saco VBat1 lo comparo con el nuevo que acabo de convertir...si es menor el último que me pare el programa, y, si, es mayor que continue, joder. Voy a leer los FUSES por si acaso las moscas, que raro...
Saludos
-
Sube tu archivo así lo compilo y le echamos revisada los dos.
Te adjunto archivo zip con un pequeño programa de ejemplo.
Para simular el ADC , cambia de valor el bit GO del registroADCON0 a 0. y en ADRESL pon el valor que desees.
Abre el File Registers de la pestañita View. Y en 0x20 veras el valor que asiga a ese registro.
¿Porque la 0x20?
porque ahi defini el inicio de mis registros y es el primero.
cblock 0x20 ;Inician VAriables desde 0x20
ADC_VALUE ;0x20
MI_RAM ;0x21
endc ;con esto evitas "equ´s" para definir registros,el 0x20 indica
el inicio del bloque de registros, va incrementando uno en uno , hasta que se encuentre el ENDC "fin de bloque" ;
Saludos!
-
Hola Akenafab, estuve probandolo de varios modos y el resultado es el mismo, ahora si lo pasas directamente el ADRESL a PORTB este si sale correctamente y ves la progresion de 0 a 255 según mueves el potenciometro del entrenador, pero cuando lo guardo en VBat1 y luego lo llamo, me sale 20, lo de simularlo en el PROTEUS lo habia pensado, pero no sabia como simular el ADC, pero tu idea me gusta y voy a ver...
Gracias por tu atención...ya te digo algo :)
Saludos
PROCESSOR 16F88
INCLUDE "p16f88.inc"
RADIX HEX
ERRORLEVEL -302
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
CBLOCK 0x20
ENDC
ORG 0x20
goto inicio
#include Retardos.inc
;*********************************ETIQUETADO REGISTROS********************************
;Contador1 EQU 0Ch
;Contador2 EQU 0Dh
VBat1 EQU 0x20
;Registro temporal para guardar dato convertido
VBat2 EQU 0x21 ;Registro para introducir el valor de tensión de corte
;*********************************INICIO***************************************
inicio
banksel ANSEL
movlw B'00000001' ;Configuro el registro ANSEL para que RA0 sea Analogico (1) y los otros DIGITALES (0)
movwf ANSEL
banksel TRISB
movlw B'00000000' ;Todo PORTB lo configuro a SALIDA, todo ceros
movwf TRISB
banksel TRISA
movlw b'000001' ;Todo PORTA lo configuro a SALIDA menos Ra0
movwf TRISA
banksel ADCON1
movlw B'00000000' ;Configuro ADCON1 para Justificacion Izq, divisor relog por 2 deshabilitado,tension de referencia AVDD y AVSS
movwf ADCON1
banksel ADCON0
movlw B'00000001' ;Configuro ADCON0 para Fosc/8, Selecciono canal 0 (RA0/AN0)y hago operativo el módulo convertidor con el último bit a 1
movwf ADCON0
;************************************PRINCIPAL***********************************
clrw
clrf PORTB
clrf VBat1
call Retardo_1s
Conversión1
bsf ADCON0,2 ;Comienzo conversión
call Retardo_10ms
Espero_Conv1
btfsc ADCON0,2 ;Espero a que finalice la conversión
goto Espero_Conv1
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W
; banksel VBat1
movf VBat1 ;pasamos w a la memoria VBat1
; banksel PORTB
movwf PORTB
call Retardo_5s
; goto Conversión1
Conversión2
clrf PORTB
bsf ADCON0,2 ;Comienzo conversión
Espero_Conv2
btfsc ADCON0,2 ;Espero a que finalice la conversión
goto Espero_Conv2
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W
movwf VBat2 ;pasamos w a la memoria VBat1
movwf PORTB
Aqui call Retardo_5s ;Retardo
movf VBat1,1
movlw VBat1
movwf PORTB ;Me sale el 20!!!
goto Aqui
end
-
Lo reviso ahora , pero con el movlw Vbat1 // VBat1 equ 0x20 es igual a VBat1=0x20
Si quieres cargar el contenido de DIRECCION 0x20
debes hacer esto
movf VBat1,W o movfw VBat1
lo que haces es pasar el contenido del registro 0x20 tambien llamado VBat1 a W
Es cargar el valor de la literal , equ hace igualdad , tu no estas indicando registro , sino un valor y vbat1 vale 0x20
Deja lo compilo y te digo bien.
------------------------------------
Mira comente los retardos , lo demás lo modifique y ya anda igual que el anterior que te puse.
No estas cabiando de BAncos
cuando haces movf VBat1, <--- NO especificas si es W o F , el compilador toma por defecto F osea sobreescribes
PROCESSOR 16F88
INCLUDE "p16f88.inc"
RADIX HEX
ERRORLEVEL -302
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
org 0x00
goto inicio
org 0x04
goto inicio
org 0x020
; #include Retardos.inc
;*********************************ETIQUETADO REGISTROS********************************
;Contador1 EQU 0Ch
;Contador2 EQU 0Dh
VBat1 EQU 0x20
;Registro temporal para guardar dato convertido
VBat2 EQU 0x21 ;Registro para introducir el valor de tensión de corte
;*********************************INICIO***************************************
inicio
banksel ANSEL
movlw B'00000001' ;Configuro el registro ANSEL para que RA0 sea Analogico (1) y los otros DIGITALES (0)
movwf ANSEL
banksel TRISB
movlw B'00000000' ;Todo PORTB lo configuro a SALIDA, todo ceros
movwf TRISB
banksel TRISA
movlw b'000000001' ;Todo PORTA lo configuro a SALIDA menos Ra0
movwf TRISA
banksel ADCON1
movlw B'00000000' ;Configuro ADCON1 para Justificacion Izq, divisor relog por 2 deshabilitado,tension de referencia AVDD y AVSS
movwf ADCON1
banksel ADCON0
movlw B'00000001' ;Configuro ADCON0 para Fosc/8, Selecciono canal 0 (RA0/AN0)y hago operativo el módulo convertidor con el último bit a 1
movwf ADCON0
;************************************PRINCIPAL***********************************
clrw
clrf PORTB
clrf VBat1
;call Retardo_1s
Conversión1
Banksel ADCON0
bsf ADCON0,2 ;Comienzo conversión
; call Retardo_10ms
Espero_Conv1
btfsc ADCON0,2 ;Espero a que finalice la conversión
goto Espero_Conv1
Banksel ADRESL
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W
banksel VBat1
movwf VBat1 ; movf VBat1 ;pasamos w a la memoria VBat1
; banksel PORTB
movwf PORTB
; call Retardo_5s
; goto Conversión1
Conversión2
clrf PORTB
bsf ADCON0,2 ;Comienzo conversión
Espero_Conv2
btfsc ADCON0,2 ;Espero a que finalice la conversión
goto Espero_Conv2
Banksel ADRESL
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W
BANKSEL VBat2
movwf VBat2 ;pasamos w a la memoria VBat1
movwf PORTB
Aqui
;call Retardo_5s ;Retardo
movf VBat1,W ;w=0 ;movf VBat1,1 <--- = F
;movlw VBat1
movwf PORTB ;Me sale el 20!!!
goto Aqui
end
-
Gracias, voy a hacer mas pruebas, aunque te comento que he cambiado anteriormente todo lo que tu muy bien dices, lo mas seguro es que lo haya hecho mal, ya de digo algo...Muchas gracias y hasta dentro de un rato.....
Saludos
-
:( :z) Hola El utilizar un registro con un dato cargado y compararlo con el que te entrega el ADC esta chupado, pero al contrario, o sea, el cargar el valor que te entrega el ADC en un registro para utilizarlo después es una tarea que hasta ahora no da resultado, he probado con los clasicos ejemplos de sumar dos registros y el resultado guardarlo en otro y bien, pero cuando pongo lo que en el ejemplo anterior no hay tu tia, no va de ninguna forma, es como si ADRESL estuviese maldito por alguna bruja menopausica, el valor que recojo es ó 20 que es la dirección que emplazo el registro, ó 56 que no se de donde puñetas viene (sea cual sea el valor de ADC, siempre estos mismos) ó no sale nada, en cambio el conversor ADC me funciona bien si lo saco por el puerto ( se lo que me van a decir...pero no va ). He probado tantas combinaciones en estas últimas horas que puedo escribir assembler en 17 idiomas diferentes con sus dialectos, ahora estoy planteandome el estudiar poesia contemporanea de siglo XIX e irme a dar largos paseos por la playa.... :z).
Menos mal que soy tenaz...seguire hasta que cuando revisen mi ADN desubran particulas de assembler!
-
YA es muy raro eso xD
MIra , pega tu proyecto lo voy a revisar.
Cuelgalo aqui en un archivo zip.
En MPLAB hay un botoncito que dice package project , esta al lado de los botones de compilar ,build all.
Saludos!
-
Hola AKEN..., Ahora despues te paso el Zip, ahora tengo el proyecto muy liado debido a las pruebas que he realizado, lo limpio y te lo mando. He descubierto que puede que no sea tan raro, me explico: He cogido tres registros (ejemplo básico para prenatales, o se yo):
PRI movlw 05
movwf Operando1
movlw 02
movwf Operando2
movfw Operando1
addwf Operando2,0
movwf Resultado
movwf PORTB
call Retardo_1s
clrf PORTB
DQ movwf Resultado
movwf PORTB
mov
goto DQ
En este ejemplo muestro lo que me ocurre, cuando hago la suma y muevo el resultado a PORTB, tengo 111, o sea 7, me funciona como debe de hacerlo, sin mas dilaciones, pero si te fijas en el programa, despues del retardo de 1 seg, borro el PORTB(apago leds) y llamo a Resultado y lo transcribo a PORTB, pues bien me da el mismo valor que en el otro programa o sea 249 ( antes puse 56 en el otro mensaje que mande , pero es 249) ya no vale 111. Creo que para hacer lo que quiero debo utilizar la EEPROM, no le veo otra forma ó no se como hacerlo. No se si ha vosotros os ha pasado, pero pienso que los valores de los registros son inmediatos a no ser que los fijes con EQU, de todas formas lo que me esta pasando es muy ilustrativo y son las cosas que te hacen aprender...de todo esto saldrá algo positivo...ya lo dijo Edison: "He descubierto un millón de formas de como NO hacer una bombilla...y una sola de como hacerla".Lo de la EEPROM me fastidia un poco ya que en el PIC16F84 lo tenia controlado y en este no se como me saldrá, con tantos FUSES...Todo es probar.
Bueno, de todas formas aun creo que habra alguna forma de hacerlo e ire probando.
Ahora limpio un poco el proyecto y te lo paso, pero es lo mismo que me pasa con el que te muestro aqui.
-
Hola pana xD
Mira , cuando llamas a Retardo_1s , sin saber que contenga te digo que estas modificando el registro W , te lo digo porque con este registro Cargamos Cualquier valor para pasarlo a CUalquier registro , cualquier dato pasa por W.
Asi que si al Salir de la subrutina Retardo_1s W se queda con el valor que cargaste en esa subrutina. :mrgreen:
Si no mal entiendo tu programa,
w <-- 5 w=5
w--> Operando1 // operando1=5
w <-- 2 w=2
w--> Operando2 // operando2=2
w<--operando1 // w=5
----
addwf Operando2,0
W+F = 5+Operando2 y guardas en W = Lo que es igual a 5+2=7 y ese 7 indicas que se quede en W,por lo que W=7
--
W--> Resultado // Resultado = 7
W--> PORTB // PORTB= 7 = 0x07 = 0b'00000111'
Call Retador_1s <--- En este llamado estas alterando W , te lo digo sin ver tu subrutina porqu epues tiene que cargarle algun valor no es que sea brujo :D
CLRF PORTB // PORTB = b'00000000'
ATento , aquí viene el detalle
-
movwf Resultado // <----- Lo que tienes que haces es LEER este VALOR no asignarle
En vez de eso tiene que poner
movf Resultado,W // F--> W
esto es lo mismo que movf Resultado,0 // F--> W
y lo mismo que movfw Resultado // F---> W
movwf PORTB // W--> F // Asi W tendra el Valor Extraído de Resultado
---> mov <--- esto no existe
Pruebalo y me dices ^^
-
Te paso el Zip....
-
:) Lo de mov es que se me ha colado...en fin lo volveré a probar, pero me parece que ya lo he hecho todo... no, si al final me voy a partir de la risa...ya veras.. :D
-
Lo he probado y funciona , no has realizado la sugerencias.
bueno ahi te dejo el adjunto.
Revisa las especificaciones del ADC.
Saludos!
-
He realizado las sugerencias como me has dicho, en la suma con el registro Resultado me va, pero en VBat1 no me va aun cambiando de dirección o/y de banco, no me va.
Te agradezco toda tu ayuda y ademas me ha resultado enriquecedora, de hecho en el registro Resultado me funciona como tu dices. No te preocupes.
Lo dicho, muchisimas gracias, si necesitas algo no dudes en decirmelo, de cualquier cosa.
Saludos
-
En lo que se pueda! 8)
Saludos!
-
Se me olvidaba, el conversor siempre me ha funcionado, la lectura de ADC la hare ya que si que he visto algunos cambios entre tu programa y el mio, el tuyo me hace 3 barridos de 0 a 255 conforme toco el potenciomentro desde 0 al tope de este, y en el mio solo me hace un barrido, quiero decir que cuando lo muevo a PORTB con unos led conectados estos se encienden paulatinamente hasta estar encendidos los 8, con el que me pasaste esto lo hace tres veces girando el potenciomentro, me parecio raro al ver que la justificación eran diferentes en ambos ejemplos. Creo que la bruja esta en mis dedos :D :D y en mi forma de interpretar, pero tengo equipos para energía solar utilizando el ADC ( comparando como te dije con registros ya definidos ) y me van de cine :mrgreen: . El problema es el que te explicado anteriormente, he puesto el zip que me reenvias y me hace lo mismo, si que va el conversor, pero no me guarda el registro, snif! Pero no te preocupes, algo tengo que tener mal, he quitado los retardos, he cambiado de bancos, he cambiado de instrucciones..., he cambiado de PIC y al final he cambiado hasta yo...jejejeje, espero no tener que cambiar de cerebro....
Si alguna vez necesitas algún dato sobre transformadores, baterías, fuentes de alimentación, ó alguna documentación no dudes en pedirmela y disculpame por haber sido tan "denso" jejeje
Seguire siendo tenaz...
-
hehee pues sigue asi , que no hay de otra para aprender :mrgreen:
Yo no tuve nigun problema con los registros , lo revisaba en el mplab sim.
Veia como iban pasando los valores y como los tomaba y enviaba al puerto.
Tambien lo simule en proteus y daba bien.
Exito!