SPI - A/D Wandler AD7124 Kommunikation

Ich habe leider keine Idee mehr woran es liegen könnte.

Mit der Funktion
void AD7124_readOutAll(ad7124_t *AD_ptr);
liest du zurück und testest du?! Die kennen wir nicht.

Diese könntest du mal mitteilen, vielleicht sieht man da was.
 
Da weise ich meinen Variablen einfach nur den Wert von den Registern des AD7124 zu.



CodeBox C
void AD7124_readOutAll(ad7124_t *AD_ptr)

{
AD_ptr->Status = AD7124_read_uint8 (AD7124_STATUS_REG);
AD_ptr->Adc_Ctrl = AD7124_read_uint8 (AD7124_ADC_CTRL_REG);
AD_ptr->Data = AD7124_read_uint24(AD7124_DATA_REG);
AD_ptr->IO_Ctrl1 = AD7124_read_uint24(AD7124_IO_CTRL1_REG);
AD_ptr->IO_Ctrl2 = AD7124_read_uint16(AD7124_IO_CTRL2_REG);
AD_ptr->ID = AD7124_read_uint8 (AD7124_ID_REG);
AD_ptr->Error = AD7124_read_uint24(AD7124_Error);
AD_ptr->Error_En = AD7124_read_uint24(AD7124_Error_En);
AD_ptr->Mclk_Count = AD7124_read_uint8 (AD7124_Mclk_Count);

}


Sollte nicht eigentlich -->



CodeBox C
static inline void SBIT ([I]uint32_t[/I] *x, [I]uint8_t[/I] bitNum)

{
(*x) |= (1UL << bitNum);
} 

SBIT(&x,0);
SBIT(&x,1);

0b00000000 00000000 00000000 00000000 00000011

ergeben?
 
Wenn ich deine Methode mit der Led verwende, klappt es nicht :/



CodeBox C
if (x == (1UL<<31) && (1UL<<30))
PORTR.OUT &= ~(1<<1); // ist in Ordnung

else

PORTR.OUT |= (1<<1); // da stimmt was nicht


Mit dieser Methode klappt es nicht...

Schreibe ich es jedoch in Binärer Form, haut es hin?!
 
Mach da mal im rechten Bereich zusätzlich Klammern und due wirst das sicherlich "verodern" wollen


CodeBox C
if (x == ((1UL<<31) | (1UL<<30)))
 
Ich habe beide Bits gesetzt. Damit müsste ein & in Frage kommen.
Dies klappt so jedoch nicht.
 
Wieso? Das verUNDen oder was?
 
Wieso? Das verUNDen oder was?

Ja und ggf. die fehlende Klammerung. Der Compiler warnt hier eventuell sogar.

Verwende doch einfach mal diese Zeile:



CodeBox C
if (x == ((1UL<<31) | (1UL<<30)))


Wenn (nur) Bit 30 und 31 gesetzt sind, dann ist der Ausdruck wahr.
 
Das Funktioniert.
Wieso verODERn? Ich möchte doch wissen ob Bit 30 und 31 gesetzt sind und nicht 30 oder 31...?
 
0b00000001 | 0b00000010 = 0b00000011

if (u == (0b00000001 | 0b00000010))

entspricht

if (u == (0b00000011))
 
Danke. Funzt!
 
Zuletzt bearbeitet:
guten morgen,

wieso wird, wenn ich ->


CodeBox C
AD.Data *= (float)(2.5 / 16777215);
[I]sprintf[/I](Buffer,"A/D Wert -> %.02f",(double)AD.Data);
LCD_SendString(Buffer,0,0);


Ein "?" ausgeworfen?
 
Wahrscheinlich verwendest du die Lib Funktion ohne float Unterstützung.

For floating-point conversions, if you link default or minimized version of vfprintf(), the symbol ? will be output and double argument will be skiped.
...
If the full functionality including the floating point conversions is required, the following options should be used:
Verwende mal diese Linkeroptionen:
Code:
-Wl,-u,vfprintf -lprintf_flt -lm

Siehe auch:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html
 
Sorry, damit habe ich wirklich noch nie was gemacht.
Wo muss ich das genau einfügen?
 
Im AS im Solution Explorer mit der Maus auf das Projekt, rechte Taste. Im PopupMenü Properties (Eigenschaften).
Danach bei den Properties zu Toolchain->AVR/GNU Linker->Miscellaneous.
Bei Other linker flags diese eintragen und kompilieren.
 
Das hat geklappt.

Wieso hat er der Chip nur 8 Offset Register wenn ich bis 16 Kanäle habe?
 
Schau mal ins Datenblatt ab Seite 42.

Du hast 16 Channel Register, in denen Du die zu verwendenden Eingänge definierst, und ob sie single ended oder differential sein sollen. Dann kann jeder Kanal einen eigenen Eingang haben, Du kannst einen Eingang aber auch auf mehrere Kanäle legen - insbesondere auch mit unterschiedlichen differentiellen "Partnern".

Außerdem besitzt Du acht verschiedene Setup-Register (welche aus je einem Configuration-, Filter-, Gain- und Offset-Registern bestehen), Du kannst also acht unterschiedliche(!) Setups gleichzeitig definieren.

Jedem der 16 Channel-Register ist eines der acht Setups zugewiesen (Bit14..12).

Wenn Du also alle sechzehn Kanäle nutzt, kannst Du trotzdem nur acht unterschiedliche Setups dahinterschalten.
 
Okay,
Die Grafik hat mich schon mal einen Schritt weiter gebracht.
Wenn ich aber 16 Kanäle habe, wieso dann nur 8 Offset Register? Diese sind dann nur für die ersten Kanäle gedacht? 0-7?
Diese wurden ja angeblich "FactoryCalibrated"...
 
Nein, Du kannst auch allen sechzehn Channels dasselbe Setup fahren lassen.

Der Chip besitzt einen(!) Eingangsmultiplexer, wahrscheinlich einen(!) Differenzverstärker mit einstellbarem Gain Amplifier, und eben den Filter im Pfad. Und eben einen(!) ADC.
Außerdem hast Du 'n "Sequenzer" drinn, der nacheinander die sechzehn Kanäle durcharbeitet, und eben auch für jeden Kanal das dort festgelegte Setup aktiviert. Nicht aktivierte Channels werden vom Sequenzer übersprungen (skip), wenn ich das richtig verstanden habe - je weniger Channels verwendet werden, desto höher müßte also die Samplefrequenz der einzelnen verwendeten Channels sein können (Spekulation).

(Du kannst auch in allen Channels denselben Eingang messen lassen, mit demselben "Setup" - macht zwar keinen Sinn, aber...
oder in acht Channels denselben Eingang, aber je mit einem anderen Setup (macht u.U. Sinn)...)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)