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ß
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
Da wirst du wohl mal deinen Code posten müssen...
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; }
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
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.