Forum: Mikrocontroller und Digitale Elektronik AD5933 Probleme mit Datentypen.


von Peter (Gast)


Lesenswert?

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

von Karl M. (Gast)


Lesenswert?

Hallo,

Leider hast du den Datentyp double nicht beim avr-gcc der ist nur single 
oder float, sprich 32bit insgesamt.

von Motlib (Gast)


Lesenswert?

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);

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.