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