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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.