Zuerst einmal:
Eigentlich müsste die erste Zuweisung richtig sein. Denn wenn man stattdessen "TWCR = (1 << TWINT)..." schreibt ist die Bedingung immer "true", auch wenn ich nichtmal eine Kabelverbindung habe. Die zweite Zuweisung wird ja leider nie aufgerufen, aber ich habe im Wissensbereich (oder im Mircrcontroller-Forum?) gelesen, dass TWCR zurück gesetzt wird, indem TWINT durch "TWCR = (1<<TWINT).." gelöscht wird. Ich habe das aber auch nicht so ganz verstanden..
Jetzt etwas neues:
Meine TWI-Slave-Lib funktioniert jetzt endlich. Sie basiert aber auf der Interrupt-Routine. Ich habe erst versucht, dass eine Methode im Java Programm aufgerufen wird, wenn etwas passiert. Dies scheint aber nicht zu funktionieren.
Wenn die Interrupt-Routine nicht auf das Java-Programm warten muss, gibt es keinen Bus-Error mehr und alles funktioniert.
So funktioniert es nun:
Empfang von Daten:
Jetzt werden alle Daten im C-Programm empfangen und in einen Buffer geschrieben, welcher dann an das Java-Programm weiter gegeben wird. Die Interrupt-Routine wird nicht unterbrochen, da dass Java-Programm die Abfrage des Buffers übernimmt.
Senden von Daten:
Wenn ein Request eingeht, wird eine Java Methode ausgelöst. Gleichzeitig geht's weiter: Wenn der txBuffer leer ist, wird ein bestimmtes Zeichen (-1) verschickt, woran der Master erkennen soll, dass der Slave die Daten noch nicht parat hat. Der Master muss solange den Slave abfragen, bis dieser was anderes als -1 schickt.
Wenn das Java Programm dann irgendwann mal den Buffer gefüllt hat wird dieser verschickt.
Der nächste Request kann ausgelöst werden.
Die Slave-Lib funktioniert jetzt wunderbar. Der Quellcode ist aber überhaupt nicht schön. Das muss noch behoben werden. Auch möchte ich noch ein Funktions-Diagramm machen, welches zeigt, wie der Master handeln sollte, damit alles funktioniert.
Mir ist da grad etwas eingefallen:
Früher hab ich ja im Interrupt eine Variable auf 1 gesetzt und dann mit einer Schleife solange gewartet, bis diese 0 ist. Das Java-Programm sollte sie nämlich abfragen und dann auf 0 ändern. Das ganze kann doch gar nicht funktionieren: Denn wenn der Interrupt läuft, kann ja gleichzeitig kein anderer Code ausgeführt werden. Der Interrupt hebelt somit das Java-Thread-System aus.
Jetzt hab ich mein erstes Teil-Ziel erreichtIch würde die Library gerne Hochladen, aber mein Internet gibt zurzeit den Geist auf (Danke Vodafone!!!). Vielleicht wird es heute Abend was.
Edit: Hier ist sie: http://dl.dropbox.com/u/54743553/Archiv.zip
Eine Frage bleibt aber noch: Muss ich, damit ich die "Serial.println.." am PC auslesen kann, die Arduino IDE benutzen, oder gibt es dafür ein anderes Programm?
Vielen Dank![]()
Lesezeichen