Forum: Compiler & IDEs POW funktioniert nicht


von Benno Müller (Gast)


Lesenswert?

Salve!

Aus einem mir unerfindlichen Grund kennt er bei meinem Programm die 
Funktion POW() nicht. MATH.H habe ich included, trotzdem bekomme ich vom 
GCC folgende Fehlermeldung: undefined reference to 'pow'

Was mache ich falsch??

<schnipp>
#include <IO.H>
#include <IO2313.H>
#include <MATH.H>

char zeichen_einlesen(void);

int main(void)
{
  while (1)
  {
    if(strcmp(zeichen_einlesen(), '$') == 0)
    {
    }
  }
}

char zeichen_einlesen(void)
{
  char ch = 0;
  double i;
  double wertigkeit;

  for(i = 0; i < 8; i++)
  {
    if(bit_is_set(PORTD, PIND5))
    {
      wertigkeit = pow(2, i);
      ch += wertigkeit;
    }
    //delay ...
  }
  return ch;
}
<schnapp>

von Benno Müller (Gast)


Lesenswert?

Hat sich erledigt:

Lag an einem kleinem Parameter im makefile:

#linker flags
LDFLAGS = -Wl,-Map=$(TRG).map,--cref -lm

Habe das -lm hinzugefügt und dann gings. bin irgendwo im AVRfreaks Forum 
darauf gestoßen. Also falls wer ähnliche Probleme mit <MATH.H> hat ... 
;-)

Jetzt würde mich aber noch interessieren wie ich den DELAY realisieren 
könnte. Ich lese an PORTD, PIN5 seriell Zeichen ein, sprich Bit für Bit. 
Habe ich ein Bit muss eine gewisse Wartezeit rein bis das nächste Bit am 
Pin anliegt. Aber wie lange muss diese sein?

Ich verwende einen ATMEL AT90S2313, 4Mhz.

von Benno Müller (Gast)


Lesenswert?

Muss mich korrigieren:

Die Baudrate beträgt 9600 bps bei 8Mhz, nicht 4Mhz!

von Reiner (Gast)


Lesenswert?

Hi,
danke für die info mit der math.h. Und ich glaub ich kann dir auch 
helfen.
Bei einem PIC hatte ich mal in Assembler eine serielle Infrarot 
programmiert und die läuft jetzt seit mehr als drei Jahren tag für Tag 
fehlerfrei.

Also wenn die Baudrate 9600 beträgt puzeln die Bits mit 9600Hz ein. D.H. 
pro Bit vergeht eine Zeit von rund 1/9600Hz = 104.2us. Wenn Du auf das 
Datentelegramm richtig reagieren willst, empfielt es sich auf den Start 
des Telegramms, das Startbit zu warten. Tritt es auf, testest Du ob es 
nach der halben Bit Zeit ca. 52us noch ansteht. Ist das nicht der Fall 
kannst Du es als Störung (spike) verwerfen. Ist das aber Startbit ok, 
wartest Du jetzt eine Bitlänge 104us und triffst damit genau in die 
Mitte des ersten Datenbits. Alle weiteren Bits werden auch in der Mitte 
ihrer Gültigkeit erfasst. Der Vorteil die Bits in der Mitte zu erfassen, 
liegt in der Sicherheit. Zwei asynchrone Systeme können nie genau die 
gleiche Frequenz haben, was ein Auseinanderlaufen der Erfassung zur 
Folge hat. Legt man die Mitte fest, kann bis zum Ende der Telegramms 
zumindest ein Fehler von einer halben Bitlänge toleriert werden. Bei 10 
Bits (1xStartbit 8xDaten 1xStop) kann dann bei 9600 immerhin knapp 0.5% 
Fehler geduldet werden.
Ich hoffe es war das was Du wissen wolltest.
Reiner

von Benno Müller (Gast)


Lesenswert?

Danke für die sehr verständliche Erklärung!

Die einzigen Bedenken habe ich eigentlich nur noch wegen der Zykluszeit 
der Befehle. In Assembler hätte ich diese mir ja besorgen können, aber 
inwiefern muss ich diese in C berücksichtigen?

von Reiner (Gast)


Lesenswert?

hi,
erstmal muß ich mich korrigieren es sind nicht 0.5%, sondern 5% in der 
Toleranz.

Ich denke Du brauchst Dir auch in C keine Sorgen zu machen da der AVR 
mit 8MHz oder 125ns pro Befehl zuschlägt. Also 416 Befehle in 52us! 
selbst wenn da mal ein Interrupt Bearbeitungszeit verbraucht, wird es 
wohl keine Störung hervorrufen. Ansonsten kannst Du ja auch die Bitmitte 
mit einem zyklischen Timerinterrupt erfassen, dann kannst Du Dir sicher 
sein (Beim PIC so realisiert).
Reiner

von Benno Müller (Gast)


Lesenswert?

Naja am besten ich teste das mal.

Danke nochmal für die Antwort. Bringt mich mit meinem Projekt gut 
weiter!

von Michael Kauffmann (Gast)


Lesenswert?

Hi,

habe das Problem mit pow() und math.h ebenfalls. Allerdings arbeite ich 
mit dem MSP430 C-Compiler (war beim Eval-Kit dabei).
Habe dazu leider keine Erklärung gefunden. Irgendwelche Anregungen?

Danke

von Joerg Wunsch (Gast)


Lesenswert?

Nun, daß man für die math-Funktionen -lm braucht, steht auch
in der FAQ.

Einige delay-Funktionen befinden sich mittlerweile in
<avr/delay.h>.  Die Zyklenzahl muß man sich aber noch selbst
ausrechnen (d. h., den Compiler rechnen lassen).

Ansonsten bitte keine klemmenden CAPS LOCK Tasten: der Header
heißt <math.h>, nicht <MATH.H>.  Auf Dateisystemen, die zwischen
Groß- und Kleinschreibung unterscheiden, erlebst Du sonst
irgendwann Dein blaues Wunder.  Ebenso heißt die Funktion pow(),
nicht POW() -- C unterscheidet ja grundsätzlich zwischen Groß-
und Kleinschreibung.

Der MSP430 gcc unterstützt (nach der letzten Aussage, die ich
von seinem Autor mal gelesen habe) derzeit noch gar keine
math-Bibliothek.

von Michael Kauffmann (Gast)


Lesenswert?

Das man -lm benoetigt habe ich auch gelesen, allerdings finde ich kein 
makefile, da ich nur auf Icons klicken muß (in der IAR Workbench).
Solche Dinge wie Gorß/Kleinschreibung habe ich beachtet.

Wie bereits erwähnt: ich nutzte nicht den MSP gcc, da ich unter Win2k 
damit Probleme habe (bei der In-Circuit-Simulation). Nutzen tue ich den 
mitgelieferten C-COmpiler im MSP-FET430P120 Eval-Kit (IAR Workbench), 
der leider eine 400Zeilen Codebeschraenkung hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.