AD5933 Probleme mit Datentypen.

Gast #5731713
Moin,

ich versuche zur Zeit dem AD5933 ein paar sinnige Messungen zu 
entlocken.
Die Kommunikation an sich funktioniert via I²C.

An der Weiterverarbeitung der Daten scheitert es im Moment.
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#include <avr/pgmspace.h>
4
#include <stdlib.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
#include <stdint.h>
8
#include <math.h>
9
#include "uart.h"
10
#include "funktionen.h"
11
#include "i2cmaster.h"
12

13
int16_t   realData = 0;
14
int16_t   imagData = 0;
15
int64_t   realData2 = 0;
16
int64_t   imagData2 = 0;
17
double    magnitude =0;
18

19
//aus main
20
   while(1){
21
      if (TASTER0_Pressed){
22
         AD5933_GetValues();   //neue Daten für realData & imagData 
23

24
         {char Buffer[20]; itoa(realData, Buffer, 10); uart_puts(Buffer);}
25
         uart_puts_P(" / ");
26
         {char Buffer[20]; itoa(imagData, Buffer, 10); uart_puts(Buffer);}
27
         uart_puts_P("\n");
28

29
         realData2 = realData*realData;
30
         imagData2 = imagData*imagData;
31
         {char Buffer[20]; ltoa(realData2, Buffer, 10); uart_puts(Buffer);}
32
         uart_puts_P(" / ");
33
         {char Buffer[20]; ltoa(imagData2, Buffer, 10); uart_puts(Buffer);}
34
         uart_puts_P("\n");
35

36
         uart_puts_P("magnitude: ");
37
         magnitude = sqrt((realData2)+(imagData2));
38
         {char Buffer[30]; dtostrf(magnitude, 20, 4, Buffer); uart_puts(Buffer);}
39
         uart_puts_P("\n\n");
40

41
         _delay_ms(20);
42
   }

Die Daten aus "AD5933_GetValues()" sind offensichtlich korrekt.
Ich habe eine Excel Tabelle mit der ich alle nachfolgenden Berechnungen 
korrekt durchführen konnte.
Nur diese Rechnungen auf dem 8Biter zu realisiern ist mein Problem 
inklusive der richtigen Datentypen.

Es wäre super wenn mir jemand den Wink mit dem Zaunpfahl geben könnte.
Ich nutze im Moment AVR Studio 4.18 mit WinAVR-20100110

Werte für realData & imagData können sollten bis +-20000 verarbeitet 
werden.

Die Ausgabe im Terminal sieht bei dem code von oben so aus:
1
-56 / -71<\n>
2
3136 / 5041<\n>
3
magnitude:              90.4268<\n>
4
<\n>
5
24 / 12<\n>
6
576 / 144<\n>
7
magnitude:              26.8328<\n>
8
<\n>
9
4289 / -4690<\n>
10
-20095 / -23996<\n>
11
magnitude:                  NAN
Gast
Bei der Multiplikation hier rechnest Du mit 16 bit Werten, bevor das 
Ergebnis in einen int64_t geschrieben wird. Daher kommt es in deinem 
letzten Beispiel zum Überlauf an dieser Stelle:
1
realData2 = realData*realData;
2
imagData2 = imagData*imagData

Du must vor der Multiplikation die Operanden auf 64 bit casten (genau 
genommen mindestens einen der beiden):
1
realData2 = ((int64_t)realData) * ((int64_t)realData);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.