Zitat von SET800
Hallo,
6ms wäre doch schon mal ein Wort.
Hast Du den wesentlichen Teil meiner Antwort nicht gelesen?
Ich bin wirklich gerne bereit auch längere Hilfestellungen zum Thema für Einsteiger zu geben. Wenn es aber schon damit anfängt, daß Du Deinen ganz offensichtlichen Denkfehler lieber fortsetzen willst, anstatt auf meine/unsere Antworten einzugehen, dann erscheint auch mir das für uns beide nicht hilfreich.
Programmieren ist halt nicht nur eine Programmiersprache erlernen. Bei C wäre das denkbar einfach, hat diese doch gerade mal eine Hand voll an Schlüsselworten, die man halt mal einfach geschickt kombinieren müßte. Aber die "Kunst" des Programmierens ist es eben, Abläufe der Natur in die erst einmal immer nur lineare Programmausführung zu übertragen. Und da kommt man dann nach ganz kurzer Einarbeitung in eine Programmiersprache direkt in die sogenannten "Design Patterns." Diese beschreiben eine Vielzahl der immer wiederkehrenden Programmierprobleme und die typischen Lösungen dafür und das unabhängig von einer konkreten Programmiersprache.
Nehmen wir mal völlig theoretisch an, Du willst einige dutzend Sensoren einlesen. Das ist ja nicht schwer, solange das Programm schnell genug reagiert, OK. Und was passiert dann? Es soll doch in Abhängig von einem Jetzt-Zustand eine Folge von zeitlich gestreckten Folge-Zuständen gewechselt werden. Nehmen wir nur mal an, Du willst eine Weiche schalten mit einem Magnetantrieb. Dann wäre ja festzuhalten, in welcher Stellung die Weiche jetzt ist, welche Zustände Nachbarweichen haben, ob es weitere Belegungen durch andere Fahrzeuge gibt usw. Und dann willst Du erst einmal den Kanal anwählen, auf dem dann in einem weiteren Schritt Strom fließen kann, der in einem weiteren Schritt wieder abzuschalten ist usw. All das aber nicht einfach per C-Befehl nacheinander, denn das ginge alles so schnell, daß da nicht einmal ein Strom fließen würde, weil die Induktivität des Antriebs da faktisch ein sehr hochohmiger Widerstand wäre.
Nee, alles in einer großen Schleife mit hunderten von "Zustandsvariablen" ist niemals eine Lösung für ein reales Programmierproblem. Zudem wären schon die durch Verzweigungen im Programmablauf entstehenden Laufzeitunterschiede in einem trivialen Programm nicht mehr sinnvoll handhabbar.
So schön unsere Bastelwelt dank AVR und ARM basierten Arduinos geworden ist und so toll man auch einen Raspberry mal eben als komplette Anlagensteuerung nutzen kann, umso weniger sind die Aufgaben, die man damit erledigen kann einfacher geworden. Ob man nun eine Kiste Relais und Schalter verdrahtet oder per C-Programm das gleiche auf einem uC realisiert, ist eigentlich egal. Es muß einfach ein tragfähiges Konzept dahinter stecken, soll das ganze nicht in einen riesigen Krampf münden. Und Deine Idee von einem Programm ist der Anfang eines solchen! Glaub es uns bitte vorher Es schont einfach Deine Zeit und Deine Kosten!
Und nun nochmal was zu Ausführungszeiten:
Das Problem bei uC Anwendungen ist nicht, daß diese zu langsam wären, sondern das sie viel zu schnell sind! Mit einem Interrupt an einem Pin bist Du innerhalb von 3 Zyklen in Deiner Ausführungsroutine ( Interrupthändler ). Aber was heißt das wirklich? Das bedeutet, daß jeder kleine elektrische Drecksimpuls einen Interrupt auslöst und Dir einen Zustand vorgaukelt, der ggf. real gar nicht da ist. Jetzt kannst Du elektronisch Filtern, z.B. RC Ketten davor hängen. Die müssen aber schon mal alle wesentlichen auf der Moba existierenden Störungen unterdrücken. Und glaub mir, da geht dank der hohen Ströme wegen der kleinen Spannungen erheblich mehr ab, als in einem Schaltschrank eines Industrieroboters! Und mit diesen Filtern bist Du nun weit jenseits der programmtechnisch möglichen Detektionszeiten. In der Praxis macht man nun beides: Man zieht die Signale auf mindestens 3 Taktzyklen und den Rest macht man dann per Mehrfach-Messung in Software. Und noch ein Hinweis speziell zum AVR: Der Pegel am Pin muß mindestens für 2 Zyklen stabil angelegen haben, sonst erscheint der Interrupt nicht immer, da intern im uC die Pegel auch gesampelt werden. Es ist kein echter Flankeninterrupt, sondern ein Vergleicher. Das ist für sehr schnelle Signale wesentlich, je nachdem was Du nun so vorhast. Dazu einfach mal ins Datenblatt schauen.
Gruß
Klaus