Arduino/C code Problem

Gast #4406728
Lesenswert?
• ▲
▼
Hi,

ich versuche gerade die Zeit rauszubekommen die zwischen 2x Pin "LOW" 
vergeht


Folgender code:
1
void setup() {
2
  Serial.begin(9600);
3
  pinMode(5,INPUT);
4
 }
5

6
int start,i;
7

8
void loop() {
9
  i=0;
10
  while(!digitalRead(5) ){
11
      if(i==0){
12
      Serial.println(millis()-start);
13
      start = millis();
14
      }
15
      i = 1;  
16
  }
17
}


Die Ausgabe ist folgende (auszugsweise) ich versteh es null, also es 
sollten 10sek sein, aber das hauptproblem ist auch das ich unmengen von 
Daten bekomme alle circa 10sek Blockweise, was stimmt an meinem Code 
nicht:
1
2744
2
1
3
0
4
1
5
0
6
2
7
5
8
10
9
2
10
0
11
0
12
2
13
1
14
4
15
11
16
2
17
0
18
1
19
1
20
10
21
12
22
16
23
0
24
0
25
1
26
0
27
0
28
1
29
0
30
0
31
7
32
1
33
0
34
0
35
1
36
0
37
0
38
0
39
1
40
9895
41
1
42
0
43
0
44
0
45
2
46
0
47
5
48
9
49
1
50
0
51
1
52
2
53
0
54
6
55
10
56
2
57
0
58
1
59
1
60
10
61
12
62
15
63
1
64
0
65
0
66
1
67
0
68
0
69
1
70
0
71
7
72
0
73
1
74
0
75
0
76
0
77
1
78
0
79
0
80
1
81
9895
82
1
83
0
84
0
85
2
86
1
87
4
88
10
89
3
90
0
91
2
92
1
93
0
94
4
95
9
96
2
97
0
98
0
99
1
100
11
101
12
102
14
103
0
104
0
105
0
106
0
107
1
108
0
109
0
110
0
111
8
112
0
113
0
114
1
115
0
116
0
117
0
118
1
119
0
120
9896
121
1
122
0
123
2
124
0
125
4
126
11
127
2
128
2
129
1
130
0
131
0
132
3
133
10
134
2
135
1
136
1
137
10
138
13
139
65551
140
65536
141
65536
142
65536
143
65536
144
65543
145
65536
146
65536
147
65536
148
65536
149
65536
150
75431
Gast #4406735
Lesenswert?
• ▲
▼
Marc S. schrieb:
> Du gibst 10 Sekunden lang aus...

Nein, tue ich nicht! Ich kriege innerhalb von millisekunden einen ganzen 
Block Werte und dann circa 10 Sekunden nicht!

Ich seh meinen Fehler nicht, wenn er so offensichtlich ist, korrigier 
ihn doch bitte, ich wäre dir sehr dankbar.
#4406742
Lesenswert?
• ▲
▼
vorweg... ich keine ahnung von arduino. das problem ist, dass ich nicht 
weiss wie der arduino von innen aufgebaut ist... daher kann ich nur gut 
spekulieren ;)

ja... der code sollte so funzen, auch wenn er nicht wirklich schön ist 
und aufpoliert werden kann

falls du das glueck hast einen oszi in der naehe zu haben wuerde ich als 
erstes gucken ob das chipselect signal sauber ist

falls es daran nicht liegt, wuerd ich versuchen ohne die while bremse im 
loop auszukommen... vielleicht wirkt sich das auf hintergrundprozesse 
aus? somit funzt millis net mehr?

wie gesagt... ist intelligentes raten meinerseits ;)

lg
Gast #4406747
Lesenswert?
• ▲
▼
Sina A. schrieb:
> vorweg... ich keine ahnung von arduino. das problem ist, dass ich
> nicht
> weiss wie der arduino von innen aufgebaut ist... daher kann ich nur gut
> spekulieren ;)
>
> ja... der code sollte so funzen, auch wenn er nicht wirklich schön ist
> und aufpoliert werden kann
>
> falls du das glueck hast einen oszi in der naehe zu haben wuerde ich als
> erstes gucken ob das chipselect signal sauber ist
>
> falls es das nicht ist, wuerd ich versuchen ohne die while bremse im
> loop auszukommen... vielleicht wirkt sich das auf hintergrundprozesse
> aus? somit funzt millis net mehr?
>
> wie gesagt... ist intelligentes raten meinerseits ;)
>
> lg

Code huebsch gemacht
1
unsigned long start,i;
2

3
void setup() {
4
  Serial.begin(115200);
5
  DDRD &= ~(1<<DDD5);
6
  start = 0;
7
 }
8

9
void loop() {
10
  while( !(PIND & (1<<PD5)) ){}
11
  start = millis();
12
  while( (PIND & (1<<PD5)) ){}
13
  Serial.println(millis()-start);
14
}

Gleiches ergebnis. Also wird es am ChipSelect Signal liegen. 
Witzigerweise laufen an dem Bus schon drei Geräte, die das Signal 
scheinbar nicht stört, nur der Mikrocontroller nimmt es wahr.

An das Oszi komme ich erst nächste Woche, aber damit ist dann wohl der 
Fehler klar, wenngleich ich noch nicht weiß wie ich den behebe
#4406752
Lesenswert?
• ▲
▼
dachte eher so an
1
unsigned long start,i;
2
bool newPeriod;
3

4
void setup() {
5
  Serial.begin(115200);
6
  pinMode(5,INPUT);
7
  start = 0;
8
  newPeriod = true;
9
 }
10

11
void loop() {
12

13
  if(!digitalRead(5) && newPeriod){
14
    Serial.println(millis()-start);
15
    start = millis();
16
    newPeriod = false;
17
  }
18

19
  if(digitalRead(5)){
20
    newPeriod=true;
21
  }
22

23
}

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