Forum: Compiler & IDEs avr-gcc->Probleme beim 1.kopieren von struct und 2. Arrays mit Double


von Christian V. (caegger)


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ß

von Oliver (Gast)


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

von Uhu U. (uhu)


Lesenswert?

Da wirst du wohl mal deinen Code posten müssen...

von Christian V. (caegger)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Out of memory?

von Oliver (Gast)


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

von Christian V. (caegger)


Lesenswert?

Hallo,

danke für den Speicherhinweis, könnte das Problem sein. Habe vorher nur 
mit 32bit Prozessoren gerarbeitet.
Kann man mit avr-gcc einen Memory Map erstellen?

gruß

von Christian V. (caegger)


Lesenswert?

Hallo,

danke für eure Hilfe! Beide Probleme sind mit einer etwas effizienteren 
Speicherverwaltung gelöst. Der .Data Bereich war einfach zu groß.

Gruß

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.