Forum: Mikrocontroller und Digitale Elektronik I2C Zycluszeit


von Lukas D. (lukas_d)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
von Lukas D. (lukas_d)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

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
von Lukas D. (lukas_d)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lukas D. (lukas_d)


Lesenswert?

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