Forum: Mikrocontroller und Digitale Elektronik Best practise IRQ oder was?


von Gerd F. (gerd_f)


Lesenswert?

Hallo,

bräuchte mal ein Tip wie ich meine Berechnung am besten angehen soll, 
ich muss jede Sekunde den Strom auslesen und der 3600 Teil zu einer 
Variablen hinzu addieren um die entnommenen Ah zu berechnen. Ich hab da 
2 Ideen wie ich das realisieren könnte:

1) while(1)
   {
   Strom lesen und auf LCD ausgeben
   Ah Berechnung und auf LCD ausgeben
   1000ms warten
   }

2) Mit dem RTC Chip jede Sekunde einen IRQ auslösen
   IRQ Routine ruft Berechnung auf

Im ersten Fall muss ich aufpassen wenn ich andere Dinge im Programm 
mache, z.B. noch Spannungen einlese und auf dem LCD ausgebe, ich müsste 
immer asprobieren wie lange die ganzen Prozesse benötigen und die Zeit 
von den 1000ms abziehen.

Im zweiten Fall werden unheimlich viele Interrups generiert, geht das, 
ist das so gängige Parxis? Hier hätte ich den Vorteil, dass ich 
beliebige andere Dinge tun könnte ohne die Berechnung zu verfälschen.

Gruss
Gerd

von Falk B. (falk)


Lesenswert?

@  Gerd F. (gerd_f)

>Im zweiten Fall werden unheimlich viele Interrups generiert,

Unheimlich viele? 1 mal pro Sekunde? Der Mikrocontroller sitrbt vor 
Langeweile.

Wie man es richtig macht, siehe Interrupt.

MFG
Falk

von Gerd F. (gerd_f)


Lesenswert?

Falk Brunner schrieb:
> @  Gerd F. (gerd_f)
>
>>Im zweiten Fall werden unheimlich viele Interrups generiert,
>
> Unheimlich viele? 1 mal pro Sekunde? Der Mikrocontroller sitrbt vor
> Langeweile.
>
> Wie man es richtig macht, siehe Interrupt.
>
> MFG
> Falk

Ahja, die eingebauten Timer hab ich ja auch noch, das ist noch besser 
als den RTC Chip zu verwenden. Dann probier ich das mal so, Danke!

Gruss
Gerd

von Schlaumeier (Gast)


Lesenswert?

> Im zweiten Fall werden unheimlich viele Interrups generiert, geht
> das, ist das so gängige Parxis?

Naja, Du musst halt aufpassen, dass sich das Interrupt-Register nicht 
ungleichmäßig abnutzt...

von Andreas (Gast)


Lesenswert?

Schlaumeier schrieb:
>> Im zweiten Fall werden unheimlich viele Interrups generiert, geht
>> das, ist das so gängige Parxis?
>
> Naja, Du musst halt aufpassen, dass sich das Interrupt-Register nicht
> ungleichmäßig abnutzt...

G
Genau!

Aber im Ernst: Da man eigentlich immer irgendeine Zeitbasis braucht, 
habe ich praktisch in jedem meiner Projekt einen Zähler, der die 
verstrichene Zeit hochzählt und zwar in Millisekunden. Der Interrupt 
wird also 1000 mal pro Sekunde aufgerufen! Ich kann Dir versichern, dass 
zwischen diesen Aufrufen - aus Sicht des Controllers - riesige Zeiträume 
liegen, in denen er andere Aufgaben erledigen kann - 2 UARTS bedienen, 6 
ADC auslesen per I2C kommunizieren unde wenn er damit fertig ist, ist 
ihm immer noch langweilig.

von Peter D. (peda)


Lesenswert?

Gerd F. schrieb:
> Mit dem RTC Chip jede Sekunde einen IRQ auslösen
>    IRQ Routine ruft Berechnung auf

Ne RTC braucht man heutzutage nicht mehr, die MCs haben interne Timer.

Und für Batteriebetrieb gibt es extra Stromsparmodi, wo nur der Timer 
weiterläuft (<1µA).


Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gerd F. schrieb:
> 1) while(1)
>    {
>    Strom lesen und auf LCD ausgeben
>    Ah Berechnung und auf LCD ausgeben
>    1000ms warten
>    }

Das läuft dann aber nicht im Sekundenraster, denn die ersten beiden 
Schritte werden zwar nicht lange laufen, aber ein bisschen Zeit 
benötigen sie schon. Du müsstest also beim dritten Schritt die Zeitdauer 
bis zur nächsten vollen Sekunde bestimmen und nur so lange warten.

Stabiler aber ist eine von einem Timerinterrupt gesteuerte Variante.

Das bedeutet nicht, daß Du die Berechnungen in Deiner Interruptroutine 
ausführen musst, das kannst Du nach wie vor in der Hauptschleife machen, 
aber statt 1000 msec lang zu warten, wartest Du auf ein Flag, das von 
der Interruptroutine gesetzt wird. Und der Timerinterrupt kommt halt 
jede Sekunde. Das Flag muss als volatile deklariert werden, damit es 
nicht dem Optimizer des C-Compilers zum Opfer fällt.

von Gerd F. (gerd_f)


Lesenswert?

Peter Dannegger schrieb:
> Ne RTC braucht man heutzutage nicht mehr, die MCs haben interne Timer.

Naja, für die Zeit vieleicht nicht unbedingt aber fürs Datum ist es 
schon praktisch. Ich hab den rtc72421 mit einer Lithium Stützbatterie 
mal mit aufs Board genommen, dann hab ich Zeit und Datum immer 
abrufbereit und kann dann leichter datums- und zeitbezogene 
Schaltvorgänge durchführen.

Gerd

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.