Forum: Mikrocontroller und Digitale Elektronik AtMega325P - timeout realsieren


von gf63 (Gast)


Lesenswert?

Hallo Zusammen

Ich hätte gern mal eine Meinung zu folgender Aufgabestellung gehört.

Ich brauche eine Funktion, die ein ext. IC abfragt und, falls keine 
Antwort kommt, nach 10ms timeout einen Fehlercode zurückliefern. Mir 
gehts im folgenden um die Realisierung des timeouts.

Für den timeout hätte ich am liebsten einen timer, der auf Kommando 
startet, bis zu nem bestimmten Wert läuft und danach anhält. Ich frage 
in meiner funktion zyklisch ab ob mein IC antwortet oder ob der 
Timerendwert erreicht ist (= timeout).

Leider kann ich diese Funktionalität im Datenblatt zum AtMage325P nicht 
finden. Entweder weil das nicht geht, oder ich hab es schlicht 
übersehen.

Alternativ müsste ich wohl zyklisch interrupts erlauben und daraus die 
abgelaufene Zeit ermitteln.

Habe ich was übersehen?

von Peter D. (peda)


Lesenswert?

gf63 schrieb:
> bis zu nem bestimmten Wert läuft und danach anhält.

Warum muß er unbedingt anhalten?
Es reicht völlig die Information, daß der Wert erreicht wurde.
Und dazu gibt es die Compare- und Überlauf-Flags.
Du mußt Dir nur nen Timer aussuchen (T0, T1 oder T2).


Peter

von gf63 (Gast)


Lesenswert?

>Es reicht völlig die Information, daß der Wert erreicht wurde.

O.K.
Ich muss aber beim Eintreten in meine Funktion den Timer zurücksetzten, 
damit meine Zeit passt, oder?

von gf63 (Gast)


Lesenswert?

Kann mir evtl. auf die Sprünge helfen?
Ich komm nicht recht weiter mit meinem timer.

Ich habe nun folgendes versucht:

Schnipsel ...
1
// Timer1 initialisieren
2
3
TCCR1B = (1<<CS12)| (1<<CS10);    // Vorteiler:1024
4
OCR1A = 195;    // 20MHz / 1024 = 51.2us; 10ms / 51.2us = 195!!
5
6
7
// später im code den timer abfragen ... 
8
// Zum Test eine Port setzten und wieder löschen
9
10
...
11
12
TCNT1  = 0;          // Timer counter zurücksetzen;
13
TIFR1 |= (1<<OCF1A);  // output compare flag löschen
14
15
TESTPIN_ON;
16
while((TIFR1 & (1<<OCF1A)) == 0);
17
TESTPIN_OFF;
18
19
usw...

Mit "TESTPIN_ON" "TESTPIN_OFF" messe ich am Oszi wie lange die while 
Schleife durchlaufen wird. Ich hätte jetzt 10ms erwartet, tatsächlich 
sind es aber 150ns.

Hab ich bei der initialisierung was vergessen, oder stimmt die Abfrage 
OCF1A nicht?

von Turbotoni (Gast)


Lesenswert?

Es mus ein Timer compare Interrupt ausgelöst werden und in der ISR wird 
der Tim-Out der Funktion realisiert

von mitleser (Gast)


Lesenswert?

Es geht jetzt. Ich hab nur viel zu kompliziert gedacht ...
Die Lösung ist, einfach den Timer am Anfang zurücksetzen und dann direkt 
das Timerregister abfragen...
1
// Timer1 initialisieren
2
#define TIMEOUT      195   // 20MHz / 1024 = 51.2us; 10ms / 51.2us = 195!!
3
4
5
TCCR1B = (1<<CS12)| (1<<CS10);    // Vorteiler:1024
6
7
8
// später im code den timer abfragen ... 
9
// Zum Test eine Port setzten und wieder löschen
10
11
...
12
13
TCNT1  = 0;          // Timer counter zurücksetzen;
14
15
TESTPIN_ON;
16
while(TCNT1 << TIMEOUT);
17
TESTPIN_OFF;
18
19
usw...

thats all ;-)

P.S.
OCF1A lässt sich komischerweise nicht direkt abfragen!?

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.