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?
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?
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.
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.
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.
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:
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:
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?
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.
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. */
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ß.