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
volatileuint_16WaitTime;
2
3
ISR(....)
4
{
5
if(WaitTime>0)
6
WaitTime--;
7
}
8
9
10
uint8_tCheckUART()
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
returnFALSE;
35
36
// Es wurde zwar ein Zeichen empfangen, aber war das auch korrekt?