Forum: Mikrocontroller und Digitale Elektronik Fehlermedung "implicit declaration of function" mit ASF


von Holler (Gast)


Lesenswert?

Hallo,

bin Gelegenheitsprogrammierer und hänge gerade an einem eigentlich 
trivialen Problem, finde aber nicht den Punkt.

Es geht um einen ATXMega unter AtmelStudio 6.1 mit ASF und die 
Initialisierung der ADCs.
Hatte ich soweit am Laufen, wollte dann statt auf den ADC zu warten auf 
Interrupt-Betrieb umstellen und einen Interrupt-Handler mit folgender 
Funktion einklinken:

adc_set_callback(&MY_ADC, &adc_handler);

Da bekomme ich beim Compilieren folgende Fehlermeldung:

implicit declaration of function 'adc_set_callback' 
[-Werror=implicit-function-declaration]

Eigentlich ein Hinweis auf fehlende Deklaration bzw Header-Datei nicht 
eingebunden. Der ist aber drin, einmal über die asf.h und zum anderen 
habe ich es auch explizit über #include <adc.h> versucht (da ist die 
Funktion deklariert). Ohne Erfolg.

Idee, wo es klemmen könnte?

1
#include <asf.h>
2
#include <board.h>
3
#include <user_board.h>
4
#include <adc.h>
5
6
/*
7
anderer Initialisierungs-Code
8
*/
9
10
//  ADC init Anfang
11
struct adc_config adc_conf;
12
struct adc_channel_config adcch_conf;
13
14
adc_read_configuration(&MY_ADC, &adc_conf);
15
adcch_read_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf);
16
adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_BANDGAP);
17
adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0);
18
adc_set_clock_rate(&adc_conf, 200000UL);
19
adc_set_callback(&MY_ADC, &adc_handler);  // Die Zeile wird beanstandet
20
adcch_set_input(&adcch_conf, ADCCH_POS_PIN7, ADCCH_NEG_NONE, 1);
21
adc_write_configuration(&MY_ADC, &adc_conf);
22
adcch_write_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf);
23
//  ADC init Ende
24
25
// ...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn das die Headerdatei sein soll --

Das sind keine Funktionsprototypen, da fehlt der Rückgabewert bzw. void.

von Holler (Gast)


Lesenswert?

nein, das ist der Initialisierungscode, kein Header. Auch wenn das 
struct da eigentlich nichts zu suchen hat.

von abc (Gast)


Lesenswert?

Was soll eigentlich das & in den Funktionsweise Deklarationen?
Rückgabe Typen fehlen.
Konstanten in der Deklaration? Geht das über haupt?

Was ist MY_ADC? Type oder variable?

von abc (Gast)


Lesenswert?

Dann fehlt mir irgend wo die Funktion in der das steht.

Pruef die Parameter/Typen und die Schreibweise der Funktion.

von g457 (Gast)


Lesenswert?

> Idee, wo es klemmen könnte?

Zuallererst mal am nicht compilierfähig geposteten Fake-Code :-) Zeigt 
doch mal was "echtes".

von Holler (Gast)


Lesenswert?

Bitte nochmal: das Codesegment ist keine Deklaration sondern der 
abzuarbeitende Initialisierungscode. Dabei kennzeichnet ein "&" einen 
Call-by-Reference" statt z.B. Call-by-Value.

im Header:
#define MY_ADC    ADCA
#define MY_ADC_CH ADC_CH0

im ASF:
#define ADCA    (*(ADC_t *) 0x0200)

ADC_CH0 ist ne Maske auf den Kanal 0 innerhalb des ADC.

von Bastler (Gast)


Lesenswert?

Ist adc_handler() irgendwo deklariert?
Das ist eine Callback-Routine, die DU schreiben mußt!
Andernfalls nimmt der Comipler an, sie habe die Signatur wie in der 
Deklaration von adc_set_callback angegeben und erzählt dies mit der 
gefundenen Fehlermeldung.

von g457 (Gast)


Lesenswert?

nochwas: stimmt die ∗Vermutung∗ (Code zeigst Du uns ja nicht..) dass der 
adc_handler in

> adc_set_callback(&MY_ADC, &adc_handler);  // Die Zeile wird beanstandet

ein Funktionspointer ist? Falls dem so ist dann lass den Adressoperator 
weg.

von Holler (Gast)


Lesenswert?

g457 schrieb:
> Zuallererst mal am nicht compilierfähig geposteten Fake-Code :-) Zeigt
> doch mal was "echtes".

Ist kein Fake, sondern die Initialisierung des ADC.
Funktioniert fehlerfrei ohne die Zeile "adc_set_callback(&MY_ADC, 
&adc_handler);"

Aber dann muss ich im Code warten bis der ADC fertig ist und den Wert 
anschliessend abholen und dann erst weiterverarbeiten.

Ich möchte eben mit der o.g. Zeile auf Interrupt-Betrieb umstellen.

Anbei das funktionierende Polling des ADC:
1
    ADCA.CH0.MUXCTRL = j;
2
    adc_start_conversion(&MY_ADC, MY_ADC_CH);
3
    adc_wait_for_interrupt_flag(&MY_ADC, MY_ADC_CH);
4
    result = adc_get_result(&MY_ADC, MY_ADC_CH);

von Holler (Gast)


Lesenswert?

g457 schrieb:
> nochwas: stimmt die ∗Vermutung∗ (Code zeigst Du uns ja nicht..) dass der
> adc_handler in
>
>> adc_set_callback(&MY_ADC, &adc_handler);  // Die Zeile wird beanstandet
>
> ein Funktionspointer ist? Falls dem so ist dann lass den Adressoperator
> weg.

Ja, ist im Header delkariert, aber die Implementierung ist vorerst noch 
leer:
1
 static void adc_handler(ADC_t *adc, uint8_t ch_mask, uint16_t result)
2
 { 
3
 }

von Bastler (Gast)


Lesenswert?

Und was steht in adc.h ?

von Bastler (Gast)


Lesenswert?

Ist darin adc_set_callback(  ADC_t*, void (*adc_handler)(ADC_t*, 
uint8_t, uint16_t) ) deklariert, oder steht da was anderes?

von Holler (Gast)


Lesenswert?

Bastler schrieb:
> Und was steht in adc.h ?

Das sit der Original-Header aus dem ASF.
1
void adc_set_callback(ADC_t *adc, adc_callback_t callback);

Kann man auch hier nachlesen.
http://asf.atmel.com/docs/2.9.0/xmegaa/html/adc_8h.html

Ich hoffe dass nicht eine der zahlreichen "#if !defined" da irgendwas im 
ASF-Code ausknipst.

Wäre eine Erklärung.

Wie kann man man die Präprozessor-Schalter überprüfen?

von Holler (Gast)


Lesenswert?

Danke erstmal, das Problem konzentriert sich auf die 
Präprozessor-Defines in der ASF. Habe einfach mal Nonsens-Code hinter 
die Funktion im ASF geschrieben und der Compiler meckerts nicht an ...

Danke an Baster, die scheinbar simple Frage brachte mich auf die Spur.

Was das Problem jetzt löst weiss ich noch nicht.
Das ist der Nachteil eines relativ komplexen Frameworks. Scheint erstmal 
viel zu vereinfachen, aber wenns klemmt muss man sich doch ins Detail 
eingraben.

von Holler (Gast)


Angehängte Dateien:

Lesenswert?

Hier die vollständige Lösung, falls jemand mal auf was ähnliches stößt:

Unter dem Pfad der ASF (siehe Bild) gibt es eine Reihe von conf_xyz.h 
Headern von den verwendeten Komponenten der ASF. Habe die bisher nicht 
weiter beachtet, da in den schon laufenden Komponenten USART, I²C (TWI), 
SPI, Timer- und Interrupt-System keinerlei Inhalt drin war.

Beim ADC ist das anders, da sind wichtige Defines auskommentiert ... 
siehe unten. // raus und schon geht es.
1
/**
2
 * \file
3
 *
4
 * \brief Chip-specific ADC configuration
5
 *
6
 * Copyright (c) 2010-2012 Atmel Corporation. All rights reserved.
7
 */
8
#ifndef CONF_ADC_H
9
#define CONF_ADC_H
10
11
/* Refer to the ADC driver for detailed documentation. */
12
// #define CONFIG_ADC_CALLBACK_ENABLE
13
14
// #define CONFIG_ADC_CALLBACK_TYPE uint16_t
15
16
// #define CONFIG_ADC_INTLVL        ADC_CH_INTLVL_LO_gc
17
18
#endif /* CONF_ADC_H */

von Bastler (Gast)


Lesenswert?

Deshalb stelle ich solche Fragen. Besser ein Kick in die richtige 
Richtung und man kommt dann selbst drauf, sowas nennt sich lernen ;-), 
als einfach nur "schreib das und das ...".
BTW, gewußt hab ich's auch nicht, nur hab ich geahnt wo ich suchen muß.

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.