mikrocontroller.net

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


Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NE555 am Reset Pin.

Autor: Latissimo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel W. (danie)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
volatile uint_16 WaitTime;

ISR( .... )
{
  if( WaitTime > 0 )
    WaitTime--;
}


uint8_t CheckUART()
{
   // Timer konfigurieren
   //   * Overflow Interrupt erlauben
   //   * Overflow kommt zb alle 25 ms
   // daher müssen 2400 ISR Aufrufe für 60 Sekunden auflaufen
   WaitTime = 2400

   ....  // Hier die eigentliche Konfiguration


   // Zeichen an Gegenstelle senden
   ....

   // und auf Antwort warten. Aber nur solange der Timer nicht
   // abgelaufen ist!
   while( ! ( Zeichen_empfangen && WaitTime > 0 ) )
     ;

   // Timer wieder ausschalten
   ....

   // Ist die Wartezeit abgelaufen? -> Verbindung steht nicht mehr
   if( WaitTime == 0 )
     return FALSE;

   // Es wurde zwar ein Zeichen empfangen, aber war das auch korrekt?
   if( Zeichen != Expected Zeichen )
     return FALSE;

   // andernfalls steht die Verbindung noch
   return TRUE;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.