Autor Tema: asm en CCS  (Leído 9862 veces)

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

Desconectado one_k

  • PIC10
  • *
  • Mensajes: 4
asm en CCS
« en: 15 de Agosto de 2008, 13:49:45 »

Hola, primero quería felicitar a la gente del foro, muy buena información, siempre que tengo dudas busco en aca y casi siempre encuentro respuestas.

Bueno la duda es la siguiente: Estuve trabajando en C y la verdad que realmente simplifica mucho la tarea de un programador de microcontroladores, pero cuando necesito un riguroso control de tiempo recurro al asm, pero cuando necesito usar registros de ram en asm como se que el compilador no las esta usando?, o como hago para reservarlas para que el compilador no las use?,además como defino las EQU ?
tengo que incluir archivos .asm con las EQU definidas?

Desde ya muchas gracias. :-)

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: asm en CCS
« Respuesta #1 en: 15 de Agosto de 2008, 15:05:07 »
Qué tal one_k, bienvenido al foro!
Puedes usar la directiva #reserve, justo después de la directiva #device.

La sintaxis es así:

Código: C
  1. #device PIC16F877    //El micro que estés usando
  2.                              //Puedes usar cualquiera de estas tres formas:
  3. #reserve 0x20
  4. #reserve 0x20,0x30,0x40
  5. #reserve 0x20:0x30

De esa forma aseguras que el compilador no usará dichas direcciones de memoria. Esto es con el compilador CCS.
En cuanto a la otra pregunta, no la entendí muy bien; pero si te refieres a cómo definir las variables en C tal como se hace en ASM con el EQU, puedes usar las directivas #byte o #locate.

Te recomiendo que leas el manual de C, allí está toda la información que necesitas.
Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado one_k

  • PIC10
  • *
  • Mensajes: 4
Re: asm en CCS
« Respuesta #2 en: 15 de Agosto de 2008, 16:15:15 »
Gracias por la rápida respuesta!!

gracias lo de reserve era justo lo que estaba buscando, pero me surge una duda, estuve leyendo un manual de usuario de ccs escrito por andres canovas lopez y en el dice que la directiva reserve  " Permite reservar posiciones de la RAM para uso del compilador." , entonces yo habia interpretado que las reservaba para uso especifico del compilador.

Lo de los EQU a lo que me referia es que cuando escribo assembler en Ccs quiero usar etiquetas, pero no puedo definirlas ya que al poner:  hola EQU  0x20  dentro de los #asm ......... #endasm me dice que no son instrucciones.

Saludos.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: asm en CCS
« Respuesta #3 en: 15 de Agosto de 2008, 16:58:18 »
hola one_k!
Como dice firepic, para reservar lugares de memoria utilizas por ej:
Código: [Seleccionar]
#reserve 0x20,0x30,0x40De ahi en mas para referirte a dichas posiciones de memoria, utilizas su direccion. Si te molesta tener q usar el numero de esta, podrias utilizar la directiva #define de C
Código: [Seleccionar]
#define VAR1 0x20
#define VAR2 0x30
#define VAR3 0x40

Fijate si con eso te anda porq no estoy muy seguro, saludos!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: asm en CCS
« Respuesta #4 en: 15 de Agosto de 2008, 17:28:32 »
Pregunta del que no sabe: ¿No hay forma de que el compilador comparta las definiciones que se hacen de las variables?

Si en C escribo:

int8 MyVar;

¿No podría escribir en ASM?:

movwf MyVar;

No he hecho la prueba ... pero ¿funcionaría? Al fin y al cabo el compilador/ensamblador es el mismo y quizás compartan las direcciones.  :shock:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: asm en CCS
« Respuesta #5 en: 15 de Agosto de 2008, 17:38:56 »
cuando se realiza código en ASM tb se puede especificar como:

#ASM
 movlw 50
 movwf 05
#ENDASM

y generalmente se lo utiliza en funciones, al menos eso es lo que alguna vez leí y lo aplique
.

Desconectado one_k

  • PIC10
  • *
  • Mensajes: 4
Re: asm en CCS
« Respuesta #6 en: 15 de Agosto de 2008, 18:09:18 »
Gracias por seguir contestando!

Gera: lo que vos decis funciona y lo estube probando, o sea primero usar el #define var1  0x20 y luego decir #reserve var1 y usarlas en el programa en c como punteros y dentro del asm como direccion de la variable.

ej:

#define var1 0x20
#reserve var1

   *var1 = 255;
 
#asm
      movf var1,0
      sublw 0xff
      movwf var1
#endasm

seguramente en *var1 va a haber guardado un cero luego de ejecutar esto.


RedpPic: eso tambien lo estuve probando pero no funciona, lo que hago es fijarme en el dissasembly listing la dirección de memoria que usa al declararla y limpiarla y luego en assembler usar la misma pero no es muy elegante que digamos, o tambien para lograr algo parecido podes hacer lo que dije arriba.


Saludos.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: asm en CCS
« Respuesta #7 en: 15 de Agosto de 2008, 18:36:49 »
Voy a probar lo que dice el maestro Diego. Porque me extraña que one_k diga que no funcione.
En el manual del CCS hay un ejemplo del uso de #ASM... #ENDASM y lo hacen de esa forma, declarando una variable en C y luego la usan en el código asm tal cual.
Luego que haga la prueba les diré. Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado one_k

  • PIC10
  • *
  • Mensajes: 4
Re: asm en CCS
« Respuesta #8 en: 15 de Agosto de 2008, 18:50:49 »

Perdon, me retracto, es cierto acabo de probarlo y si anda lo que dice firepic tambien, no se que habre probado antes :roll: .

Saludos.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: asm en CCS
« Respuesta #9 en: 15 de Agosto de 2008, 19:02:06 »
Correctamente one_k. No había visto tu mensaje, por eso hice la prueba y tal como tú dices, funciona de lo lindo.
También incluyo el #reserve y en efecto funciona bien, fíjate que la variable valor arranca en la dirección 0x32, de quitar el #reserve arranca en la 0x21 (si mal no recuerdo, ese fue el valor de la dirección cuando le quité el #reserve).
Aquí les dejo la prueba:



El maestro diego claro que tenía la razón.  :)
Ok saludos, nos leemos!  :mrgreen:
« Última modificación: 15 de Agosto de 2008, 19:05:13 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: asm en CCS
« Respuesta #10 en: 14 de Enero de 2009, 08:28:48 »
Rescato el hilo para añadir una pregunta...

Mezclando asm y C de ccs se traspasar las variables ques están dentro de su ambito... locales y globales. Pero me veo obligado a redefinir todos los SFR y registros del micro que en C no tengo que definir... Status, Z, C, INTCON etc... Hay alguna forma de solucionarlo? o solo resignación.

1 saludo

Desconectado leobianco

  • PIC10
  • *
  • Mensajes: 7
Re:asm en CCS
« Respuesta #11 en: 10 de Octubre de 2016, 23:52:36 »
Hola comunidad de todopic,

tengo un problema que me ha estado hasechado en varios codiogs y con varios micros que estado implementando.
Resualta que al utilizar las funciones de RTOS, la funcion printf, sprintf, las librerias usb, punteros con vectores de varios elementos, etc, de ccs, he notado que por momentos me hace mal los calculos o me carga cadenas que no cresponden, etc. tengo la leve sospecha de que el codigo que genera ccs en ciertas ocaciones pisa lugares de memora que por supuesto no deberia pisar o utilizar.

¿Alguien ha detectado el mismo inconveniente?

Si se puede debatir un poquito este tema seria genial ya que he visto que hay algo que ccs no esta haciendo bien o, que es muy probable, hay algo que yo no estoy configurando como corresponde.

Dejo algunos ejemplos mas concretos:

#1- Utilizando las funciones printf o sprintf, si se da una interrupcion durante su ejecucion, es muy probable que cargue mal la cadena de caracteres correspondiente.
#2- al utilizar punteros para hacer calculos de un filtro pasabajo, llevando a cabo una convolucion, tambien si se da una interrupcion durante su ejecucion, es muy probable que realice mal el calculo.

Espero que alguien tenga alguna sujerencia.

Les dejo mis saludos!