Hallo Leute, vielleicht kann mir jemand weiterhelfen. Es geht um die Abarbeitung einer I2C-Routine. In meiner Software wird bei jedem Programmdurchlauf die I2C-Routine abgearbeitet. Bsp: while(1) { I2C(); FUNKTION(); } Nun würde mich interessieren ob es Sinnvoll ist die I2C-Routine z.B. nur nur alle 50 ms auszuführen. Ebenso ob es Sinnvoll ist die Globalen Interrupts während die Routine läuft abzuschalten. Welche Vor- und Nachteile könnten sich dadurch ergeben? Gruß Lukas
>Nun würde mich interessieren ob es Sinnvoll ist die I2C-Routine z.B. nur >nur alle 50 ms auszuführen. Also ich würde diese Routine, wo wir ja nicht mal wissen, was genau diese tut, ausser irgendwas mit I2C, nur dann aufrufen, wenn etwas über I2C gelesen oder geschrieben werden soll. Wenn das alle 42,424242ms sein soll, dann eben so aufrufen..
Da keiner weiß, was die I2C Funktion eigentlich macht, kann man dazu
auch nichts sagen.
Wenn dein jetziges Konstrukt funktioniert, erhebt sich allerdings die
Frage warum du daran etwas ändern willst?
Sprich: aus welchem Grund willst du die I2C Funktion nicht mehr so
häufig aufrufen?
> Welche Vor- und Nachteile könnten sich dadurch ergeben?
Mit der Betonung auf "könnte"
Voteile: keine
Nachteile: I2C funktioniert nicht mehr
:
Bearbeitet durch User
Danke für deine Antwort. Um genauer auf die I2C-Routine einzugehen. Generell sollen in der Routine Tasten abgefragt werden. Auf dem Slave wird eine Taste betätigt und nun soll der Master das Tastenbyte z.B. 41hex auslesen und ein Relais sowie auf der Tastatur die LED aktivieren. Bsp:
1 | void I2C(void) |
2 | {
|
3 | vLEDBYTE = 0x00; |
4 | |
5 | if(vLED1) |
6 | {
|
7 | vLEDBYTE += 0x01; |
8 | }
|
9 | |
10 | I2CSTART(0x54); |
11 | I2CSEND(vLEDBYTE); |
12 | I2CSEND(0x54); |
13 | I2CRESTART(0x55); |
14 | vTASTE = I2CREAD(); |
15 | I2CNACK(); |
16 | I2CSTOP(); |
17 | |
18 | if(vTASTE == 0x41) |
19 | {
|
20 | dRELAIS1 ^= 1; |
21 | vLED1 = dRELAIS1; |
22 | }
|
23 | }
|
Lukas D. schrieb: > Danke für deine Antwort. Um genauer auf die I2C-Routine einzugehen. > Generell sollen in der Routine Tasten abgefragt werden. Auf dem Slave > wird eine Taste betätigt und nun soll der Master das Tastenbyte z.B. > 41hex auslesen und ein Relais sowie auf der Tastatur die LED aktivieren. ok. und was ist jetzt das eigentliche Problem, warum du diese Funktionalität nicht mehr so häufig ausführen lassen willst? Wenn es nur um die Abfrage von ein paar Tasten geht, dann kann man die natürlich auch zeitlich zurück nehmen. Aber kann ist ja erst mal nicht muss.
:
Bearbeitet durch User
Naja das Problem liegt darin das ich das bisher immer so gemacht habe. Nun aber bleibt das System hängen. Habe jetzt einen Zyclus von 50 ms eingefügt und es läuft.
Lukas D. schrieb: > Naja das Problem liegt darin das ich das bisher immer so gemacht habe. > Nun aber bleibt das System hängen. Habe jetzt einen Zyclus von 50 ms > eingefügt und es läuft. Das spricht aber meinem Empfinden nach eher dafür, dass irgendwas anderes in deinem Programm faul ist, wenn eine zu häufige Tastenabfrage das System lahm lagen kann. Soll heißen: Sehr wahrscheinlich hast du das eigentliche Problem damit nicht gelöst. Du hast es nur kaschiert, so wie man bei einem Auto einen Rostfleck dadurch kaschiert, indem man einen Aufkleber drüber klebt. Kurzzeitig ist das Problem nicht mehr sichtbar, es ist aber immer noch da und wird irgendwann wieder zuschlagen.
Da ich die Software von einem PIC16 auf einen PIC18 umgeschrieben habe liegt es möglicherweise daran das ich im copy/paste Wahn vergessen habe die Defines der Ports an denen sich die Relais befinden als PORTxbits.Rxx anstelle von LATxbits.Lxx geschrieben habe. Habe den 50ms Zyklus entfernt und es läuft bisher ohne aufhängen.. Allerdings verstehe ich immernoch nicht warum dann gerade der 50ms Zyklus der I2C-routine die Software am laufen hält :( Teste das jetzt noch. Danke und Grüße Lukas
:
Bearbeitet durch User
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.