Hallo Forengemeinde, ich benutze zwei PIC18F8520, zwischen denen ich Daten über I2C austausche. Lesen und Schreiben funktioniert gut, bloß ist beim Schreiben die Reaktionszeit des Slave auf ein Address-Match oder ein Datenbyte mit 150 us m.E. viel zu lang. Das ist die Zeit, die ich gemessen habe zwischen dem ACK-Signal des Slave (das kommt ohne Verzögerung nach dem Address- bzw. Datenbyte des Masters) und dem Aufruf der Interrupt-Routine. Beim Read-Request des Masters kommt die Interrupt-Routine bereits nach wenigen Mikrosekunden. Das Verhalten ist natürlich bei allen Baudraten gleich. Der Master ist mit 25 MHz und der Slave mit 1,8432 MHz getaktet. Kennt jemand so ein Verhalten? Ist das eine normale Reaktionszeit, liegt es an der niedrigen Taktrate des Slave? Gruß Brainy
Ohne einen Quellcode lässt sich darüber nicht allzuviel sagen. Aber: Funktionsaufrufe innerhalb einer ISR (auch wenn nicht verwendet) zwingen zumindest den C18 Compiler zu einem ÄUSSERST ineffizienten Stackhandling mit langer Latenzzeit. Einfach simulieren...
1,8432 MHz ist jetzt aber auch nicht gerade wahnsinnig schnell. Da dauert ein Befehl schon mal allein 2,2 µs. Wie wird denn dei Verzögerung bei Dir gemessen? Setzt Du in der ISR einen Pin auf High/Low?
Genau, in der ISR als erstes einfach einen Port auf high setzen. 1,8432 MHz sind natürlich nicht schnell, aber in der Zeit kann er ja ca. 60 Instruktionen durchführen. Und das halte ich für ziemlich viel.
@Bernhard_: Ich verwende den HiTech PICC-18 STD Compiler und rufe innerhalb der ISR tatsächlich eine SSP-Handler-Funktion auf. Ich werde in Kürze mal testweise das SSP-Handling ohne Interrupt durchführen.
> 1,8432 MHz sind natürlich nicht schnell, aber in der Zeit kann er ja ca. > 60 Instruktionen durchführen Dann schau mal ins Assemblerlisting. Es würde mich nicht wundern, wenn der PIC diese 60 Instruktionen als Overhead in der ISR verbrät (Register sichern usw...)
Ich habe mir im Assembler-Listing den Overhead beim Interrupt angesehen und es stimmt, es werden für's Hin und Zurück jeweils 42 Instruktionen verbraten, incl. 50% NOPs(!). D.h. ich werde für meine Anwendung Interrupts vermeiden, denn Polling kann ich mir in dem Fall leisten. Und einen schnelleren Clock werde ich mir auch leisten. ;-) Bernhard_ und Zwirbeljupp, vielen Dank für Eure Unterstützung, Ihr habt mir schnell geholfen! Brainy
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.