www.mikrocontroller.net

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


Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schlaumeier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd F. (gerd_f)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.