Autor Tema: Guardar dato en un registro  (Leído 6823 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Guardar dato en un registro
« 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)



Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Guardar dato en un registro
« Respuesta #1 en: 27 de Julio de 2009, 08:31:11 »
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.

Código: [Seleccionar]
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.



Tiene tiempo que no toco assembly

Saludos
« Última modificación: 27 de Julio de 2009, 08:37:33 por AKENAFAB »

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #2 en: 27 de Julio de 2009, 15:28:46 »
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...   :)
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #3 en: 27 de Julio de 2009, 16:18:52 »
 :? 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
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Guardar dato en un registro
« Respuesta #4 en: 27 de Julio de 2009, 16:41:18 »
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.

Código: [Seleccionar]
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!
« Última modificación: 27 de Julio de 2009, 17:13:05 por AKENAFAB »

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #5 en: 28 de Julio de 2009, 02:54:08 »
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
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Guardar dato en un registro
« Respuesta #6 en: 28 de Julio de 2009, 03:24:00 »
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



Código: [Seleccionar]
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
« Última modificación: 28 de Julio de 2009, 04:25:57 por AKENAFAB »

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #7 en: 28 de Julio de 2009, 08:21:58 »
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
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #8 en: 29 de Julio de 2009, 02:48:00 »
 :(    :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!
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Guardar dato en un registro
« Respuesta #9 en: 29 de Julio de 2009, 03:01:49 »

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!

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #10 en: 29 de Julio de 2009, 04:06:20 »
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.
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Guardar dato en un registro
« Respuesta #11 en: 29 de Julio de 2009, 04:27:39 »
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 ^^

« Última modificación: 29 de Julio de 2009, 04:30:35 por AKENAFAB »

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #12 en: 29 de Julio de 2009, 04:35:48 »
Te paso el Zip....
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado Acumulador13

  • PIC10
  • *
  • Mensajes: 26
Re: Guardar dato en un registro
« Respuesta #13 en: 29 de Julio de 2009, 04:44:36 »
 :) 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
Un hombre inteligente supera rapidamente un fracaso, pero un hombre mediocre jamás supera un exito.
"Hay cosa que para saberlas bien,no basta con haberlas aprendido". Seneca
La persona falsa es detestable para los demas y una desgracia para el mismo.
"No envidies las capacidades de los demas a causa de tu propia incompetencia"
Huanch Daoren---Retorno a los Origenes

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Guardar dato en un registro
« Respuesta #14 en: 29 de Julio de 2009, 06:28:26 »

Lo he probado y funciona , no has realizado la sugerencias.

bueno ahi te dejo el adjunto.

Revisa las especificaciones del ADC.

Saludos!


 

anything