Zitat von hardware.bas
Die Daten einfach in einer IRQ abholen, siehe..
http://www.rowalt.de/mc/avr/avrboard/06/avrb06.htm
Gruß Richard
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
Zitat von hardware.bas
Die Daten einfach in einer IRQ abholen, siehe..
http://www.rowalt.de/mc/avr/avrboard/06/avrb06.htm
Gruß Richard
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
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).Zitat von hardware.bas
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
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
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.
Zitat von hardware.bas
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
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...Zitat von hardware.bas
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
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!Zitat von hardware.bas
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
Lesezeichen