TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: moneditas 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
-
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.
-
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)
-
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 (http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf)
Llamando funciones en ensamblador desde el C. Sección 3.2.5.2
MPLAB C18 User Guide (http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_C18_Users_Guide_51288j.pdf)
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.
-
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 :-)
-
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
-
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 :-)
-
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.