Problem mit Array. Werte werden überschrieben

Gast #508927
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
Gast #509071
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.
Gast #509080
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
#509581
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.

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.