AFEC unter XC32

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

AFEC unter XC32

Beitrag von Finger »

Moin.

Ich fummel hier mit einem SAME70 herum und versuche die von Harmony erzeugte Blibliothek für den ADC zu verstehen. Da gibt es einen Prototypen

Code: Alles auswählen

void AFEC0_CallbackRegister(AFEC_CALLBACK callback, uintptr_t context);
Dazu in der common.h folgende Deklaration:

Code: Alles auswählen

typedef void (*AFEC_CALLBACK)(uint32_t status, uintptr_t context);
// *****************************************************************************

typedef struct
{
    AFEC_CALLBACK callback_fn;
    uintptr_t context;
}AFEC_CALLBACK_OBJECT;

Was macht das jetzt? Es hängt letzendlich eine eigene Routine mit in die Inerruptroutine vom ADC. Aber ich finde nichts dazu, wie ich hier die Deklaration machen muss, damit der Compiler das frisst (Schritt 1) und ich verstehe, was diese Funktion zurückliefert (Schritt 2). Handbuch? Fehlanzeige. Beispielcode? Fehlanzeige. So sieht meine Routine aus:

Code: Alles auswählen

void APP_AFEC0Callback(unsigned int context )
{
   Tcntr++;
}
Im Main baue ich mir dann folgendes zusammen:

Code: Alles auswählen

AFEC0_CallbackRegister( APP_AFEC0Callback, (uintptr_t)NULL);
was sich nicht compilieren lässt:

Code: Alles auswählen

../src/main.c:1361:29: error: passing argument 1 of 'AFEC0_CallbackRegister' from incompatible pointer type [-Werror=incompatible-pointer-types]
     AFEC0_CallbackRegister( APP_AFEC0Callback, (uintptr_t)NULL);
                                          ^~~~~~~~~~~~~~~~~
In file included from ../src/config/default/definitions.h:52,
                 from ../src/main.c:15:
../src/config/default/peripheral/afec/plib_afec0.h:141:43: note: expected 'AFEC_CALLBACK' {aka 'void (*)(long unsigned int,  unsigned int)'} but argument is of type 'void (*)(unsigned int)'
 void AFEC0_CallbackRegister(AFEC_CALLBACK callback, uintptr_t context);
                                             ~~~~~~~~~~~~~~^~~~~~~~
Also da hörts bei mir echt auf. Was muss ich tun, damit der Eimer das frisst? Ich pack mal die Lib mit in den Anhang...
Dateianhänge
plib_afec.zip
(5.37 KiB) 12-mal heruntergeladen
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Fritzler »

Wie immer bei den (undokumentierten) Herrstellergammelibs:
Man is schneller fertig wenn mans DB nimmt unds selber coded anstatt den Murks von schlechten Erstsemester Azubis von Atmel/Microchip/ST/whatever nachzuvollziehen.

Wenn das Projekt frisch aus dem Codegen inzwischen nichtmal mehr compiled, weiah...
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

Das geht schon (der automatisch erzeugte Code lässt sich compilieren), aber die Callbackfunktion muss man selber schreiben und einhängen. Haste du ne Idee?
Silvio
Beiträge: 118
Registriert: Mi 21. Sep 2022, 03:18

Re: AFEC unter XC32

Beitrag von Silvio »

Ich glaube, deine Routine muss die gleiche Deklaration aufweisen, sprich auch gleiche Argumente, sonst ist es eine andere Funktion, die nicht kompatibel ist. Ebenso dann auch die Funktionspointer
Deine Routine braucht "uint32_t status, uintptr_t context" als Argumente.
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

Magst du mir das mal aufschreiben? Ich blick das nämlich grad überhaupt nicht mehr....
Silvio
Beiträge: 118
Registriert: Mi 21. Sep 2022, 03:18

Re: AFEC unter XC32

Beitrag von Silvio »

Code: Alles auswählen

void APP_AFEC0Callback(uint32_t var1, uintptr_t var2 )
{
   Tcntr++;
}
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

Danke. Das macht dann

Code: Alles auswählen

c:\program files\microchip\xc32\v3.00\bin\bin\..\..\lib\gcc\pic32c\8.3.1\..\..\..\..\bin\bin/pic32c-ld.exe: build/default/production/_ext/1360937237/main.o: in function `LocalInit':

C:\Projekte\Steuerplatine\ARM-Controller\firmware\SAME70N21.X/../src/main.c:1367: undefined reference to `AFEC0_CallbackRegister'
womit ich auch nichts anfangen kann.....
Silvio
Beiträge: 118
Registriert: Mi 21. Sep 2022, 03:18

Re: AFEC unter XC32

Beitrag von Silvio »

AFEC0_CallbackRegister ist nicht definiert, nur deklariert. Der Linker findet die Implementierung nicht. Ist die Funktion irgendwo?
Das ist ein ganz anderer Fehler. Du bist schon beim Linken, das heißt, syntaktisch ist alles in Ordnung
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

Hmmm.... OK. Ich geh mal suchen. OK, es gibt keine Funktion in der Bibliothek, nur die Deklaration im Header. Kopf->Tisch *dumpferAufschlag*
Silvio
Beiträge: 118
Registriert: Mi 21. Sep 2022, 03:18

Re: AFEC unter XC32

Beitrag von Silvio »

mit

Code: Alles auswählen

AFEC0_CallbackRegister( APP_AFEC0Callback, (uintptr_t)NULL)
{
}
wird es schon mal kompilieren.
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

Ich gehe jetzt erstmal schauen, warum diese Funktion

Code: Alles auswählen

void AFEC0_CallbackRegister(AFEC_CALLBACK callback, uintptr_t context);
in der Lib nicht erzeugt wurde.
Silvio
Beiträge: 118
Registriert: Mi 21. Sep 2022, 03:18

Re: AFEC unter XC32

Beitrag von Silvio »

Hast du eine Bibliothek dazu? Manchmal muss man im Makefile dem Linker das mitteilen.
Naja, wie dem auch sei, du bist ja fast durch.
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

Ich hab Harmony nochmal Code generieren lassen und mir den Merge angeschaut. Nun hat sich das Ding entschlossen, den Codeteil auch zu erzeugen -> Lässt sich jetzt compilieren.
Danke fürs Anschubsen schonmal. Ich hab bestimmt noch mehr Fragen :D
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

So, die Callbackfunktion wird angesprungen, das geht soweit. Allerdings mit 2.4MHz, das ist n büschn viel. Die Abtastrate muss deutlich runter, aber das wiederrum lässt sich in Harmony nicht einstellen. Ist das ne Eigenart des Controllers oder der Software?
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Fritzler »

Dazu musst du ins DB gucken ob der ADC nen Vorteiler zum Bus hat oder vllt pro Kanal die Samplingzeit einstellbar ist.
Benutzeravatar
Finger
Administrator
Beiträge: 7392
Registriert: Di 12. Jun 2012, 20:16
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Finger »

So wie ich das sehe nicht. Aber der sollte zumindest Single-Shot können, also wandlung anstoßen und irgendwann Ergebnis abholen. Nur.... das tuts irgendwie nicht. Einmal gestartet läuft der Wandler permanent. Himmel!
Ich hab in der ISR vom ADC einen Zähler laufen, im Debugger sehe ich den rauflaufen sobald ich den Wandler das erste mal angestoßen habe....
Ich habe das Gefühl, das ich das Ding komplett falsch verstehe.

@Fritzler: kann ich dir mal n Schnipsel Code schicken?
Benutzeravatar
Fritzler
Beiträge: 12579
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: AFEC unter XC32

Beitrag von Fritzler »

Finger hat geschrieben: Fr 14. Okt 2022, 09:31 @Fritzler: kann ich dir mal n Schnipsel Code schicken?
Wenn er ohne Herstellerlibseuche kommt =P
Sonst versucht man die Lib zu verstehen, zu debuggen und den Fehler kann man eh nich fixen, weil dann was anderes kaputt geht oder beim nächsten Code erzeugen überschrieben wird.

Aber könnts einfach sein, dass der IRQ dauerfeuert, weil ein "ja ich habs gelesen" Bit nich in nem Reg geflippt wird?
Man kann ja gucken ob sich der digitalisiert Wert nie ändert.
Bzw laut DB muss man AFEC_LCDR lesen mit DRDY zurückgeht NICHT eiens der beiden anderen DataRegister.
Beim EOCx IRQ muss man das passende Datenregister (AFEC_CDRx) selber finden zum auslesen mit wieder Ruhe is.

Zudem gibts im AFEC_MR ein Freerun Bit, wenn das gesetzt ist läuft der wohl für immer.
Antworten