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?
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
>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?
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?
Es mus ein Timer compare Interrupt ausgelöst werden und in der ISR wird der Tim-Out der Funktion realisiert
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.