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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.