Forum: Compiler & IDEs Problem mit Array. Werte werden überschrieben


von David Knochenhauer (Gast)


Lesenswert?

Hi

Ich habe ein Progamm mit einem Array in welchem die Configuration für 
einen Schrittmotorcontroller abgelegt ist. (Trinamic TMC428).

Dieses Array wird nun also beim Start in den RAM des Controllers 
geschaufelt. Nach langer Fehlersuche, habe ich herausgefunden, das die 
ersten beiden Bytes im Array, zur Laufzeit, scheinbar nicht die Werte 
haben, die ich initialisiert habe.

Wenn ich nach direkt nach der Schleife, die das Array rüberschaufelt, 
noch einmal die ersten beiden Bytes explizit beschreibe, läuft alles 
prima.

Also hier mal ein paar schnippel:
Das Array:

unsigned char driver_table[128]=
{
//Datagrams

0x10, 0x05, 0x04, 0x03, 0x02, 0x06, 0x10, 0x0D, 0x0C, 0x0B, 0x0A, 0x2E, 
//Motor0
0x10, 0x05, 0x04, 0x03, 0x02, 0x06, 0x10, 0x0D, 0x0C, 0x0B, 0x0A, 0x2E, 
//Motor1
0x10, 0x05, 0x04, 0x03, 0x02, 0x06, 0x10, 0x0D, 0x0C, 0x0B, 0x0A, 0x2E, 
//Motor3

0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11,

// microstep wave table

0x00,0x02,0x03,0x05,0x06,0x08,0x09,0x0B,0x0C,0x0E,0x0F,0x11,0x12,0x14,0x 
15,0x17,
0x18,0x1A,0x1B,0x1C,0x1E,0x1F,0x20,0x22,0x23,0x24,0x26,0x27,0x28,0x29,0x 
2A,0x2B,
0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x34,0x35,0x36,0x37,0x38,0x38,0x 
39,0x3A,
0x3A,0x3B,0x3B,0x3C,0x3C,0x3D,0x3D,0x3D,0x3E,0x3E,0x3E,0x3F,0x3F,0x3F,0x 
3F,0x3F
};

Und die Schleife die es rüberschaufelt.

for(i=128; i<256; i+=2)
    Send428(i, 0, driver_table[i-127], driver_table[i-128]);

Wenn ich das nochmal danach mache klappt alles wunderbar:
  Send428(128, 0, 0x05, 0x10);

In der Symbol-Datei sehe ich auch nichts auffälliges.

Mein Verdacht ist halt, das irgendwas die ersten beiden bytes 
überschreibt.

Vielen Dank
David Knochenhauer

von pumpkin (Gast)


Lesenswert?

mich würde mal die deklaration der Send428 funktion und von i 
interessieren.

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
nur ne idee: wie ist i deklariert? (und warum zum geier fängst du bei 
128 an?)
bye kosmo

von David Knochenhauer (Gast)


Lesenswert?

Also Send428 ist folgendermassen deklariert:
void Send428(unsigned char a, unsigned char b, unsigned char c, unsigned 
char d);

macht nur 4 mal SPI-senden, davor und danach natürlich CS-Toggle.

i wird in der init428()-Funktion, in der auch die for-Schleife steht, 
als "int" deklariert.

Noch ein paar Infos:
Das array wird noch vor main initialisiert, also global.

@kosmo: ich fange bei 128 an, weil das die Startadresse im RAM des 
Controllers ist, bei der das Datagram rein soll.

Die Schleife stimmt schon, denke ich. Mit dem "Nachtrag" klappts ja.

von Oliver (Gast)


Lesenswert?

Das Array und die Schleife sind in Ordnung. Also liegt der Fehler 
woanders. Hat der Controller überhaupt ausreichend Ram?

"Mein Verdacht ist halt, das irgendwas die ersten beiden bytes
überschreibt."

Das, oder deine SPI-Geschichte funktioniert nicht richtig.

Was passiert, wenn du direkt hinter die Schleife so etwas wie
1
if (driver_table[0] == 0x10) LED_an();
einbaust (wa auch immer da möglich ist). Geht die LED an, oder nicht?

Oliver

von David N. (knochi)


Lesenswert?

Also man kommt ja manchmal nicht auf die einfachsten Sachen.
Mache das dauernd mit den LEDs (hab ja sogar nen DevKit).
Also das Array stimmt... die SPI Übertragung stimmt auch.
Hab in die Send428() funktion direkt ne Debug LED eingebaut, um zu 
prüfen ob die 128 in Verbindung mit 0x10 ankommt... klappt.

Also Oscar an den MOSI-Pin gehangen und geguckt was rauskommt...
1
 128, 0, 0x05, 0x10
 Alles in Ordnung.

Also liegt's wohl am Motorcontroller... vieleicht braucht der irgendwie 
nen "Aufweck"-Datagram oder sowas... oder ich muss ein bisschen warten, 
vor der ersten Übertragung... werde daraufhin jetzt mal weitersuchen.

Vielen Dank soweit schon mal... das mit den Debug-LEDs hats gebracht.

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.