www.mikrocontroller.net

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


Autor: µC-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: µC-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
Betrag=0;
settimeout=0;
do
{
  SampleWert();
  Betrag = sample.Wert1-sample.Wert2;
  if(Betrag<0)
    Betrag = -Betrag;
  _delay_ms(10);
  settimeout++;
}
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger (kbuchegg) (Moderator)

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

Mathematisch korrekt!

;-)
Falk

Autor: µC-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk

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

Gruss
µC-Fan

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: µC-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: µC-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.