Forum: Mikrocontroller und Digitale Elektronik delay() beim X16 compiler gibts nicht.


von quartett (Gast)


Lesenswert?

Hallo Liebes Forum,

Ich hänge gerade an etwas sehr dummes.. Benutzt wird MPLAB X IDE 4.15 
und der x16 Compiler mit einem dsPIC33.

Folgendes:

Ich möchte gerne __delay_ms(2); benutzen, habe dazu xc.h und auch die 
libpic30.h included, aber trotzdem meckert er immer mit "undefined 
reference to __delay_ms()"

Ich habe einige Threads dazu gefunden, jedoch keine mit einer Lösung die 
bei mir funktioniert.
delays.h gibt es zbsp bei mir gar nicht. :(

Wer kann mir bei diesem eigentlich einfachen Problem helfen ?

Danke

von quartett (Gast)


Lesenswert?

Habe natürlich auch :
#define __XTAL_FREQ 48000000 vor dem Include.

von mr. mo (Gast)


Lesenswert?

Ich war dem auch mal auf der Spur. Habe gerade meinen Arbeitslaptop 
nicht zur Hand, aber irgendwo in den .h war ein #ifdef welches die 
Prototypen zu den delays hatte.

Man musste vorher noch FCY definieren, dann ging es. Hier einen 
Ausschnitt eines Codes von mir (Aus einem Backup, ...):
1
// dsPIC clock
2
#define FOSC    (117964800ULL)
3
#define FCY     (FOSC/4)                                  
4
5
// Libs
6
#include <xc.h>
7
#include <libpic30.h>

Ich hoffe, dass ich nichts vergessen habe.

von Dr. Sommer (Gast)


Lesenswert?

quartett schrieb:
> Ich möchte gerne __delay_ms(2); benutzen, habe dazu xc.h und auch die
> libpic30.h included, aber trotzdem meckert er immer mit "undefined
> reference to __delay_ms()"

Undefined reference ist eine Meldung des Linkers. Der Compiler hat den 
Header und den Prototypen sehr wohl gefunden. Du musst dem Linker die 
richtigen Optionen/Bibliotheken übergeben.

von quartett (Gast)


Lesenswert?

mr. mo schrieb:
> Man musste vorher noch FCY definieren, dann ging es. Hier einen
> Ausschnitt eines Codes von mir (Aus einem Backup, ...):

Oh WOW!! JETZT compiliert er ohne Fehlermeldung. Vielen dank.
Aber warum wird FOSC/4 ? Und was bedeutet bei dir ULL ? Ich habe einfach 
#define FOSC (48000000)
#define (FOSC/4) geschrieben.

Nur warum steht das nirgends schön sauber erklärt ? Kann es sein dass 
der dsPIC einfach ne komplett andere Welt hat als die Klassischen pics ?

Gruß

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

quartett schrieb:
> Nur warum steht das nirgends schön sauber erklärt ? Kann es sein dass
> der dsPIC einfach ne komplett andere Welt hat als die Klassischen pics ?

vielleicht lernst du zuerst mal LESEN im xc help und hier nicht immer 
zuerst rumlabern!

"... klassischer pic" - was soll/darf es den sein?! pic10/12/16/18/24/33

da steht ...

void __delay_ms(unsigned int time);

Remarks:
This function is implemented as a macro.
Default Behavior:
This function relies on a user-supplied definition of
FCY to represent the instruction clock frequency. FCY must be defined 
before header file, libpic30.h, is included. The specified delay is 
converted to the equivalent number of instruction cycles and passed to 
__delay32(). If FCY is not defined, then __delay_ms() is declared 
external, ­causing the link to fail unless the user provides a function 
with that name.


mt

: Bearbeitet durch User
von quartett (Gast)


Lesenswert?

Danke. Jedoch steht das bei mir NICHT drin.
In der xc.h stehen die ganzen if defined welcher controller included 
wird. In der Datei gibt es bei mir kein __delay_ms(). Und in der 
libpic30.h steht der Text den du mir gepostet hast NICHT drin, da steht 
überhaupt kein Text! ;)

von Apollo M. (Firma: @home) (majortom)


Lesenswert?

quartett schrieb:
> Und in der
> libpic30.h steht der Text den du mir gepostet hast NICHT drin, da steht
> überhaupt kein Text! ;)

... das tut schon weh, seit wann stehen help info's im header file?!

schau mal unter mplabx im xc16 help oder ruf es sepparat auf.


mt

von Dr. Sommer (Gast)


Lesenswert?

Apollo M. schrieb:
> ... das tut schon weh, seit wann stehen help info's im header file?!

Schon lange. Jeweils über der betreffenden Funktion. Mit Tools wie 
Doxygen kann man da dann eine Referenz draus machen. Bei den 
Bibliotheken für die STM32 z.B. ist das so, aber in den Source statt 
Header Files.

von Klaus (Gast)


Lesenswert?

mr. mo schrieb:
> #define FOSC    (117964800ULL)
> #define FCY     (FOSC/4)

Wobei man beachten sollte, daß die PIC24 die Oszillatorfrequenz nur 
durch 2 teilen und nicht durch 4, wie die PIC16. Das kann man aber 
leicht testen, indem man mit __delay_ms() ein Rechteck ausgibt und mit 
Scope oder LA misst.

Dr. Sommer schrieb:
> Mit Tools wie
> Doxygen kann man da dann eine Referenz draus machen.

Um das User Manual zu lesen, muß man Doxygen noch nicht mal kennen. Man 
braucht aber einen PDF Reader.

MfG Klaus

von quartett (Gast)


Lesenswert?

Apollo M. schrieb:
> quartett schrieb:
>> Und in der
>> libpic30.h steht der Text den du mir gepostet hast NICHT drin, da steht
>> überhaupt kein Text! ;)
>
> ... das tut schon weh, seit wann stehen help info's im header file?!
>
> schau mal unter mplabx im xc16 help oder ruf es sepparat auf.
>
> mt


Naja habe halt einfach auf Ctrl Taste und auf die Funktion gedrückt um 
an die entsprechende Stelle in der lib File zu kommen :) Aber danke, 
dann weiß ich das jetzt auch!

Klaus schrieb:
> mr. mo schrieb:
>> #define FOSC    (117964800ULL)
>> #define FCY     (FOSC/4)
>
> Wobei man beachten sollte, daß die PIC24 die Oszillatorfrequenz nur
> durch 2 teilen und nicht durch 4, wie die PIC16. Das kann man aber
> leicht testen, indem man mit __delay_ms() ein Rechteck ausgibt und mit
> Scope oder LA misst.


Wo finde ich das raus? Dazu muss doch irgendwo was stehen was der 
dsPIC33 kann ? Und kann ich nicht sofort für die instruction clock 
frequency meine Taktfrequenz angeben ?

Gruß

von John Doe (Gast)


Lesenswert?

quartett schrieb:
> Wo finde ich das raus? Dazu muss doch irgendwo was stehen was der
> dsPIC33 kann ? Und kann ich nicht sofort für die instruction clock
> frequency meine Taktfrequenz angeben ?


Das ist doch jetzt nicht Dein Ernst, dass wir Dir hier das Lesen des 
dsPIC33E/PIC24E Family Reference Manual nahelegen sollen, oder???

von quartett (Gast)


Lesenswert?

Ok, laut dem Oscillator System Block Diagram, kann nur durch 2 geteilt 
werden.

von Andreas Müller (Gast)


Lesenswert?

quartett schrieb:
> Ok, laut dem Oscillator System Block Diagram, kann nur durch 2 geteilt
> werden.


Steht auch explizit im Text. Überflieg das Manual mal wenigstens.

von Klaus (Gast)


Lesenswert?

quartett schrieb:
> Ok, laut dem Oscillator System Block Diagram, kann nur durch 2 geteilt
> werden.

Das hat aber nichts damit zu tun, in welchem Verhältnis der Systemtakt 
und der Befehlsstakt zueinander stehen. Beim klassischen 8051 sinds 12, 
bei den AVR sinds IMHO 2, bei den PIC16 4 und bei den PIC24 2. Das ist 
aber nicht wirklich geheim, das steht im Datenblatt. Für das 
__delay_ms() braucht man den Befehlstakt.

MfG Klaus

von John Doe (Gast)


Lesenswert?

Klaus schrieb:
> quartett schrieb:
>> Ok, laut dem Oscillator System Block Diagram, kann nur durch 2 geteilt
>> werden.
>
> Das hat aber nichts damit zu tun, in welchem Verhältnis der Systemtakt
> und der Befehlsstakt zueinander stehen. Beim klassischen 8051 sinds 12,
> bei den AVR sinds IMHO 2, bei den PIC16 4 und bei den PIC24 2. Das ist
> aber nicht wirklich geheim, das steht im Datenblatt. Für das
> __delay_ms() braucht man den Befehlstakt.
>
> MfG Klaus


Aus http://ww1.microchip.com/downloads/en/DeviceDoc/70580C.pdf :

"The system clock source is divided by two to produce the internal 
instruction cycle clock. In this document, the  instruction  cycle 
clock  is  denoted  by  FCY."

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.