Problem med atan2 till pic18

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Problem med atan2 till pic18

Inlägg av dubbear »

Jag håller på att skriva kod till en gps styrd båt.
Då kommer atan2() till god nytta.
jag skriver för Hi-tech C,

Kort efter att jag flyttade mitt projet från en pic16f886 till pic18f4550
Började problemen med atan2();

jag har gjort ett litet test program och problemet kvarstår.

Jag har avinstallerat Mplab och Hi-tech och ominstallerat utan förbättring.

Jag har den senaste versionen av alla programmen från microchips hemsida.

Mycket tacksam för hjälp

Test program

Kod: Markera allt

#include <math.h>
#include <stdio.h>
/*Mini program för att få gå och lägga sig =(*/
void
main (void)
{
float i, a;

i=10;
a=-10;
atan2(i, a);
}



Problem

Kod: Markera allt

Clean: Deleting intermediary and output files.
Clean: Done.
Build C:\pic\test\test for device 18F4550
Using driver C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\bin\picc18.exe

Executing: "C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\bin\picc18.exe" --pass1 C:\pic\test\temp.c -q --chip=18F4550 -P --runtime=default,+clear,+init,-keep,-download,+stackwarn,-config,+clib,+plib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --rom=default --ram=default -Blarge --double=24 --float=24 --cp=16 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
Executing: "C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\bin\picc18.exe" -otest.cof -mtest.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 temp.p1 --chip=18F4550 -P --runtime=default,+clear,+init,-keep,-download,+stackwarn,-config,+clib,+plib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --rom=default --ram=default -Blarge --double=24 --float=24 --cp=16 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
Licensed for evaluation purposes only.
This licence will expire on Thu, 24 Nov 2011.
HI-TECH C Compiler for PIC18 MCUs (PRO Mode)  V9.80
Copyright (C) 2011 Microchip Technology Inc.
Advisory[1233] Employing 18F4550 errata work-arounds:
Advisory[1234]  * Corrupted fast interrupt shadow registers
Error   [1089] C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\sources\ftmul.c; 52. recursive function call to "___ftmul"
Error   [1089] C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\sources\float.c; 63. recursive function call to "___ftpack"
Error   [1089] C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\sources\ftneg.c; 16. recursive function call to "___ftneg"
Error   [1089] C:\Program Files (x86)\HI-TECH Software\PICC-18\9.80\sources\wmul.c; 3. recursive function call to "___wmul"

********** Build failed! **********
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av blueint »

Gissar att du saknar något bibliotek (library) denna rad kanske spelar roll "-config,+clib,+plib"
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av dubbear »

Om jag läser manualen rätt så betyder -config,+clib,+plib att alla bibliotek tas med av kompilatorn.
Sedan funkade ju funktionen ett tag innan problemet uppstod.

Ska dra iväg ett mail till deras support med.
Men har hela dagen på mig att programera idag och de stör mig att sitta fast på detta "Skitproblem" :verysad: :dead:
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av dubbear »

Fick ett svar som löste problemet.

Lägger upp det här om någon råkar googla sig hit,

Kod: Markera allt

This does indeed seem to be a compiler problem, but it looks like it might only affect this function.

There could be a reentrancy issue here. A function is considered "called" as soon as its parameter area has started to be loaded. If a function, which has to be called to obtain the parameter for another call, clobbers any parameters already loaded for the other call, then data corruption has occurred, which is what the compiler is trying to detect. When an expression involves multiple calls (and remember that most floating point math operations like +, * and / become calls) then this situation can occur quite frequently. It is possible the atan2 code could be tweaked so that this is avoided. However, I tried copying the atan2.c source file (provided) into my test project and it then built okay. I am not sure why that is that case, but this might be a work-around for you.

I'll log a fault. 
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med atan2 till pic18

Inlägg av sodjan »

Och vad var lösningen ??
sneaky
Inlägg: 1621
Blev medlem: 22 juni 2009, 18:38:42

Re: Problem med atan2 till pic18

Inlägg av sneaky »

"However, I tried copying the atan2.c source file (provided) into my test project and it then built okay."
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med atan2 till pic18

Inlägg av sodjan »

Ja, jo, jag såg det är, men det säger ju inget.
Man jag var nyfiken på vad som var lösningen.
Skit samma...
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av dubbear »

Ja lösningen var som jag förstod det att Copy/paste atan2.c in i mitt program.
Jag döpte om den till atan3() och kallar på den som en funktion i programmet


Kod: Markera allt

#include	<math.h>
#include	<errno.h>

#define PI	3.14159265358979
#define HALF_PI	1.57079632679489

double
atan2(double y,double  x)
{
	double	v;

	if (x == 0) {
		if (y == 0) {
			errno = EDOM;
			return 0;
		}
		if (y > 0) {
			  return HALF_PI;
		}
		else {
			  return -HALF_PI;
		}
	}
	if (y == 0) {
		if (x > 0) {
			  return 0;
		}
		else {
			  return PI;
		}
	}
	if(fabs(x) >= fabs(y)) {
		v = atan(y/x);
		if( x < 0.0)
			if(y >= 0.0)
				v += PI;
			else
				v -= PI;
		return v;
	}
	v = -atan(x/y);
	if(y < 0.)
		v -= HALF_PI;
	else
		v += HALF_PI;
	return v;
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med atan2 till pic18

Inlägg av sodjan »

> Ja lösningen var som jag förstod det att Copy/paste atan2.c in i mitt program.

Nej, det var kanske det du *gjorde*, men det är ju inte *lösningen* ! :-)

> Jag döpte om den till atan3() och kallar på den som en funktion i programmet...

Men OK, lösningen var (som jag tolkar det) alltså att ersätta den inbyggda
atan2() med en egen variant som löser arctan på ett lite annorlunda sätt
och på så sätt kommer runt felet som uppstog.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av blueint »

Krockar din kopierade funktion med något inbyggt om du kallar den för atan2() ?

Annars.. AVR är bäst :D
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av dubbear »

Nej inte riktigt.
Han gav ju ingen lösning utan bara en work-around, Jag använder samma atan2() funktion som inte funkade förut, alltså den som jag antar länkas från Math.h
men när man kompilerar den i samma fil som resten av sitt program så fungerar det av någon anledning.
Vilket är ganska "lustigt" för de borde ju leda till samma problem, men det funkar.

"I am not sure why that is that case, but this might be a work-around for you."


blueint: Jag antar att den krockar med math.h funktionen atan2() om ja inte döper om den
Ja har hört att bara hippies som gillar att simma i flock gillar avr/arduino :p
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Problem med atan2 till pic18

Inlägg av Icecap »

"Ja har hört att bara hippies som gillar att simma i flock gillar avr/arduino"
Hört!!!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Problem med atan2 till pic18

Inlägg av sodjan »

OK. Vet du/vi att det är exakt samma atan2() funktion ?
(Vi kanske inte kommer så mycket länge än så här... :-) )
Användarvisningsbild
dubbear
Inlägg: 328
Blev medlem: 7 april 2010, 23:59:24
Ort: Göteborg
Kontakt:

Re: Problem med atan2 till pic18

Inlägg av dubbear »

Ja det kan ja nog påstå att jag vet, finns bara en atan2.c fil på min dator och måste vara den som länkas.
Nä någon lösning tror jag inte vi får förens dom släpper en uppdatering på kompilatorn.
Som tur är funkar ju den tillfälliga lösningen hur bra som helst
Skriv svar