Forum: Mikrocontroller und Digitale Elektronik 60s timer für reset


von Spice (Gast)


Lesenswert?

Hallo lieben Mitglieder,

ich würde mich gern erkundigen, ob mir jemand helfen kann, bezüglich 
einer kleinen timerschaltung, der mir nach 60s automatisch einen reset 
des mega8 ermöglicht. Ich habe nun einiges über die interenen counter 
des mega8s gelesen, allerdings zählen die nur einige sekungen hoch. Mein 
mega muss mit 3.6Mhz takten. Wie könnte man das bewerkstelligen, dass 
ein timer nach einer minute den resetpin auf masse zieht. Gibts dafür 
bestimmte ICs ???
würde mich sehr freuen, wenn mir jemand eine kleine hilfestellung geben 
könnte.

MFG Simon

von gast (Gast)


Lesenswert?

NE555 am Reset Pin.

von Latissimo (Gast)


Lesenswert?

Die zählen nur einige Sekunden hoch?

Das ist abhängig von der Taktung! D.h. ob sie intern oder extern ist, 
wie groß sie ist und ob du einen pre- bwz postscaler benutzt. Die 
meisten Timer bestitzen zumindest einen Prescaler.

Dieser Prescaler ist durch bestimmte bits im entsprechenden Register 
einzusellen.


zb. FOSC = 1HMZ dann ist jede us ein Takt

mit prescaler von 2 ist nur jede 0,5us ein Takt

usw....


so kannst du zb. beim overflow eines timers einen interrupt generieren.

in dem Datasheet von dem Mikrocontroller stehen die timer mit den dazu 
gehörigen Registern.

von Daniel W. (danie)


Lesenswert?

du kannst dir das dann ja auch noch softwaretechnisch runterteilen (eine 
static-variable in der interrupt-routine mitzählen)

vielleicht ist auch der Watchdog eine lösung für dein problem...

HTH, grüße danie

von Matthias Kölling (Gast)


Lesenswert?

Wie wärs mit dem Watchdog?
Auszug aus dem Datenblatt:

WDP2 WDP1 WDP0 Number of WDT Oscillator Cycles
1     1    0    1,024K (1,048,576)

Typical Time-out at VCC = 3.0V   1.1 s

Typical Time-out at VCC = 5.0V   1.0 s


Gruß Matthias

von STK500-Besitzer (Gast)


Lesenswert?

Vielleicht mache ich mich mal wieder unbeliebt, aber wozu braucht man 
ein Reset nach 60 Sekunden bei einem Mikrocontroller?
Das kommt mir so vor, als hätte sich da jemand was hinprogrammiert, was 
nicht ganz stabil läuft, und bevor man nach der Ursache sucht, wird 
lieber eine ominöse Reset-Beschaltung gesucht.
Der Mega8 besitzt einen Watchdog-Timer, den man natürlich jederzeit im 
Programm starten kann (bzw. immer wieder zurücksetzen muß).
Den - in Zusammenarbeit mit einem Timer - kann man dafür wunderbar 
benutzen.

von Spice (Gast)


Lesenswert?

Vielen Dank für die Antworten...

Ich werde es mal mit dem NE555 versuchen, weil mir die internen counter 
einfach zu schnell überlaufen. Über den Watchdog habe ich auch einiges 
gelesen, allerdings scheint das für mein anwendungsfall nicht unbedingt 
eine gute lösung zu sein.

@STK500-Besitzer: Hast du mal kurz in deine Glaskugel geschaut?!

Mein Problem ist konkret, dass ich in bestimmten funktionen prüfen muss, 
ob noch eine uartverbindung besteht. wenn diese nicht mehr besteht, 
brauche ich ein Reset, bzw das programm sollte aus der Funktion 
rausspringen und wieder zurück zum hauptprogramm wechseln. Wie könnte 
ich das eleganter lösen?
Ich würde jetzt so spontan den NE555 jeweils in den Funktionen 
anschmeissen und bis 60s zählen lassen. Wenn die 60s erreicht sind, soll 
der NE555 den resetpin auf low ziehen. Ist das so machbar oder gibts es 
da einen besseren Vorschlag.


Vielen Dank für eure Hilfe
Gruss Simon

von Karl H. (kbuchegg)


Lesenswert?

Spice wrote:
> Mein Problem ist konkret, dass ich in bestimmten funktionen prüfen muss,
> ob noch eine uartverbindung besteht. wenn diese nicht mehr besteht,
> brauche ich ein Reset, bzw das programm sollte aus der Funktion
> rausspringen und wieder zurück zum hauptprogramm wechseln. Wie könnte
> ich das eleganter lösen?

Sicher nicht dadurch, dass du einen Prozessorreset auslöst.
Das ist doch die Holzhammermethode.

Timer aufsetzen und 60 Sekunden abzählen lassen.
In der Funktion regelmässig überprüfen ob die 60 Sekunden
abgelaufen sind und wenn ja einen Return machen.

> Ich würde jetzt so spontan den NE555 jeweils in den Funktionen
> anschmeissen und bis 60s zählen lassen. Wenn die 60s erreicht sind, soll
> der NE555 den resetpin auf low ziehen.

Das ist doch ganz großer Unsinn.

von Spice (Gast)


Lesenswert?

Danke für die Antwort...

Was meinst du mit Timer aufsetzen??? den internen timer oder ein 
NE555???
So in der Art hatte ich mir das auch vorgestellt, allerdings noch nix in 
der hinsicht programmiert oder getestet. Aber anstatt den 
Holzhammer-Reset ein Sprung in main sollte nicht das problem sein, wenn 
der timer abgelaufen ist.

Danke und lieben gruß
Simon

von Matthias Kölling (Gast)


Lesenswert?

Was hältst Du davon, die Überläufe der internen Timer zu zählen? Tu 
einfach eine Variable z.B. alle 10ms hochzählen, das kann man auch 
beliebig verschachteln. Bei Empfang eines Zeichens wird der Counter 
resettet. Im Hauptprogramm wird geprüft, ob der Timeout schon erreicht 
ist.
Wo ist das Problem?

Gruß Matthias

von Karl H. (kbuchegg)


Lesenswert?

Spice wrote:
> Danke für die Antwort...
>
> Was meinst du mit Timer aufsetzen??? den internen timer oder ein
> NE555???

Den internen selbstverständlich.

> So in der Art hatte ich mir das auch vorgestellt, allerdings noch nix in
> der hinsicht programmiert oder getestet.

Dann wirds Zeit.
Timer konfigurieren, dass er zb. alle 1 Sekunde oder 0.5 Sekunden
einen Overflow-Interrupt auslöst. 60 Sekunden sind daher dann
vergangen, wenn der Overflow Interrupt 60 mal (oder 120 mal)
ausgelöst wurde. Der Overflow ISR braucht daher in einer Variablen
nur bis 60 (oder 120) zählen, oder von 60 auf 0 und die Warteschleife,
die auf Antwort wartet, überprüft naben der UART ständig auch noch
ob der Zähler seinen Endwert erreicht hat.
Fertig.

(*) Ob das jetzt 60 oder 120 oder sonst eine Zahl ist, hängt
davon ab wie schnell du den Timer laufen lassen kannst. Das
wiederrum hängt von der Taktfrequenz und dem Vorteiler des
Timers ab. Wenn dein Timer alle 25 ms einen Interrupt auslöst,
dann musst du halt 1000 / 25 = 40 Interrupts auslösen, bis 1
Sekunde rum ist und daher 40 * 60 = 2400 Interrupts bis 1 Minute
rum ist.

> Aber anstatt den
> Holzhammer-Reset ein Sprung in main sollte nicht das problem sein, wenn
> der timer abgelaufen ist.

Nicht ein Sprung nach main().
Die Funktion die testet, ob die Verbindung noch steht, returned
spätestens nach 60 Sekunden.

Wie wird denn die Funktion arbeiten? Ich schätze mal sie wird
ein bestimmtes Zeichen losschicken und dann auf Antwort warten.
Trifft die Antwort ein, dann steht die Verbindung noch und die
Funktion liefert zb. true zurück.
Trifft innerhalb von 60 Sekunden keine Antwort ein, dann wird die
Verbindung als beendet erklärt und die Funktion returniert zb. false.

Pseudocode
1
volatile uint_16 WaitTime;
2
3
ISR( .... )
4
{
5
  if( WaitTime > 0 )
6
    WaitTime--;
7
}
8
9
10
uint8_t CheckUART()
11
{
12
   // Timer konfigurieren
13
   //   * Overflow Interrupt erlauben
14
   //   * Overflow kommt zb alle 25 ms
15
   // daher müssen 2400 ISR Aufrufe für 60 Sekunden auflaufen
16
   WaitTime = 2400
17
18
   ....  // Hier die eigentliche Konfiguration
19
20
21
   // Zeichen an Gegenstelle senden
22
   ....
23
24
   // und auf Antwort warten. Aber nur solange der Timer nicht
25
   // abgelaufen ist!
26
   while( ! ( Zeichen_empfangen && WaitTime > 0 ) )
27
     ;
28
29
   // Timer wieder ausschalten
30
   ....
31
32
   // Ist die Wartezeit abgelaufen? -> Verbindung steht nicht mehr
33
   if( WaitTime == 0 )
34
     return FALSE;
35
36
   // Es wurde zwar ein Zeichen empfangen, aber war das auch korrekt?
37
   if( Zeichen != Expected Zeichen )
38
     return FALSE;
39
40
   // andernfalls steht die Verbindung noch
41
   return TRUE;
42
}

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.