Forum: Mikrocontroller und Digitale Elektronik Programmaufbau bei Timernutzung und ISR


von Würschterl (Gast)


Lesenswert?

Hallo,

es heisst ja immer ISR-Routinen sollten möglichst knapp sein, damit sie 
schnell abgearbeitet sind und den MC nicht weiter blockieren.

Ich habe jetzt mal ne Uhr Programmiert eben mit einem Timer und einem 
128x64-Display das per I2C angesprochen wird.

In der ISR inkrementiere ich nur meine Uhr, da ist ein bischen Logik 
drinn, eben für Überlauf der Sekunden und Minuten, das ist ja schnell 
abgearbeitet.

Wenn ich dort noch das Update fürs Display mache, blockiert das Ganze.
Nehmen ich das raus und prüfe in der main() in der Hauptschleife ob sich 
der Sekundenwert geändert hat und nur bei Änderung die Displayroutine 
aufrufe, geht es problemlos.

Die Routine fürs Display braucht ca. 160ms (400kHz I2C), das müsste doch 
innerhalb der ISR auch funktionieren, denn bis die wieder aufgerufen 
wird ist die displayroutine schon wieder abgearbeitet.

MC ist ein Atmega328P auf 16MHz, ja ein Arduino.
Timer ist Timer 1 der bis 15625 zählt, Prescaler auf 1024, Capture 
Modus.

von Klaus (Gast)


Lesenswert?

Würschterl schrieb:
> es heisst ja immer ISR-Routinen sollten möglichst knapp sein, damit sie
> schnell abgearbeitet sind und den MC nicht weiter blockieren.

Meine Lieblings-Mainloop sieht so aus
1
while(1) {
2
    sleep();
3
}

MfG Klaus

von Thomas E. (thomase)


Lesenswert?

Würschterl schrieb:
> Die Routine fürs Display braucht ca. 160ms (400kHz I2C), das müsste doch
> innerhalb der ISR auch funktionieren, denn bis die wieder aufgerufen
> wird ist die displayroutine schon wieder abgearbeitet.

Verwendet dein I2C Interrupts?

Solange eine ISR läuft, also in deinem Fall die Timer-ISR, sind alle 
anderen IRQs gesperrt.

mfg.

von Würschterl (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Verwendet dein I2C Interrupts?
Äh ja, oh je wie doof, dass ich darauf nicht selber gekommen bin.

von Bitflüsterer (Gast)


Lesenswert?

Würschterl schrieb:
> Thomas Eckmann schrieb:
>> Verwendet dein I2C Interrupts?
> Äh ja, oh je wie doof, dass ich darauf nicht selber gekommen bin.

Ooch, halb so schlimm. So etwas passiert uns allen mal auf irgendeinem 
Niveau immer wieder.

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.