mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AtMega325P - timeout realsieren


Autor: gf63 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gf63 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: gf63 (Gast)
Datum:

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

Ich habe nun folgendes versucht:

Schnipsel ...
// Timer1 initialisieren

TCCR1B = (1<<CS12)| (1<<CS10);    // Vorteiler:1024
OCR1A = 195;    // 20MHz / 1024 = 51.2us; 10ms / 51.2us = 195!!


// später im code den timer abfragen ... 
// Zum Test eine Port setzten und wieder löschen

...

TCNT1  = 0;          // Timer counter zurücksetzen;
TIFR1 |= (1<<OCF1A);  // output compare flag löschen

TESTPIN_ON;
while((TIFR1 & (1<<OCF1A)) == 0);
TESTPIN_OFF;

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?

Autor: Turbotoni (Gast)
Datum:

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

Autor: mitleser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...
// Timer1 initialisieren
#define TIMEOUT      195   // 20MHz / 1024 = 51.2us; 10ms / 51.2us = 195!!


TCCR1B = (1<<CS12)| (1<<CS10);    // Vorteiler:1024


// später im code den timer abfragen ... 
// Zum Test eine Port setzten und wieder löschen

...

TCNT1  = 0;          // Timer counter zurücksetzen;

TESTPIN_ON;
while(TCNT1 << TIMEOUT);
TESTPIN_OFF;

usw...


thats all ;-)

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.