Autor Tema: Problemas al mezclar c y assembler  (Leído 4551 veces)

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

Desconectado moneditas

  • PIC10
  • *
  • Mensajes: 8
Problemas al mezclar c y assembler
« en: 01 de Octubre de 2006, 17:13:43 »
Hola!

estamos trabajando en assembler pero necesitamos que se llame desde un proyecto en c. En assembler no tiene ningun problema al correr, pero cuando lo llamamos desde un proyecto en c aparece el siguiente error

MPLINK 4.03, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000018, length=0x00000ccc
Errors    : 1

Tienes alguna idea al respecto??

Muchas gracias!!
  :-)
Moneditas

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas al mezclar c y assembler
« Respuesta #1 en: 01 de Octubre de 2006, 17:47:24 »
Hola!

estamos trabajando en assembler pero necesitamos que se llame desde un proyecto en c. En assembler no tiene ningun problema al correr, pero cuando lo llamamos desde un proyecto en c aparece el siguiente error

MPLINK 4.03, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000018, length=0x00000ccc
Errors    : 1

Tienes alguna idea al respecto??

Muchas gracias!!
  :-)
Moneditas

Me parece que están/as siendo algo escaso en tu explicación

Qué lenguaje C estas usando? C18? Si es así, has leído la guía del C18 ? hay una parte donde explica perfectamente como hacer esto que tu pides.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado moneditas

  • PIC10
  • *
  • Mensajes: 8
Re: Problemas al mezclar c y assembler
« Respuesta #2 en: 01 de Octubre de 2006, 20:03:22 »
Hola todos!!!

Lamentamos no haber sido explícitas  :( , es nuestra primera vez en un foro  :g)

El proyecto que estamos realizando es un sistema de navegación no intrusivo para un robotsito de una plataforma.  El sistema de navegación es para interiores; usa un algoritmo de barrido de regiones basado en la técnica de backtracking.  El sistema de localización que estamos usando lo heredamos de un proyecto anterior. El sistema de localización usa odometría y un sistema de detección de marcadores metálicos  (moneditas)  para la corrección de los errores sistemáticos produciods por la odometría. Estamos desarrollando el C el algoritmo de barrido, pero tenemos en asm la localización. Estamos usandol el PIC 18F452, lenguaje C18.  Leimos el manual del usuario mplab_C18_user´s_guide, e implemetamos el ejemplo con un programa pequeño, y nos funciona. El ejemplo que usamos fue el siguiente:

Programa en C que llama al de asm PARTIDA():


#include <p18F452.h>   //;processor specific variable definitions
         
extern void PARTIDA(void);

void main()
{
PARTIDA();
}


Programa en asm PARTIDA, que prende un led y si el RB0 del puerto B está en bajo, apaga el LED conectado a RA0 del puerto A.

#include <p18f452.inc>
ORG   H'00022a'
GOTO   PARTIDA

udata_acs
RP0 equ 0x001
RP1 equ 0x101

      code
PARTIDA
   BCF   STATUS,RP1   
   BSF   STATUS,RP0   ;banco 1
   MOVLW   B'00011110'      
   MOVWF   TRISA      ;PORTA output sólo RA0
   MOVLW   H'FF'      
   MOVWF   TRISB      ;PORTB es input, en particular RB0
   BCF   STATUS,RP0   ;banco 0

LOOP   
   BTFSC   PORTB,0      ;¿RB0 está en 0?
   CALL   PRENDE_LED   ;si NO (o sea,RB0=1), entonces prende el LED
   BTFSS   PORTB,0      ;¿RB0 está en 1?
   CALL    APAGA_LED   ;si NO (o sea,RB0=0), entonces apaga el LED
   GOTO    LOOP

PRENDE_LED
   BSF   PORTA,0   ;pone en 1 el pin RA0
   RETURN

APAGA_LED
   BCF   PORTA,0   ;pone en 0 el pin RA0
   RETURN

   GLOBAL PARTIDA
   END


Hasta acá todo iba bien!!!  :g)

Entonces decidimos realizar la prueba con nuestro sistema de localización. Pero al correrlo se nos presnta el error:

MPLINK 4.03, Linker
Copyright (c) 2006 Microchip Technology Inc.
Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000018, length=0x00000ccc
Errors    : 1

Alguien nos sugirió modificar el archivo .lkr , pero no fue concreto.

Si alguno de uds sabe, nos gustaría que nos ayudaran a solucionar por favor nuestras dudas, para poder seguir con nuestro proyecto adelante!!

De antemano gracias!

Moneditas   :g)






 

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas al mezclar c y assembler
« Respuesta #3 en: 02 de Octubre de 2006, 09:41:44 »
moneditas el código en sí no me dice nada para este tema en puntual.

Han hecho algún programa simple en C? Si es así deben usar el archivo de LKR.

Saben interpretar el archivo LKR?  Para incorporar código ASM a un código en C, les sugiero que lean estos temas.

Relocatable Coding o código reubicable, del siguiente documento
MPASM, MPLINK y MPLIB User Guide

Llamando funciones en ensamblador desde el C.  Sección 3.2.5.2
MPLAB C18 User Guide


Cuando lean eso, podran comprender qué es lo que está sucediendo.

Deben comprender como trabajar con el linker y como decirle al C que una variable o función en ensamblador existe y como llamarla, etc.

Cualquier otra duda vuelvan a preguntar.


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado moneditas

  • PIC10
  • *
  • Mensajes: 8
Re: Problemas al mezclar c y assembler
« Respuesta #4 en: 06 de Octubre de 2006, 19:02:33 »
Hola a todos!!!!


Como ya les habia contado, el programa que tengo es en assembler(bastante largo) y lo necesito en C para una aplicación específica en el PIC18f452. Pero al parecer nos es tan sencillo, entonces he decidido hacerlo de nuevo utilizando C18; el inconveniente que tengo ahora es que debo hacer operaciones con punto flotante. Alguien ha trabajado con esto'''. Ademas necesito una libreria que me calcule solo el sen y el cos de un ángulo.

Alguien tiene una libreria solo con estas dos funciones trigonométricas???


Gracias por la colaboración



moneditas :-)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas al mezclar c y assembler
« Respuesta #5 en: 09 de Octubre de 2006, 08:37:27 »
Hola a todos!!!!


Como ya les habia contado, el programa que tengo es en assembler(bastante largo) y lo necesito en C para una aplicación específica en el PIC18f452. Pero al parecer nos es tan sencillo, entonces he decidido hacerlo de nuevo utilizando C18; el inconveniente que tengo ahora es que debo hacer operaciones con punto flotante. Alguien ha trabajado con esto'''. Ademas necesito una libreria que me calcule solo el sen y el cos de un ángulo.

Alguien tiene una libreria solo con estas dos funciones trigonométricas???


Gracias por la colaboración



moneditas :-)

He trabajado con el C18 en operaciones de coma flotante y anda muy bien.

En cuanto a las operaciones trigonométricas, todo depende de la presición que necesites.  Es decir, de qué argumento (en radianes o grados) le pasarás a la función.  Por ejemplo si pasarás datos de cada 1 grado, no es lo mismo que le pases datos cada 0.5 grados o cada 0.001 grados.

En cualquiera de los casos, el polinomio de taylor para la función seno y coseno te podrá resolver el problema. 

Si necesitas "velocidad" podrías implementar una tabla de resultados de la función seno en función del argumento que le pases a la misma.  Eso ocupa mucho espacio en memoria de programa pero es muy veloz si necesitan velocidad.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado moneditas

  • PIC10
  • *
  • Mensajes: 8
Re: Problemas al mezclar c y assembler
« Respuesta #6 en: 10 de Octubre de 2006, 20:03:45 »
Buenas tardes


Mi proyecto especificamente es implementar la odometria que es un mecanismo basado en ecuaciones con las que se calcula una posición momentánea relativa a una posición inicial conocida, para esto se debe conocer la distancia recorrida por cada rueda del robot. Esto se logra a través de sensores denominados encoders.

Los encoders se basan en un haz de luz emitido hacia un fotorreceptor, este haz se interrumpe periódicamente por un disco con perforaciones, generando una señal de pulsos (unos o ceros), con el numero de pulsos podemos determinar la distancia que ha recorrido el robot. Para tomar esta señal es mejor generar interrupciones o hacerlo por polling?


Anteriormente este diseño se habia realizado en assembler y utilizaban rutinas de punto flotante para hacer las operaciones matemáticas. me gustaria saber si en C18 cuando se tiene un número declarado como float, las operaciones como suma se pueden hacer utilizando una libreria predeterminada como math o se requiere de alguna rutina especial como en el caso de assembler   



Gracias por la colaboración


MONEDITAS :-)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas al mezclar c y assembler
« Respuesta #7 en: 10 de Octubre de 2006, 23:59:00 »
Los encoders se basan en un haz de luz emitido hacia un fotorreceptor, este haz se interrumpe periódicamente por un disco con perforaciones, generando una señal de pulsos (unos o ceros), con el numero de pulsos podemos determinar la distancia que ha recorrido el robot. Para tomar esta señal es mejor generar interrupciones o hacerlo por polling?

Lo de polling o generar interrupciones depende del tiempo que haya entre pulso y pulso o de la frecuencia con la vengan los mismos.  Hay que hacer cálculos de "timings" de la aplicación.  Esto te determinará si tu software puede andar por polling, por interrupción o por ambos.

Como sugerencia, ten presente que los cálculos los debieras hacer en el bloque de ejecución del programa, NUNCA en el vector de interrupción.  Mantenganlo pequeño, que lea el dato, lo guarde , genere alguna bandera para el software principal y retorne de la interrupción.


Anteriormente este diseño se habia realizado en assembler y utilizaban rutinas de punto flotante para hacer las operaciones matemáticas. me gustaria saber si en C18 cuando se tiene un número declarado como float, las operaciones como suma se pueden hacer utilizando una libreria predeterminada como math o se requiere de alguna rutina especial como en el caso de assembler   

Tienen la librería float, pero veo que tienen muchas dudas, así que les sugiero vean el capítulo 5, Math Libraries, del documento MPLAB C18 Compiler Libraries.

Yo la consulto con frecuencia para ver qué librería debo incorporar y cual no, en cada uno de mis softwares.





- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything