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
mich würde mal die deklaration der Send428 funktion und von i interessieren.
hallo, nur ne idee: wie ist i deklariert? (und warum zum geier fängst du bei 128 an?) bye kosmo
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.