www.mikrocontroller.net

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


Autor: Christian V. (caegger)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da wirst du wohl mal deinen Code posten müssen...

Autor: Christian V. (caegger)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Out of memory?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian V. (caegger)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Christian V. (caegger)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.