Schaltverzögerung von 200mSekunden

Gast #29281
Lesenswert?

Habe mal eine kleine Frage an euch, wie kann ich eine Anweisung 
programmieren wenn ich eine maximale Schaltverzögerung von 200 mSekunde 
habe und bei manchen Zeilen bis zu vier Sekunden warte. Kennt Ihr ein 
Beispiel oder ein Befehl.
PIC: 16f873
Programmiersprache: C
Gast #29283
Lesenswert?

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

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

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren