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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.