Schaltverzögerung von 200mSekunden

Gast #29282
Hallo

Es kommt darauf welchen Compiler du verwendest .

Meistens kannst du eine Verzögerung mit den Befehlen
delay_ms(),delay_us()erreichen.

Diese Befehle sind Sonderfunktionen von manchen Compilern.
Ansonsten kannst du sowas selber machen, mit einer Schleife und ein paar 
NOPs.


MFG
Fernando
Gast #29283
Ja diesen Befehl kenne ich, jedoch ist mein Problem das ich in dieser 
Zeit nicht heraus springen kann.

Wenn ich ein delay von vier Sekunden habe, wie habe ich dann die 
Möglichkeit innert 200mSekunden in eine andere Zeile zu springen.

Es ist nämlich so. In Normalfall sollte das Programm eine Zeile nach der 
anderen ausführen, jedoch fällt ein System aus, sollte das Programm 
innert 200mSekunden zu einer anderen Zeile springen. Jedoch unter C, 
habe ich keine Ahnung wie ich dieses Problem sauber löse. Ich kann ja 
nicht alle 200mSekunden überprüfen ob der Specialfall eingetroffen ist, 
es würde Einfach das ganze sprengen, zu langer und unübersichtlicher 
Quellcode geben. Ansonsten würde ich es mit for lösen "for(i=0,i<20,i++) 
delay_ms(200);". Darum hoffe ich jemand hat eine saubere Lösung.
Gast #29284
Problem ungefähr verstanden.
Was ich nicht verstehe ist, was meinst du mit System ??
Meinst du damit externe Peripherie ?

Was ist wenn du vielleicht mit Interrupts arbeitest.
Zum Beispiel RB4-RB7 konntest du dann 4 ´"Hardware-Syteme" überwachen.

Oder benutze ein Timer( wenn der frei ist), und löst alle 200 ms ein 
Interrupt aus , und in der Interruptroutine kannst du dein System 
überprüfen.


MFG
Fernando
Gast #29285
Hi,
wenn ich die Sache richtig verstanden habe, führt kein Weg an einem 
Timerinterrupt vorbei.
Das mit den delays ist nicht gut, da Deine gesamte Rechnerzeit verbraten 
wird. Interrupts verlängern Deine Laufzeiten ins unkalkulierbare.

Konzept:

timer_interrupt_alle_10_msec(void)
{ // Interruptroutine, so kurz wie möglich
  timer_10_ms += 10;
}

void main(void)
{
  for (;;)
  {
    interrupt_sperren();
    timer += timer_10ms;
  // Den von der Interruptroutine zu ändernden Wert nur
  // einmalig auslesen

    timer_10ms = 0;
      // und wieder auf 0 setzen
    interrupt_freigeben();

    // Ab hier kanst Du mit dem Wert von timer machen, was Du
    // willst, nur abfragen if (timer == irgendwas) ist ganz
    // schlecht
    if (timer > 200)
    {
      aktion_bei_200ms();
    }
    if (timer > 4000)
    {
      aktion_bei_4_sec();
      timer = 0;
    }
  }
}


Oryx

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.