-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Timer und/oder Interrupt

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Wulferstedt
    Beiträge
    1.042

    Timer und/oder Interrupt

    Anzeige

    Trotz intensiver Bemühung der Literatur und Internetrecherche bin ich
    auf einen geistigen Anstoss angewiesen. Folgendes Problem:
    In einem Programmablauf lese ich von einem externen Gerät serielle
    Daten aus. Hierbei läuft eine Schleife durch, welche beim ersten Eintreffen
    der Daten verlassen wird. Insofern funktioniert auch alles so, wie
    gewollt. Sollte dieses Gerät jedoch aus fehlerhaften Gründen nicht
    funktionieren, würde das gesamte Programm hängenbleiben.
    Ich will daher vor dem Start dieser "Eröffnungsschleife" einen Timer
    aktivieren, welcher beim Ausbleiben der Daten das Programm nach
    einer gewissen Zeit zu einer Marke danach springen lässt.
    Danach muss der Timer wieder abgeschaltet werden.
    Das fehlerhafte Gerät kann dadurch ignoriert werden und das Programm
    kann trotzdem die weiteren Aufgaben erfüllen.
    Ich hoffem ich hab das Problem einigermassen verständlich geschildert
    und würde mich freuen, wenn jemand dazu einen Gedankenanstoss
    hätte. VG Micha

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556

    Re: Timer und/oder Interrupt

    Zitat Zitat von hardware.bas
    Trotz intensiver Bemühung der Literatur und Internetrecherche bin ich
    auf einen geistigen Anstoss angewiesen. Folgendes Problem:
    In einem Programmablauf lese ich von einem externen Gerät serielle
    Daten aus. Hierbei läuft eine Schleife durch, welche beim ersten Eintreffen
    der Daten verlassen wird. Insofern funktioniert auch alles so, wie
    gewollt. Sollte dieses Gerät jedoch aus fehlerhaften Gründen nicht
    funktionieren, würde das gesamte Programm hängenbleiben.
    Ich will daher vor dem Start dieser "Eröffnungsschleife" einen Timer
    aktivieren, welcher beim Ausbleiben der Daten das Programm nach
    einer gewissen Zeit zu einer Marke danach springen lässt.
    Danach muss der Timer wieder abgeschaltet werden.
    Das fehlerhafte Gerät kann dadurch ignoriert werden und das Programm
    kann trotzdem die weiteren Aufgaben erfüllen.
    Ich hoffem ich hab das Problem einigermassen verständlich geschildert
    und würde mich freuen, wenn jemand dazu einen Gedankenanstoss
    hätte. VG Micha

    Die Daten einfach in einer IRQ abholen, siehe..

    http://www.rowalt.de/mc/avr/avrboard/06/avrb06.htm

    Gruß Richard

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Wulferstedt
    Beiträge
    1.042
    Vielen Dank, das Buch von Roland Walter habe ich. Eigentlich ziemlich
    gut, das Thema Timer jedoch ziemlich unverständlich. Der Link
    hilft mir leider nicht weiter. Das Problem kurz nochmal als Extract:
    1. Vor dem Start einer beabsichtigten Prozedur muss ein Timer starten.
    2. Jetzt beginnt die beabsichtigte Prozedur ODER hängt sich durch einen
    Fehler auf und würde das gesamte weitere Programm stoppen. Aus diesem
    Aufhänger muss der Ablauf des Timers führen und das Programm an
    einer Marke danach fortsetzen.
    3. Nach der Prozedur (erfolgreich oder nicht) muss der Timer deaktiviert
    werden.
    Oder nochmal kurz geschildert:
    Im Fehlerfalle wird eine Prozedur zum Aufhänger führen und deshalb
    soll diese nach einer gewissen Zeit ignoriert und das weitere
    Programm fortgeführt werden.
    Lösungsansätze hatte ich schon, indem ich die Schleifen mit einer
    Variable (DIM as long) kontrollieren wollte und an einer hohen
    Zahl herausspringe, es sind jedoch mehrere Abfrageschleifen und
    das Programm wurde nicht mehr beherrschbar.
    Eine weitere Lösung wäre Hardware durch Parallelschaltung eines
    monostabilen Multivibrators... alles Kompromisse, wenn man einen
    Atmega8 zur Verfügung hat, nur leiderunumgänglich wenns mit
    der Programmieruntg nicht klappt. VG Micha

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von hardware.bas
    2. Jetzt beginnt die beabsichtigte Prozedur ODER hängt sich durch einen
    Fehler auf und würde das gesamte weitere Programm stoppen. Aus diesem
    Aufhänger muss der Ablauf des Timers führen und das Programm an
    einer Marke danach fortsetzen.
    Ist mir schon klar was Du vorhast, aber wenn Du die RS232 Daten per URX IRQ abholst Wird Dein Hauptprogramm im Fehlerfall erst gar nicht verlassen, kann also nicht "gestoppt" werden und Daten werden nur dann abgeholt wenn tatsächlich auch welche eingetroffen (also der Sender tatsächlich fehlerfrei arbeitet).

    Also etwa so ähnlich....

    Loop 'Hauptprogramm

    IF RS232 IRQ then Gosub hole Daten ISR
    X ver/bearbeiten

    Beliebiges Programm

    Do

    Daten ISR
    x=RS232Data
    Return

    Bei fehlender/gestörter Verbindung oder ausgefallenem Sender wird die Daten ISR nie ausgeführt, das Hauptprogramm NICHT blockiert. Achtung Input und einige andere Befehle warten auf CR und die Passende Datenlänge. Besser also Byte weise Daten abholen.....

    Gruß Richard

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Wulferstedt
    Beiträge
    1.042
    Die serellen Daten kommen nicht von der UART, sondern von einer
    Unterwassermesssonde mit einem eigens dafür selbstgestrickten
    Protokoll, da die verwendeten 1wire-Fühler es nicht packten,
    ich jedoch über 100m überbrücken muss. Hier werden L- und H-
    Pegel mittels Schleifenabfragungen dedektiert. Das funktioniert, wie gesagt,
    auch sehr gut. Nur der Fall, wenn diese Daten NICHT kommen, muss
    abgesichert sein, da die Prozedur auf diese Daten WARTET.
    Ansonsten hast Du mich, Richard, warscheinlich schon richtig
    verstanden. Es muss, wie folgt laufen:
    1. Timer starten (wie kriegt man das definiert hin?)
    2. Schleifenabfrage des Empfangspins (funktioniert bei mir)
    3. Wenn Datenübertragung ok ists gut, wenn nicht muss der Timerüberlauf
    dafür sorgen, dass ich zu einer Programmmarke nach dieser Prozedur springe, also die nicht erfolgte Datenübertragung ignoriert wird.
    4. Jetzt muss der Timer deaktiviert werden
    VG Micha

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Da man eine Schleife, die ja im FLash einprogrammiert ist, nicht beeinflussen kann, musst du also innerhalb dieser Schleife eine Abfrage auf ein "cancel"-SIgnal (Bit oder byte, das vom TImer gesetzt wird) einbauen. Ist dieses Signal gesetzt, wird die schleife verlassen.

    Es gibt auch noch die möglichkeit, den "watchdog" (guckstu AVR-Datasheet) zu verwenden. Der ist eigentlich für sowas wie hängende Schleifen da.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von hardware.bas
    Die serellen Daten kommen nicht von der UART, sondern von einer
    Unterwassermesssonde mit einem eigens dafür selbstgestrickten
    Protokoll, da die verwendeten 1wire-Fühler es nicht packten,
    ich jedoch über 100m überbrücken muss. Hier werden L- und H-
    Pegel mittels Schleifenabfragungen dedektiert. Das funktioniert, wie gesagt,
    auch sehr gut. Nur der Fall, wenn diese Daten NICHT kommen, muss
    abgesichert sein, da die Prozedur auf diese Daten WARTET.
    Ansonsten hast Du mich, Richard, warscheinlich schon richtig
    verstanden. Es muss, wie folgt laufen:
    1. Timer starten (wie kriegt man das definiert hin?)
    2. Schleifenabfrage des Empfangspins (funktioniert bei mir)
    3. Wenn Datenübertragung ok ists gut, wenn nicht muss der Timerüberlauf
    dafür sorgen, dass ich zu einer Programmmarke nach dieser Prozedur springe, also die nicht erfolgte Datenübertragung ignoriert wird.
    4. Jetzt muss der Timer deaktiviert werden
    VG Micha

    Den Timer als Zähler Configurieren und bei Überlauf per per Gosub ( ) zu einer Sprungmake in der Haupt Schleife springen
    sollte gehen.


    Oder einfach eine Brücke von Deinem Dateneingangs Pin zu int1 oder int0 und die Daten dann in der IRQ abholen. Die wird dann auch nur ausgeführt wenn tatsächlich auch Daten eingetroffen sind.

    Gruß Richard

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.10.2008
    Ort
    Wulferstedt
    Beiträge
    1.042
    Vielen Dank erstmal. Ich würde dann ersteren Vorschlag anwenden (auch
    wenn der Smily traurig schaut), da der NORMALFALL der Betrieb MIT
    Datenlogging von UW-Sensor darstellt. Der (lächelnde, warum?) Smily
    wäre auch realisierbar, jedoch soll ja gerade bei DatenEINGANG NICHTS
    passieren! Mit Timern habe ich bisher nur einmal gearbeitet
    (Erstinitialisierung und quasi abgeschrieben von Buch), deshalb nun noch
    kurz eine Bitte für folgendes Beispiel:
    1. Vorbereitung und Starten des Timers vor der Prozedur, also
    innerhalb des Programmes (wie macht man das?)
    2. Wie deaktiviert man den Timer, wenn man die Sprungadresse, also
    das GOTO erreicht hat?
    Trotz Bücherwälzens krieg ich diesen speziellen Fall nicht nachvollzogen.
    Vielen Dank und viele Gruesse. Micha

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von hardware.bas
    Vielen Dank erstmal. Ich würde dann ersteren Vorschlag anwenden (auch
    wenn der Smily traurig schaut), da der NORMALFALL der Betrieb MIT
    Datenlogging von UW-Sensor darstellt. Der (lächelnde, warum?) Smily
    wäre auch realisierbar, jedoch soll ja gerade bei DatenEINGANG NICHTS
    passieren! Mit Timern habe ich bisher nur einmal gearbeitet
    (Erstinitialisierung und quasi abgeschrieben von Buch), deshalb nun noch
    kurz eine Bitte für folgendes Beispiel:
    1. Vorbereitung und Starten des Timers vor der Prozedur, also
    innerhalb des Programmes (wie macht man das?)
    2. Wie deaktiviert man den Timer, wenn man die Sprungadresse, also
    das GOTO erreicht hat?
    Trotz Bücherwälzens krieg ich diesen speziellen Fall nicht nachvollzogen.
    Vielen Dank und viele Gruesse. Micha
    Der weil Goto eigentlich verbrannt gehört ist ein ganz schlimmer programmier Stiel...

    In den Link vorhin von mir kommt wenn man herunter srollt genau was Du suchst, Beispiele wie Timer genutzt werden und wie sie ein b.w. ausgeschaltet werden. Ausschalten dann als erstes nach der Sprungadresse. Es macht nichts wenn der Timer andauernd ausgeschaltet wird mehr als aus geht eh nicht. Allerdings verbrauchst Du viiil Zeit ohne IRQ weil deine Hauptschleife andauernd weiter versucht Daten zu bekommen, den Timer Startet und nach Ablauf wieder Stoppt. Absolute Verschwendung.

    Auch hier wäre ein genaues Lesen von meinem Link vom Vorteil ( nur die Datenquelle und deren IRQ sind dann anders) der Sinn bleibt ähnlich.

    Gruß Richard

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Zitat Zitat von hardware.bas
    Protokoll, da die verwendeten 1wire-Fühler es nicht packten,
    Dazu fällt mit gerade etwas ein,Betreibst Du den Mega mit einem Quarz? Wenn nicht hast Du möglicher Weise deshalb Probleme mit 1Wire!

    Lese Dir einmal im Netz das Wiki zu 1Wire durch, Das Protokoll wird allein durch Signal Zeiten auf der Datenleitung gesteuert, muss also extrem genaue Zeiten produzieren und das klappt ohne Quarz schon bei RS232 nicht wirklich.....

    Gruß Richard

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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