avr-gcc->Probleme beim 1.kopieren von struct und 2. Arrays mit Double

OP #880609
Lesenswert?

Hallo,

habe folgende Probleme:

1.
Der Zuweisung-Operator "=" bei Strukturen funktioniert nicht.
Bsp.:
struct_x tmp_struct_x;
struct_x array_y[0] = tmp_struct_x;

Der Inhalt von array_y[0] ist 0.
Falls ich die einzelnen Elemente zuweise (array_y[0].a = 
tmp_struct_x.a), funktioniert das Ganze bzw. falls ich alternativ mit 
Zeigern arbeite.
Sollte der Zuweisungsoperator für Struct Variablen grundsätzlich nicht 
verwendet werden? (Bei AT91 funktioniert das Ganze perfekt!)

2.
Beim folgenden Double Array:

double x_Array[15] = {0, 0.05, 0.11, 0.17, 0.23, 0.36, 0.43, ...

wird bei lesen bis Index 5 (0.36) eine 0 gelesen ab Index 6 (0.43) der 
entsprechende Wert. Was kann die Ursache sein?

Umgebung:
Linux.
Ziel:
atmega168p
Avr-gcc:
4.1.2.
Einstellungen:
Alle Optimierungen.

Gruß
Gast #880634
Lesenswert?

Solche Effekte deuten eigentlich eher darauf hin, daß du dir irgendwo 
anders den Speicher kaputtschreibst.

Die Zuweisungen zwischen den structs ist selbstverständlich erlaubt 
(wenn das array auch richtig angelegt wurde), und die 
Array-Initialisierungen mit floats auch.

Oliver
OP #880695
Lesenswert?

Hallo,

die Vermutung mit dem Speicher hatte ich auch.
Das 2 Problem hat sich sogar noch verschärft. An die ersten 5 Elemente 
kann ich schreiben was ich will, Ist immer 0.

Der Code:

//Problem 1

#include <util/delay.h>

#include "ad7718.h"
#include "cs_mpx.h"
#include "io_sub.h"
#include "spi_uart_master.h"

adchannles_typ adchannels[16];

void ad_init()
{
  adchannles_typ ain1 = {FILTER_50HZ, ADCCON_RANGE2560, 
ADCCON_UNIPOLAR};
  adchannles_typ ain3 = {FILTER_50HZ, ADCCON_RANGE2560, 
ADCCON_UNIPOLAR};
  adchannles_typ ain4 = {FILTER_50HZ, ADCCON_RANGE2560, 
ADCCON_UNIPOLAR};
  adchannles_typ ain5_6 = {FILTER_50HZ, ADCCON_RANGE20, 
ADCCON_UNIPOLAR};
  adchannles_typ ain7_8 = {FILTER_50HZ, ADCCON_RANGE20, 
ADCCON_UNIPOLAR};
  adchannles_typ ain9 = {FILTER_MAX_UPDATE, ADCCON_RANGE2560, 
ADCCON_UNIPOLAR};
  adchannles_typ ain10 = {FILTER_50HZ, ADCCON_RANGE640, 
ADCCON_UNIPOLAR};
-> Fehler. Kopieren funktioniert nicht.
  adchannels[0] = ain1;
  adchannels[2] = ain3;
  adchannels[3] = ain4;
  adchannels[10] = ain5_6;
  adchannels[11] = ain7_8;
  adchannels[14] = ain9;
  adchannels[15] = ain10;

}

uint32_t read_AD_channel(uint8_t channel)
{
  uint32_t data_reg = 0;
  int i;

  cs_activate(CS_AD);

  unsigned char channelMask = channel;

    channelMask &= 0x0F;
    channelMask <<= 4;

  //open write to filter register
  spi_master_write(COMM_WR | COMM_FILTER);
  //set filter
-> Fehler (index ist ok)
  spi_master_write(adchannels[channel].filter);


//Problem 2
#include "convADData.h"

double f_thermo_r[130]
= {
0,
5,
0.11,
0.17,
0.23,
0.3,
0.36, <- Bis einschließ Element 6 ist Wert immer 0, auch falls ich mit 
Integer arbeite
0.43,
0.5,
0.57,
0.65,
0.72,
0.8,
0.88,
0.96,
1.04,
1.12,
1.21,
1.29,
1.38,
1.47,
1.56,
1.65,
1.74,
1.83,
1.92,
2.02,
2.11,
2.21,
2.3,
2.4,
2.5,
2.6,
2.7,
2.8,
2.9,
3,
3.1,
3.2,
3.3,
3.41,
3.51,
3.62,
3.72,
3.83,
3.93,
4.04,
4.15,
4.26,
4.36,
4.47,
4.58,
4.69,
4.8,
4.91,
5.02,
5.13,
5.25,
5.36,
5.47,
5.58,
5.7,
5.81,
5.93,
6.04,
6.16,
6.27,
6.39,
6.51,
6.63,
6.74,
6.86,
6.98,
7.1,
7.22,
7.34,
7.46,
7.58,
7.71,
7.83,
7.95,
8.07,
8.2,
8.32,
8.45,
8.57,
8.7,
8.82,
8.95,
9.08,
9.21,
9.33,
9.46,
9.59,
9.72,
9.85,
9.98,
10.11,
10.24,
10.37,
10.51,
10.64,
10.77,
10.91,
11.04,
11.17,
11.31,
11.44,
11.58,
11.71,
11.85,
11.99,
12.12,
12.26,
12.4,
12.54,
12.67,
12.81,
12.95,
13.09,
13.23,
13.37,
13.51,
13.65,
13.79,
13.93,
14.07,
14.21,
14.35,
14.49
};



double calcTemp(double val)
{
  double y=-1.0;
  int i;
  for (i=0;i<129;i++)
  {
  if ( (val>=f_thermo_r[i]) && (val<f_thermo_r[i+1]) )
  {
    y = i*10.0 + 
10.0*(val-f_thermo_r[i])/(f_thermo_r[i+1]-f_thermo_r[i]);
  }
  }
  return y;
}
Gast #880743
Lesenswert?

Vollständig ist das Programm ja nicht.

Das du bei Problem 2 für deine Tabelle 520 Bytes von den vorhandenen 1k 
SRam benötigst, ist dir sicherlich klar. Was sagt denn avr-size zur 
Größe des data-segments?

Was auch hilfreich ist, ist der Simulator vom Studio. Damit mal den 
Speicher zu verschiedenen Zeitpunkten ansehen, was darin wann passiert.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren