Forum: Mikrocontroller und Digitale Elektronik Schaltverzögerung von 200mSekunden


von Ricco (Gast)


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

von Fernando Heitor (Gast)


Lesenswert?

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

von Ricco (Gast)


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.

von Fernando Heitor (Gast)


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

von Oryx (Gast)


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

von Ricco (Gast)


Lesenswert?

merci viel mal an euch alle für eure Antworten, sie haben mir sehr 
geholfen.

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.