mikrocontroller.net

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


Autor: David Knochenhauer (Gast)
Datum:

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

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mich würde mal die deklaration der Send428 funktion und von i 
interessieren.

Autor: Joe Die (kosmonaut_pirx)
Datum:

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

Autor: David Knochenhauer (Gast)
Datum:

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
if (driver_table[0] == 0x10) LED_an();
einbaust (wa auch immer da möglich ist). Geht die LED an, oder nicht?

Oliver

Autor: David N-K (knochi)
Datum:

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

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.