Autor Tema: Ayuda xc8 y ASM  (Leído 1361 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado JMKaltenmeier

  • PIC10
  • *
  • Mensajes: 31
Ayuda xc8 y ASM
« en: 08 de Mayo de 2020, 19:41:08 »
Hola que tal?. Necesito ayuda con esto.

Estoy leyendo el registro de un Temporizador en ASM, como estoy en un bucle quiero almacenar en cada pasada por el bucle el valor del registro temporizador en diferentes posiciones de memoria, que sean consecutivas. No se Como hacerlo.
Paso el Codigo. Esta comentado lo que quiero hacer.

Código: [Seleccionar]
    GLOBAL _Pulso ;make _add globally accessible
    SIGNAT _Pulso,4217 ;tell the linker how it should be called
    ;everything following will be placed into the mitexto psect
    PSECT mitexto,class=CODE,reloc=2
   
    acumulador EQU 0x60 
 
_Pulso:
                     
                        BSF T1CON, 0x0      ;enciendo el timer ni bien se empiece a conmutar la llave

                        BSF PORTC, 0x6      ;cierro llave del primario, RC6
        salto1:         BTFSC CMCON, 0x7   
                        GOTO salto1
                        BCF PORTC, 0x6      ;abro llave del primario, RC6

BSF T2CON, 0x2      ;enciendo TIMER 2


BTFSC PIR1, 0x0
GOTO salto3


       salto2:       BTFSC CMCON, 0x6     
                        GOTO salto2
NOP                 ;tenemos 300mv de offset del sensor, entonces le damos un retardo para que la corriente llegue a cero
                        BSF PORTC, 0x6            ;cierro llave del primario, RC6
BCF T2CON, 0x2             ;apago TIMER2
MOVFF TMR2, acumulador

/* Aca guardo el valor del registro TMR2 en 0x60, pero ahora quiero cambiar el valor de acumulador
                       para que en la proxima pasada me guarde el valor de TMR2 en 0x61 y asi sucesivamente...0x62, 0x63.. /*


BTFSS PIR1, 0x0     
GOTO salto1

salto3:       BCF PORTC, 0x6      ;abro llave del primario, RC6
BCF PIR1, 0x0       ;limpio el Flag TMR1IF


 return



Pregunta, es posible reservar espacio de memoria solo para guardar el valor de TMR2, o sea que me reserve 0x60,0x61....0x69 , y que solo esten disponibles para guardar el valor del TIMER2. Que ninguna otra variable ocupe esas posiciones.
Pregunto xq estoy Combinando C y ASM.

Luego desde el codigo en C, quier acceder a esas posiciones de memoria. Como lo hago?.
O mejor dicho, todos los valores que se guardan en 0x60,0x61 ponerlos en un arreglo en el codigo en C

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:Ayuda xc8 y ASM
« Respuesta #1 en: 08 de Mayo de 2020, 22:41:36 »
En ASM no es posible reservar una memoria determinada; si como sabes, es asignarles nombres a diferentes posiciones de variables. De antemano tienes que saber, cual será el tamaño máximo que puedes llegar a necesitar. Así que, si precisas guardar un tamaño de palabra tipo QWORD (esto en ASM no existe); lo que debes hacer es; para más facilidad, renombrar las posiciones de memoria:

Código: [Seleccionar]
  acumulador0  EQU  0x60
  acumulador1  EQU  0x61
  acumulador2  EQU  0x62
  acumulador3  EQU  0x63

Ahora tienes dos opciones:

a) Sumar las variables e ir guardando los resultados correspondiente en las diferentes posiciones de memoria (tendrás que escribir una rutina que sume 1 byte a 4 byte)

b) Medir 4 veces (es este ejemplo) y por cada pasada guardarlo en diferentes posiciones de memoria. Para ello deberás utilizar una variable temporal, para saber en que posición de memoria deberías guardar el resultado. Esto inicia con 0, y cada vez que grabas un dato en una posición, le sumas 1. Al momento de ver en qué posición hay que guardar un nuevo resultado o dato; ves esta variable temporal y sabrás en que posición deberás guardar el dato.

Mucho ojo a la hora de guardar posiciones de memoria. Chequea siempre el banco que estás, y asegúrate que sea el correcto.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado JMKaltenmeier

  • PIC10
  • *
  • Mensajes: 31
Re:Ayuda xc8 y ASM
« Respuesta #2 en: 09 de Mayo de 2020, 10:47:16 »
Hola Leon, Gracias por responder

Citar
a) Sumar las variables e ir guardando los resultados correspondiente en las diferentes posiciones de memoria (tendrás que escribir una rutina que sume 1 byte a 4 byte)
Es necesario demorar los menos posible en la carga del registro en la memoria para volver a testear el estado de los comparadores. Debo verlo, pero puede que demore un par de ciclos hacer algo de eso...No tengo tanta exp en ASM, te lo pienso entre ""

Citar
b) Medir 4 veces (es este ejemplo) y por cada pasada guardarlo en diferentes posiciones de memoria. Para ello deberás utilizar una variable temporal, para saber en que posición de memoria deberías guardar el resultado. Esto inicia con 0, y cada vez que grabas un dato en una posición, le sumas 1. Al momento de ver en qué posición hay que guardar un nuevo resultado o dato; ves esta variable temporal y sabrás en que posición deberás guardar el dato.

Como puedo definir una variable temporal?, va como puedo hacer una variable que haga el papel de tipo "puntero" para que direccione un lugar de memoria y no me modifique el contenido. Ejemplo: que apunte a 0x60, entonces guardo en 0x60, incremento la variable y ahora apunte en 0x61, bueno guardo en 0x61

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda xc8 y ASM
« Respuesta #3 en: 09 de Mayo de 2020, 12:19:09 »
Citar
Como puedo definir una variable temporal?, va como puedo hacer una variable que haga el papel de tipo "puntero" para que direccione un lugar de memoria y no me modifique el contenido. Ejemplo: que apunte a 0x60, entonces guardo en 0x60, incremento la variable y ahora apunte en 0x61, bueno guardo en 0x61

Lo que vos necesitas son los registros FSR de los PICs, vos cargas ahi la direccion y con el registro INDF podes acceder a la direccion esa, luego lo incrementas con un INCF FSR, F

Esto si es un PIC16, si es un PIC18, tenes otras facilidades donde tenes el FSR1 y FSR2 y ademas del INDFx tenes los registros POSTINCx y POSTDECx en cual luego de acceder, solos incrementan el FSR que le correspondan. Lo cual te resume 2 instrucciones en una.

En ASM correctamente deberias reservar los bytes, ya que luego C utiliza el linker, no tengo demasiado tiempo y por eso no te puedo poner un codigo. Pero busca el manual de usuario de MPASM, ahi dice como se deben reservar los espacios de datos, si no mal recuerdo era con udata.. en fin, siento no tener el tiempo para darte una respuestas mas completa.

Los registros asignados como te digo, los asigna el linker, lo cual es lo correcto para cuando hay una mezcla entre ASM y C. Tambien tendrias que ver que registros son los que tenes que mantener para que el programa en C funcione correctamente esto en el manual de usuario de XC8 (XC8 User manual). Si tenes un PIC18 es mucho mas simple ya que podes jugar con el stack, sino vas a tener que tomarte algunos bytes extras.

Desconectado JMKaltenmeier

  • PIC10
  • *
  • Mensajes: 31
Re:Ayuda xc8 y ASM
« Respuesta #4 en: 09 de Mayo de 2020, 13:04:57 »
Hola KILLERJC.

Citar
Lo que vos necesitas son los registros FSR de los PICs, vos cargas ahi la direccion y con el registro INDF podes acceder a la direccion esa, luego lo incrementas con un INCF FSR, F

Esto si es un PIC16, si es un PIC18, tenes otras facilidades donde tenes el FSR1 y FSR2 y ademas del INDFx tenes los registros POSTINCx y POSTDECx en cual luego de acceder, solos incrementan el FSR que le correspondan. Lo cual te resume 2 instrucciones en una.

En ASM correctamente deberias reservar los bytes, ya que luego C utiliza el linker, no tengo demasiado tiempo y por eso no te puedo poner un codigo. Pero busca el manual de usuario de MPASM, ahi dice como se deben reservar los espacios de datos, si no mal recuerdo era con udata.. en fin, siento no tener el tiempo para darte una respuestas mas completa.

Los registros asignados como te digo, los asigna el linker, lo cual es lo correcto para cuando hay una mezcla entre ASM y C. Tambien tendrias que ver que registros son los que tenes que mantener para que el programa en C funcione correctamente esto en el manual de usuario de XC8 (XC8 User manual). Si tenes un PIC18 es mucho mas simple ya que podes jugar con el stack, sino vas a tener que tomarte algunos bytes extras.

Esto que  me  decis parece ser la solucion!. Encontre la info en el datasheet!. Debo ver que no me coma muchos ciclos.
Ahora viene una pregunta.

Bien yo guardo todos esos datos del registro de 8bit TMR2 en memoria (eje, Banco 0), que serán datos en binarios.
Yo ahora desde el codigo en C quiero acceder a esos valores, hay una funcion que pueda usar para leer datos de memoria?. y ese dato ya lo pueda meter en una variable en decimal?.
Ejemplo, el registro TMR2 de 0x00 llego a 0x56. Perfecto, guardo el 0x56 en la posición de memoria 0x60.
Ahora desde C, quiero acceder a 0x60 para leer el valor 0x56 (86 en decimal). Bien, ponele que lo puedo hacer, si le doy ese 0x56 a una variable ya me lo interpreta como 86 y puedo hacer las cuentas tranquilamente con 86?

Desconectado JMKaltenmeier

  • PIC10
  • *
  • Mensajes: 31
Re:Ayuda xc8 y ASM
« Respuesta #5 en: 09 de Mayo de 2020, 13:26:17 »
Se me acaba de ocurrir, que en el codigo en C podria declarar un arreglo, esa declaracion me va a reservar espacio en memoria no?. Busco desde que posicion a que otra me reserva y luego desde el codigo en asm actualizo esas posiciones de memora con el valor del registro TMR2. Entonces cuando vuelva a C en el arreglo ya deberia tener los valores supongo, no?

Desconectado JMKaltenmeier

  • PIC10
  • *
  • Mensajes: 31
Re:Ayuda xc8 y ASM
« Respuesta #6 en: 11 de Mayo de 2020, 11:27:08 »
Listo en principio funciono. Reserve los datos de memoria en un arreglo en C, y en ASM los modifique con el valor de TMR2 y use los registros FSR para moverme! Muchas Gracias!, si llega a surgir alguna duda mas les digo!


 

anything