Forum: Mikrocontroller und Digitale Elektronik while schleife <= 1050ms


von µC-Fan (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ µ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.

von µC-Fan (Gast)


Lesenswert?

@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

von Falk B. (falk)


Lesenswert?

@  µ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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ Karl heinz Buchegger (kbuchegg) (Moderator)

>und (besonders schön :-) if(Betrag<0){Betrag = Betrag *(-1);}

Mathematisch korrekt!

;-)
Falk

von µC-Fan (Gast)


Lesenswert?

@Falk

Vielen Dank. werde gleich probieren
1
do
2
{ 
3
SampleWert(); 
4
Betrag = sample.Wert1-sample.Wert2;
5
if(Betrag<0) Betrag = -Betrag;
6
delay_ms(1);
7
}
8
while((Betrag<=0xC0)&&(settimeout++<=1050));

Gruss
µC-Fan

von Matthias L. (Gast)


Lesenswert?

>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.

von ARM-Fan (Gast)


Lesenswert?

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.

von µC-Fan (Gast)


Lesenswert?

@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)

von ARM-Fan (Gast)


Lesenswert?

>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.

von µC-Fan (Gast)


Lesenswert?

@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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.