AtMega325P - timeout realsieren

Gast #2053650
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?
Gast #2059744
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?
Gast #2061877
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!?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren