Forum: Mikrocontroller und Digitale Elektronik PIC, I2C - Reaktionszeit auf SSP-Interrupt


von Brainy (Gast)


Lesenswert?

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

von Bernhard_ (Gast)


Lesenswert?

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...

von Zwirbeljupp (Gast)


Lesenswert?

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?

von Brainy (Gast)


Lesenswert?

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.

von Brainy (Gast)


Lesenswert?

@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.

von Zwirbeljupp (Gast)


Lesenswert?

> 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...)

von Brainy (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.