- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 3 von 3

Thema: Interrupt nach Aktivierung auslösen...

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.07.2008
    Beiträge
    56

    Interrupt nach Aktivierung auslösen...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe folgendes problem:

    Ich möchte Impulse von einem Stromzähler mittels Interrupt zählen und die Daten über LAN verschicken.

    Dazu speichere ich jede Minute die Summe der letzten Impulse in einen Array. Eine "Counter" Variable zeigt mir immer auf die letzte befüllt Adresse im Array. Immer wenn möglich werden die Daten des Arrays von unten weg versendet und der Counter um eins zurückgezählt.

    Wenn nun während des Sendevorganges bzw. an einer anderen Stelle im Programm, wo der "Counter" gebraucht wird, der Interrupt diesen um 1 erhöht, würden unvorhersebare Probleme entstehen.

    Als Lösung wäre mir eingefallen dass ich während des Sendens mir den "Counter" in eine andere Variable abspeichere und danach ihn mit dem "Counter" vergleiche um zu sehen ob der Interrupt in dieser Zeit aktiv war. Danach müsste ich lediglich die Lücke in dem Array beseitigen. Das einzige Problem nun währe dass der Interrupt beim aufräumen wieder Probleme verursachen könnte.

    Eine andere denkbare Lösung währe, den Interrupt für die Sendezeit zu deaktivieren und danach wieder zu Aktivieren, dabei könnte ich jedoch einen "Tick" verpassen. Is es möglich den Interrupt beim Aktivieren auslösen zu lassen, wenn ein Tick in der zwischenzeit gekommen wär. Nur könnte ich dabei 2 Ticks verpassen und am Ende nur 1nen rausbekommen.

    Fällt euch eine bessere Lösung zu dem Problem ein, oder wie würdet ihr das angehen?

    Freundliche Grüße
    Philipp Reitter

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Du könntest z.B. zwei Pointer verwenden.
    Einer zeigt immer auf die letzte beschriebene Zelle (oder auf die nächste zu schreiben) und der zweite immer auf die zuletzt gelesene (oder auf die nächste zu lesen).
    Wenn der Lese-Pointer gleich dem schreib-Pointer wird, heißt das, dass alle Werte übertragen wurden. Wird der Schreib-Pointer gleich dem Lese-Pointer, ist dein Array voll.
    Kommen denn deine Impulse vom Zähler überhaupt so schnell, dass du nicht genügend Zeit zum Senden hast?

    Zitat Zitat von Flario
    Hallo,
    Is es möglich den Interrupt beim Aktivieren auslösen zu lassen, wenn ein Tick in der zwischenzeit gekommen wär.
    Das geschieht automatisch. Während der Abarbeitung einer ISR sind weitere Interrupts gesperrt. Allerdings werden die entsprechenden Flags gesetzt, wenn eine Interrupt Bedingung zutrifft. Sobald dann die ISR verlassen wird, werden die interrupts wieder global zugelassen. Bereits gesetzte Flags führen dann zum Aufruf der zugehörigen ISR.
    Allerdings nur jeder Typ einmal, wie du schon vermutet hast.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.07.2008
    Beiträge
    56
    Zitat Zitat von for_ro
    Kommen denn deine Impulse vom Zähler überhaupt so schnell, dass du nicht genügend Zeit zum Senden hast?
    Die Imulse können je nach verwendeten Zähler und fließendem Strom in Zahntel bis Sekundenbereich Abständen kommen, meine Angst dass ich einen verpasse kommt mehr davon dass es sich im netzwerk Stauen könnte, und ich ja den "Ack" vom Server raussuchen will um sicher zu gehn dass meine Daten angekommen sind.

    Aber das ist jetzt eh egal dank deiner Lösung.
    Vielen Dank für deine Antwort!

    Freuntliche Grüße
    Philipp

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress