Forum: Mikrocontroller und Digitale Elektronik genauer Code im Anhang


von student (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist der Code:
1
[...]
2
u32 startTime = 0;
3
  u8 scanMode = 0;
4
  while (1)//scannen
5
  {
6
    if (ledCounter%10000 == 0)
7
    {
8
      clearOutputPin(led1);//led an
9
    }
10
    if (ledCounter%10000 == 899)
11
    {
12
      setOutputPin(led1);//led aus
13
    }
14
15
    if (scanMode == 0)
16
    {
17
      setAsOutputPin(srf05);
18
      setOutputPin(srf05);
19
      startTime = ledCounter;
20
      scanMode = 1;
21
    }
22
    else if (scanMode == 1)
23
    {
24
      if (ledCounter >= startTime + 1)
25
      {
26
        clearOutputPin(srf05);
27
        setAsInputPin(srf05);
28
        startTime = ledCounter;
29
        scanMode = 2;
30
      }
31
    }
32
    else if (scanMode == 2)
33
    {
34
      if (getInputPin(srf05))
35
      {
36
        startTime = ledCounter;
37
        scanMode = 3;
38
      }
39
    }
40
    else if (scanMode == 3)
41
    {
42
      if (!getInputPin(srf05))
43
      {
44
        scanTime = ledCounter - startTime;
45
        breakStatus = 1;
46
      }
47
      if (ledCounter >= startTime + 300)
48
      {
49
        scanTime = 300;
50
        breakStatus = 1;
51
      }
52
    }
53
54
    _delay_us(100);
55
    ledCounter++;
56
    if (scanTime != 0)//abbruch sobald scan fertig
57
    {
58
      breakStatus = 1;
59
    }
60
    if (breakStatus)
61
    {
62
      breakStatus = 0;
63
      ledCounter = 0;
64
      startTime = 0;
65
      scanMode = 0;
66
      //break;
67
    }
68
  }
69
[...]

von Mystifizierer (Gast)


Lesenswert?

Sehr schön.

von anderer student (Gast)


Lesenswert?

Wo ist die Frage?

von Krapao (Gast)


Lesenswert?

Unn?

von student (Gast)


Lesenswert?

Sorry, das sollte eine Antwort auf www.mikrocontroller.net/topic/253981 
sein.
Der srf05 liefert bei der ersten Messung ein Korrektes Ergebnis, bei der 
2. Messung hängt er...

von Krapao (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

if (scanTime != 0)//abbruch sobald scan fertig
    {
      breakStatus = 1;
    }
    if (breakStatus)
    {
      breakStatus = 0;
      ledCounter = 0;
      startTime = 0;
      scanMode = 0;
      //break;
    }


scanTime wird (zumindest in diesem Ausschnitt) nicht wieder auf 0 
gesetzt. Damit wird ständig in weitere Folge die 'Initialisierung' 
durchlaufen und das ganze Werkl beginnt nicht mehr zu laufen.

Persönlich denke ich, dass du zu viele Flag-Variablen (noch dazu mit 
schlecht gewählten Namen) verwendest und dadurch den Überblick verloren 
hast, welche Variable wie stehen muss damit was passiert. In diese Falle 
manövrieren sich alle irgendwann mal. Abhilfe: rigoros ausmisten.

breakStatus und die Abfrage auf scanTime brauchst du doch in 
Wirklichkeit  gar nicht.

>    _delay_us(100);
Schade. Bis zu dieser Zeile las sich das alles gar nicht so schlecht.

von student (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> scanTime wird (zumindest in diesem Ausschnitt) nicht wieder auf 0
> gesetzt. Damit wird ständig in weitere Folge die 'Initialisierung'
> durchlaufen und das ganze Werkl beginnt nicht mehr zu laufen.

Ja, das ist gewollt, um unendlich viele Testergebnisse zu bekommen (zu 
Testzwecken). Das Problem ist, dass im 2. Schleifendurchlauf nur der 
HighPegek als Ausgangsimpuls gesetzt wird, aber nicht mehr auf low geht.

Karl Heinz Buchegger schrieb:
> Persönlich denke ich, dass du zu viele Flag-Variablen (noch dazu mit
> schlecht gewählten Namen)

Ja, mag sein. Überblick habe ich aber eigentlich nicht verloren.

Karl Heinz Buchegger schrieb:
>>    _delay_us(100);
> Schade. Bis zu dieser Zeile las sich das alles gar nicht so schlecht.

Inwieweit ist es ab da schlecht?

von Karl H. (kbuchegg)


Lesenswert?

student schrieb:


>>>    _delay_us(100);
>> Schade. Bis zu dieser Zeile las sich das alles gar nicht so schlecht.
>
> Inwieweit ist es ab da schlecht?

Weil du genaue Timingsachen nicht mit einem _delay erreichen kannst. In 
den Zeiten, die du misst ist dann immer auch die Durchlaufzeit durch den 
Code in der Schleife enthalten. Timingsachen macht man mit einem Timer. 
Dazu ist er da.

von student (Gast)


Lesenswert?

Ok. Merkt man dann um so mehr, je kleiner die Wartezeiten sind
Dann schreib ich mir noch eine time.c mit Funktionen wie
getTime() und setTime(u32)
die ich dann über timerinterrupts manipuliere.

Ist alle 10us die Variable manipulieren zu viel?
Ich meine ich will nicht 99% der CPU-Zeit für die Uhr verschwenden...
Dann würde er glaub ich ~160 Instruktionen abarbeiten, während er ein 
mal die Zeit manipuliert. (16MHz)

von Peter D. (peda)


Lesenswert?

student schrieb:
> Ist alle 10us die Variable manipulieren zu viel?
> Ich meine ich will nicht 99% der CPU-Zeit für die Uhr verschwenden...
> Dann würde er glaub ich ~160 Instruktionen abarbeiten, während er ein
> mal die Zeit manipuliert. (16MHz)

Der AVR ist ein RISC, d.h. alles braucht viele Zyklen (Load, Operation, 
Store).
Ein Interrupthandler <50 ist sportlich, 100 ist kurz, 160 ist noch lange 
nicht viel.

Alle 160 Zyklen einen Interrupt muß man sich daher sehr gut überlegen. 
Andere Interrupts und das Main wollen ja auch ein kleines bischen 
CPU-Zeit haben.


Peter

von student (Gast)


Lesenswert?

Danke für die Info!
Für mich ist jedoch auch wichtig, dass ich das Signal des srf05 
möglichst genau messe.
Jede Millisekunde ein Interrupt ist absolute Pflicht!
Und 100µs wäre wünschenswert, 10µs ziemlich genial.

von Peter D. (peda)


Lesenswert?

student schrieb:
> Für mich ist jedoch auch wichtig, dass ich das Signal des srf05
> möglichst genau messe.

Dazu ist das Input-Capture gedacht. Dann spielen Interruptlatenz und 
Ausführungszyklen keinerlei Rolle mehr.


Peter

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.