Ich habe ein Projekt für eine Schrittmotorsteuerung mit dem IOW56 unter MacOSX 10.6.
Teil 1: Die Schnittdaten werden via IIC auf den MC übertragen (400 kHz, Atmega328 bei 8 MHz). Nach jedem Datenpaket mit 32 Bytes wird mit Hilfe der Callback-Funktion das nächste Paket aufgerufen. Das funktioniert einwandfrei.
Nun möchte ich die Steuerung auch halbwegs in Echtzeit betreiben. Die Geschwindigkeiten sind sehr klein, die Abschnitte dauern mehrere Sekunden, eventuelle kurze Pausen zwischen den Datenpaketen sind nicht relevant.
Dazu schicke ich ein Paket via IIC auf den MC, setze dann den IIC nach Ankunft des Callback zurück, damit der IOW auf das Signal des MC warten kann, dass das aktuelle Paket abgearbeitet ist. Anschliessend setze ich IIC wieder und schicke das nächste Paket.
Das funktioniert nur ab und zu. Der IOW hängt sich in der Resetfunktion für den IIC auf. Er stellt das Interface richtig ein und findet auch den gleichen ListNode wie beim Init. Aber die Funktion IOWarriorWriteToInterface kommt nicht zurück. Die Fehlermeldung von result wird gar nicht erreicht. Ich muss dann das Programm abwürgen, den IOW aus- und wieder einstecken, um wieder probieren zu können.
Hier die relevanten Teile meiner Funktion zum Einschalten des IIC (Mehr oder weniger aus dem Prober):
A) Buffer zusammensetzen reportSize ist 63):
Code: Select all
[interfacePopup selectItemAtIndex:1];
[self interfacePopupChanged:self];
reportSize = [self reportSizeForInterfaceType:[self currentInterfaceType]];
buffer = malloc (reportSize);
buffer[0]=0x01; // Report ID fuer IIC Interface
buffer[1]=0x00; // Code fuer IIC Reset
buffer[2]=0x01; // 400 kHz
for (i = 3 ; i < reportSize ; i++) // restliche Bytes
{
buffer[i]=0x00;
}
Code: Select all
listNode = IOWarriorInterfaceListNodeAtIndex ([interfacePopup indexOfSelectedItem]);
C Schreiben auf Interfae:
Code: Select all
result = IOWarriorWriteToInterface (listNode->ioWarriorHIDInterface, reportSize, buffer);
Wo ist da nach dem Fehler zu suchen? Ich vermute Sünden bei der Länge eines Arrays, aber ich habe noch nichts gefunden. Ich habe auch versuchsweise die Resetfunktion erst nach einem Delay aufgerufen, ausserhalb der Callback-Funktion, aber das half nichts.
Mit bestem Dank für jeden Tipp
Ruedi Heimlicher