Forum: Mikrocontroller und Digitale Elektronik Arduino/C code Problem


von Franz (Gast)


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

von Marc S. (marc_s86)


Lesenswert?

Du gibst 10 Sekunden lang aus...

von Sina A. (sinapse)


Lesenswert?

hmmm... er gibt nur jeweils einmal aus

wie generierst du dein high-low signal? taster?

von Franz (Gast)


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.

von Franz (Gast)


Lesenswert?

Nein, das ist ein ChipSelect Signal von einem SPI Bus. Der Code ist also 
richtig? Dann muss es ja an dem SPI Master liegen

von Sina A. (sinapse)


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

: Bearbeitet durch User
von Franz (Gast)


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

von Sina A. (sinapse)


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
}

von Franz (Gast)


Lesenswert?

Auch das hat das gleiche Ergebnis gebracht.

Ich warte auf mein Oszi und schau mir das Signal mal an.

von chris_ (Gast)


Lesenswert?

In der neueren Arduino IDE gibt es eine graphische Anzeige

Werkzeuge=>Serieller Plotter

Dort kannst Du mit diesem Programm den Arduino als "pseudo Oszi" bis ca. 
9kHz Sample Rate benutzen:

https://github.com/ChrisMicro/freiBot/tree/master/ARDUINO_fastAdcSample

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.