Forum: Mikrocontroller und Digitale Elektronik Atmega8, CTC-Modus,Timer-Reload


von Benulba (Gast)


Lesenswert?

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.

von Hubert G. (hubertg)


Lesenswert?

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.

von Benulba (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Benulba (Gast)


Lesenswert?

Klar, aber ich meine den Absturz der Software.

Hat denn jemand eine Idee zum eigentlichen Problem?

von Hubert G. (hubertg)


Lesenswert?

Du müsstest zusätzlich jeden Schritt im EEPROM speichern und bei einem 
Neustart auslesen.

von Peter D. (peda)


Lesenswert?

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

von Krapao (Gast)


Lesenswert?

> 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...

von Benulba (Gast)


Lesenswert?

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.

von Benulba (Gast)


Lesenswert?

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?

von Krapao (Gast)


Lesenswert?

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.

von Benulba (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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.

von Benulba (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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

von Benulba (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Benulba (Gast)


Lesenswert?

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