IOW56: IIC hängt sich auf

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
ruediheimlicher
Posts: 13
Joined: Tue Feb 13, 2007 2:38 pm
Location: Rüti ZH

IOW56: IIC hängt sich auf

Post by ruediheimlicher »

Guten Tag
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;
	}
B ListNode suchen:

Code: Select all

listNode = IOWarriorInterfaceListNodeAtIndex ([interfacePopup indexOfSelectedItem]);
Das ergibt den gleichen Node wie beim Init.
C Schreiben auf Interfae:

Code: Select all

	result = IOWarriorWriteToInterface (listNode->ioWarriorHIDInterface, reportSize, buffer);
Hier hängt sich der IOW häufig auf. Der Fehler ist nicht reproduzierbar, aber häufiger als die richtige Funktion.
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
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW56: IIC hängt sich auf

Post by Guido Körber »

Sorry, das kann ich jetzt nicht nachvollziehen. Der IO-Warrior hat keine Reset-Funktion für den IIC. Im Normalfall sollte die IIC Funktion einfach eingeschaltet bleiben so lange es keinen wirklich Grund dafür gibt sie zu deaktivieren.
Post Reply