Hallo Community, ich stehe im Augenblick vor einem Problem bei dem ich nicht weiterkomme. Ich benutze den Atmega8 im AVR-Studio 5. Die Initialisierung des Timers klappt soweit, auch die entsprechende LEDs werden "erleuchtet". Jetzt will ich allerdings einen einmaligen Impuls an den Pins OC1A/B und OC2 erzeugen. Die Ansteuerung der LEDs soll hardwarebasiert geschehen, sodass das Signal, sobald der Timer gestartet wurde in jedem Fall die Output Compare Pins auf High setzt, auch wenn der Controller abstürzen sollte. Sollte dies geschehen, ist mir auch klar, dass man die Timer dann nicht reloaden kann. Nun möchte ich, dass dieses High-Signal nur eine bestimmte Zeitdauer ansteht (zw. 10ms und 100ms). Dazu muss ich den Timer wieder reloaden, und zwar mit dem Wert, der dann den 10ms-100ms entspricht. Damit wir uns nicht falsch verstehen...dieses Signal muss nur (nach Tastendruck) ein einziges Mal auftreten. Die Schwierigkeit dabei ist, dass alles OC-Pins zu unterschiedlichen Zeiten das High Signal an die LED geben. Bsp. OC1B: nach 100ms High Pegel, diesen für 10ms-100ms halten dann low OC1A: nach 500ms High Pegel, diesen für 10ms-100ms halten dann low OC2: nach 15ms High Pegel, diesen für 10ms-100ms halten dann low Ich hoffe, ihr habt zahlreiche Ideen.
Ob es sinnvoll ist das OC-Feature zu nutzen bezweifle ich etwas. Mein Vorschlag wäre Timer im CTC starten, in der ISR einen Pin setzen, CTC-Wert neu eingeben, in der ISR Pin rücksetzen, Timer deaktivieren.
Danke für deine Antwort. Der uController ist für eine kritische Anwendung, in der das Signal in jedem Fall kommen muss, zumindest das letzte. Dies entspricht einem Ausschaltbefehl an einen Leistungsschalter.
Na ja, eine Garantie, daß das Signal kommt, ist das nicht. Je nachdem, was du unter "abstürzen" verstehst, ist da nach dem Absturz nichts bis überhaupt nichts mehr garantiert. Oliver
Klar, aber ich meine den Absturz der Software. Hat denn jemand eine Idee zum eigentlichen Problem?
Du müsstest zusätzlich jeden Schritt im EEPROM speichern und bei einem Neustart auslesen.
Benulba schrieb: > OC1B: nach 100ms High Pegel, diesen für 10ms-100ms halten dann low > OC1A: nach 500ms High Pegel, diesen für 10ms-100ms halten dann low > > OC2: nach 15ms High Pegel, diesen für 10ms-100ms halten dann low Das sind so extrem lange Zeiten, die kann man auch mit einfachen Delays machen. Das Output-Compare braucht man nur, wenns auf µs genau sein muß. Peter
> Klar, aber ich meine den Absturz der Software.
In dieser Form (µC muss per Timer HIGH bereitstellen) unmöglich. Der
Timer wird immer per Software initialisiert und wenn du der Software
nicht mehr traust, kannst du dich auch nicht darauf verlassen, dass du
die erwünschte Ausgabe bekommst.
Du kannst dir aber das Prinzip eines Watchdogs ansehen. Eine externe
Schaltung stellt ein HIGH bereit, aber der µC hindert die externe
Schaltung daran - so lange der µC ordnungsgemäß läuft. Sollte die
Software/Hardware des µC unzuverlässig werden, dann hat die externe
Hardware freie Bahn und schaltet das Sicherheitsfeature.
Milchmädchen-Beispiel:
UND Gatter aus externem Pullup und Pin µC mit externem Pull-Up. Der µC
muss den Pin aktiv low halten, damit am Ausgang des Gatters ein LOW
ansteht. Fällt der µC in den RESET (Watchdog, Brownout) fehlt der LOW
Pegel und am Gatter kommt ein HIGH raus.
Das Zeitverhalten kann man eventuell mit einem externen Timer-IC
realisieren.
Die nächste Herausforderung ist dann, wie die Sicherheitsabschaltung
funktioniert, wenn Vcc an der Logikplatine ausfällt... ein HIGH
Abschaltesignal ist da eine etwas unglückliche Wahl...
Die Erst-Initialisierung (später auch) per Software ist kein Problem. Mir geht es wirklich einzig darum, dass das letzte Signal in jedem Fall kommen muss. Sollte es bereits vorher zu einem Softwarfehler kommen, ist das noch nicht kritisch. Erst nach Start des Timers MUSS der letzte High Pegel kommen. Aus dem High-Pegel einen kurzen Impuls zu machen, ist dabei nicht von aller höchster Bedeutung. Dies kann dann also auch per Software geschehen, wenn diese hardwarebasiert nicht machbar ist. Ich hoffe, das hilft euch weiter. p.s. Zeitkritisch ist die Anwendung ebenfalls.
Ich hatte folgende Idee: Beim Compare Match werden die OCF-Flags im TIFR-Register gesetzt. Diese werden per Software abgefragt, der Timer anschließend resetet, mit neuen Verlgeichswerten belegt und die OC-Pins über die COM-bits wieder auf Low gesetzt. Könnte ich denn nicht auch den Timer einfach reseten, nachdem die LEDs leuchten und dann mit einem erneuten Timerstart mit neuen Vergleichswerten(10ms-100ms) die OC-Pins wieder auf LOW ziehen?
Ich dachte, du willst, dass das sicherheitsrelevante HIGH auch käme, wenn sich die Software (der µC) verlaufen hat. Per Software Flags vergleichen, per Software Timer resetten, per Software neue Vergleichswerte laden, per Software Timer neu starten - ist da nicht der Bringer! Selbst ein bereits gestarteter Timer fürs Hardware-Pintoggle ohne ISR kann ausfallen, wenn der µC in den Reset gezwungen wird oder z.B. ein amoklaufender Stack (Software) genau die kritischen SFRs überschreibt.
Richtig, der Bringer... Per Software NEUE Verlgeichswerte laden, die die OC-Pins wieder auf LOW ziehen. Und sollte sich dabei der uC verlaufen, bleibt eben das High Signal des ersten, hardwarebasierten, und wichtigen OC-Matches dauerhaft anliegen. Bitte spar dir solche Kommentare, ohne meinen Beitrag genau gelesen zu haben.
Moin Moin, wie wärs wenn du eine Art Taskplaner aufbaust dafür brauchst du nur einen Timer** und fragst auf die Zeiten ab ob Xms_1, Xms_2, Xms_+n usw erreicht sind. Im entsprechenden Unterprogramm setzte/löschte den entsprechenden Pin und stellst eine neue Zeitberechnung*** auf wann der Pinx wieder gesetzt/gelöscht werden soll. ** kann z.B. im CTC gemacht werden und die OCRx Pins nicht aktivieren du nutzt nur die ISR für den ms-Zähler das neuladen entfällt ***wird im Hauptprgramm geladen und wieder verglichen bis sie erreicht wird.
Hallo Chris, danke für deinen Beitrag. Über softwarebasierte Lösung habe ich bereits auch viel nachgedacht. Es wäre an sich möglich die ersten beiden Signale auf diese Weise zu erzeugen. Das Letzte hingegen ist sicherheitsrelevant und MUSS in jedem Fall kommen, deshalb strebe ich eine Lösung auf Hardwarebasis an. Der Grund warum ich vorher alles mit der Programmierung abhandeln könnte ist folgender: Sollte sich der Controller "verlaufen" noch bevor die ersten beiden Signale gekommen sind, muss auch das letzte nicht kommen. Wird jedoch das erste Rechecktsignal erzeugt, SOLLTE das Zweite kommen. Wird das Zweite, zusätzlich zum Ersten erzeugt, MUSS das Dritte kommen. Das ist alles etwas verzwickt, deshalb kann ich auch per Software das letzte Signal wieder auf Low ziehen. Es ist zum Großteil wichtig, dass es überhaupt kommt. War das verständlich.
In welcher Umgebung wird denn die Schaltung überhaupt eingesetzt ? > Der Grund warum ich vorher alles mit der Programmierung abhandeln könnte > ist folgender: Sollte sich der Controller "verlaufen" noch bevor die > ersten beiden Signale gekommen sind, muss auch das letzte nicht kommen. Warum sollte der sich verlaufen, was schwirrt dir da im Kopf umher und was muss der Controller noch abarbeiten zur Erzeugung der 3-Signale ??
Die Schaltung wird in einer Prüfumgebung eingesetzt. Dort kann es durch nebenstehende Prüfungen, vor allem durch Umrichter, zu Einkopplungen kommen. Der Mikrocontroller hat nicht sonderlich viele Aufgaben. Taster abfragen --> Nulldurchgangserkennung --> Timer (muss über externe Tastatur verstellbar sein) --> Signale ausgeben.
Benulba schrieb: > Sollte sich der Controller "verlaufen" noch bevor die > ersten beiden Signale gekommen sind, muss auch das letzte nicht kommen. Ein Controller verläuft sich nicht. Wenn doch, dann ist Dein Programm falsch. Wenn Du EMV-Probleme hast, dann ist Deine Schaltung oder Dein Layout falsch. Die VCC muß sauber sein, sonst geht garnichts. Und die Eingänge/Ausgänge kann man über Optokoppler schützen. Peter
Mein Idee ist jetzt folgende: OCF-Flags im Register TIFR auslesen, da diese ja bei einem Compare Match gesetzt werden. Dadurch die Timer neustarten und mit neuen Verlgeichswerten belegen, die eben die OC-Pins über veränderte COM-Bits wieder löschen.
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.