Hallo Gemeinde,
ich möchte gern eine While-Schleife programmieren, das maximal 1050 ms
andauert, danach soll die While schliefe beendet werden.
Ich habe es einigermaßen realisiert, aber die dafür notwendige zeit
(settimeout) gefällt mir nicht ganz.
CODE:
...
do
{
SampleWert();
Betrag = sample.Wert1-sample.Wert2;
if(Betrag<0){Betrag = Betrag *(-1);}
}
while((Betrag<=0xC0)&&(settimeout++<=15000));
...
Hindergrund:
Während dieser While-Schleife soll es zwei Analoge Werte 1050ms lang mit
der Funktion SampleWert(); eingelesen werden, wenn der |Betrag| nicht
einen bestimmten wert hat, dann soll die While schleife beendet werden.
Bin für einige Vorschläge sehr dankbar
Gruss
µC-Fan
@ µC-Fan (Gast)
>Während dieser While-Schleife soll es zwei Analoge Werte 1050ms lang mit>der Funktion SampleWert(); eingelesen werden, wenn der |Betrag| nicht>einen bestimmten wert hat, dann soll die While schleife beendet werden.>Bin für einige Vorschläge sehr dankbar
Wo ist nun dein Problem? Das mit delays zu machen ist zwar nciht schön,
aber naja, geht schon. Einfach in jede Schleife ein _dealy_ms(10) rein
und über ein Zähler die Anzhal der Durchläufe zählen. Thats it.
MfG
Falk
P.S. Ich gehe davon aus, dass du einen AVR mit WIN-AVR programmierst.
@Falk
Mein Problem ist, das einlesen soll maximal 1050 ms dauern. Wenn in
dieser Zeit der Betrag auch nicht stimmt, soll es aus der While-Schleife
raus. Wenn der Betrag stimmt, soll es schon vorher raus.
Die Zeit ist sehr wichtig, weil ich mit RTX-51 Tiny arbeite..
Ich arbeite mit KEIL und verwende einen 8051er
@ µC-Fan (Gast)
>Mein Problem ist, das einlesen soll maximal 1050 ms dauern. Wenn in>dieser Zeit der Betrag auch nicht stimmt, soll es aus der While-Schleife>raus. Wenn der Betrag stimmt, soll es schon vorher raus.
Ja und? Das ist doch nun Weiss Gott einfach, du hast es doch fast
dastehen.
1
Betrag=0;
2
settimeout=0;
3
do
4
{
5
SampleWert();
6
Betrag=sample.Wert1-sample.Wert2;
7
if(Betrag<0)
8
Betrag=-Betrag;
9
_delay_ms(10);
10
settimeout++;
11
}
12
while((Betrag<=0xC0)&&(settimeout<=1500));
Du musst halt nur sehen, a) wie lange SampleWert() in etwa dauert und
wie du eine kleine Verzögerung realsieren kannst. Hat der Compiler
sicher schon was Fertiges dafür.
MfG
Falk
Falk Brunner wrote:
> @ µC-Fan (Gast)>>>Während dieser While-Schleife soll es zwei Analoge Werte 1050ms lang mit>>der Funktion SampleWert(); eingelesen werden, wenn der |Betrag| nicht>>einen bestimmten wert hat, dann soll die While schleife beendet werden.>>>Bin für einige Vorschläge sehr dankbar>> Wo ist nun dein Problem? Das mit delays zu machen ist zwar nciht schön,> aber naja, geht schon. Einfach in jede Schleife ein _dealy_ms(10) rein> und über ein Zähler die Anzhal der Durchläufe zählen. Thats it.
Könnte man so machen.
Ich denke allerdings, dass in dem Fall eine Lösung über einen
Timer tatsächlich die einfachere Lösung ist.
Grund: Das sind Berechnungen in dieser Schleife, von denen kein
Mensch weiß wie lange sie wirklich dauern.
SampleWert()
und (besonders schön :-) if(Betrag<0){Betrag = Betrag *(-1);}
Insbesonders durch letzteres hast du kein konstanten Durchlaufzeiten,
sodass ein Timer, der die Zeit runterzählt und nach Ablauf von
1050 ms eine globale Variable auf 1 setzt, einfacher sein dürfte.
volatile uint16_t WaitTime;
volatile uint8_t Waiting;
....
Waiting = 0;
WaitTime = 1050;
StartTimer();
do {
SampleWert();
if( Betrag < 0 )
Betrag = -Betrag;
} while ( Betrag < 0xC0 && Waiting == 0 );
StopTimer();
und der Timer hat dann noch die Aufgabe nach Ablauf der Wartezeit
die Variable Waiting auf 1 zu setzen.
Da ich mal davon ausgehe, dass dei 1050ms nich unbedingt auf die
letzte Nanosekunde einzuhalten sind, sollte das mit geschickt
gewählteM Vorteiler und entsprechender Overflow Auswertung auch
kein allzugrosses Problem sein.
>ein Problem ist, das einlesen soll maximal 1050 ms dauern. Wenn in>dieser Zeit der Betrag auch nicht stimmt, soll es aus der While-Schleife>raus. Wenn der Betrag stimmt, soll es schon vorher raus.
Das klingt nach einer sauberen Schrittkette. ALs Transition würde ich
eine (selbstgeschaffene) Systemzeit verwenden.
Wenn du schon mit dem RTX51 arbeitest, dann benutze doch wenigstens
"os_wait" zum warten und kein blockierendes Delay. So kommen in der Zeit
wenigstens andere Tasks dran.
@ARM-Fan
Danke für den Tip, aber das Programm ist ein bisschen komplexer als
diese While-Schleife.
Während dieser While-Schleife darf ein anderes Task nicht dran kommen.
der Tip von Falk war schon gut, danke trotzdem ;-)
wie gesagt, das problem war ja die Zeit (1050ms)
>Während dieser While-Schleife darf ein anderes Task nicht dran kommen.
Naja, aber bis zu 1s lang das RTOS aufhängen is auch nich die feine Art.
Wenn andere Tasks von diesen Daten hier abhängig sind, dann
müssen die Prozesse eben synchronisiert werden. Dafür gibts ja nun
Mutexe, Semaphoren, etc.
@ARM-Fan
Mutexe, Semaphoren sagen mir zur Zeit wenig, aber ich werde mich damit
beschäftigen.
Vielleicht hast du eine gute Quelle/Link, wo ich nähere Informationen
darüber bekommen kann?