PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer und/oder Interrupt



hardware.bas
18.12.2010, 12:40
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

Richard
18.12.2010, 13:33
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

hardware.bas
18.12.2010, 14:46
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

Richard
18.12.2010, 15:42
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

hardware.bas
18.12.2010, 16:14
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

PicNick
18.12.2010, 16:57
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.

Richard
18.12.2010, 17:10
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

hardware.bas
18.12.2010, 17:35
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

Richard
18.12.2010, 18:02
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

Richard
18.12.2010, 18:40
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

hardware.bas
18.12.2010, 19:00
Danke, Richard.
Als Erstes, Deine Hinwei zum Timer werde ich morgen an der Schaltung
ausprobieren. Ich weiss, dass mein Programmierstil warscheinlich nicht
der Beste ist, ich brauch jedoch alsbald die Funktion.
Zu Deiner letzten Nachricht: Ich betreibe ein Kabel mit DS18S20 in
ca. 100m Tiefe und ein Messkabel mit 11 DS18S20 in jeweils 10m
Entfernung. Daher wollte ich die DS18S20 als 1wir-Bus betreiben.
Während das problemlos als Test funktionierte, konnten 100m nicht
mehr überbrückt werden - auch mit quarzgesteuerten Mega8 nicht!
Mir blieb daher nichts übrig, als pro Messsonde noch einen Attiny mit
einzubauen und die Signale der DS18S20 zwischenzuspeichern und
langsam mit einem selbstgestrickten Protokoll nach oben zu schieben.
Diese AtinYs, welche die Signale der DS18S20 aufnehmen laufen
OHNE Quarz! Da alle Byte übertrage und erst in der Hauptschaltung
einen Prüfsummencheck durchführe, weiss ich, dass die Daten nicht
nur korrekt übertragen, sondern von den freilaufenden Atinys auch
korrekt erfasst werden. Das Problem mit der UART beim Freilaufen
kenne ich jedoch auch. VG Micha
einem Messpunkt

Richard
19.12.2010, 06:32
Zu Deiner letzten Nachricht: Ich betreibe ein Kabel mit DS18S20 in
ca. 100m Tiefe und ein Messkabel mit 11 DS18S20 in jeweils 10m
Entfernung. Daher wollte ich die DS18S20 als 1wir-Bus betreiben.
Während das problemlos als Test funktionierte, konnten 100m nicht
mehr überbrückt werden - auch mit quarzgesteuerten Mega8 nicht!


OK, Ich habe einmal gelesen das man mittels Kabel einen Kapazitiven Füllstands Sensor bauen kann weil Wasser ein anderes Dielektrikum als Luft hat. Das könnte natürlich dazu führen das der Sensor die Kabelkapazität nicht mehr sauber treiben kann. Ob da ein abgeschirmtes Kabel hilft?

Gruß Richard

Richard
19.12.2010, 07:19
Das Problem mit der UART beim Freilaufen
kenne ich jedoch auch. VG Micha
einem Messpunkt

Habe gerade in einem anderen Thread etwas gefunden was Dir helfen könnte!

Schaue Dir einmal in der Bascom Hilfe den
$TIMEOUT Befehl an. :-)

Gruß Richard

hardware.bas
19.12.2010, 09:17
Hallo, Richard,
bin noch nicht zu meiner Schaltung gekommen, da ich noch
Schneeschippen muss.
Den Test mit dem Kabel habe ich übrigens im Trockenen gemacht
und es ist 4 adrige-Datenleitung mit Schirm.
VG Micha

hardware.bas
20.12.2010, 14:23
Nun zum Stand der Dinge; obwohl ich mich jetzt durch diesen Problem-
lösungsversuch etwas tiefer mit den Timerm beschäftigt habe, Timer1
ist hierbei interessant, ist es leider keine Lösung.
ERSTENS: Der Timer1 liess sich problemlos starten, teilen und voreinstellen,
auch der Überlaufinterrupt funktioniert, auch ist eine Unteroutine zuordbar.
ZWEITENS: Das Problem ist, ich kann mit einer Unterroutine nichts
anfangen, da das Programm immer wieder an die Stelle springt, aus der
ich eigentlich mit dem Interrupt wegkommen will. Statt Goto ..... will
der Compiler immer Return haben. Was ich brauche, ist folgendes.
Die Interruptunteroutine muss mit GOTO+Ziel verlassen werden können
und alle in der "alten", also durch die Timerfunktion verlassene For/Next-
Schleifen müssen ignoriert werden. Wie schon erwähnt, wenn der
Aufhänger im Fehlerfall auftritt, befindet sich das Programm in einer
Gosub-Routine, welche aus GOTO und For/Next-Schleifen besteht.
Der Timerinterrupt (der funktioniert auch) muss den Programmablauf
dort herausbringen, auch aus o.g. Schleifen, da nicht nur durch
Ausbleiben von Daten, sondern auch von Datenteilen Aufhänger
passieren. VG Micha

hardware.bas
20.12.2010, 15:36
PROBLEM GELOESST! OHNE INTERRUPT!
- Starten und Rücksetzen des TIMER1
- In der Abfrageschleife eine IF TIMER < Wert Then Goto Anfang
- Rücksetzen und Ausschalten des TIMER1
Funktioniert... mit guten bewährten Befehlen aus der HC-Ära.
Vielen Dank und viele Grüsse. Micha