Hallo ich habe einen Interrupt der ein laufendes Programm unterbrechen soll, eine Funktion aufrufen soll und danach wieder ganz normal im Programmcode weiter gehen soll. Funktioniert auch alles soweit. Jetzt soll als optische Ausgabe beim Auslösen des Interrupts auch noch eine LED 3x blinken. Da komme ich nicht weiter: -delay und millis funktionieren im Interrupt nicht -timer nutz auch einen Interrupt zur Unterbrechung, was auch nicht zielführend war. Hat jemand eine Idee womit ich eine einfache kurze Pause zwischen dem wechseln des Status der LED realisieren kann? MfG
Michael L. schrieb: > Jetzt soll als optische Ausgabe beim Auslösen des Interrupts auch noch > eine LED 3x blinken. In der ISR ein Flag setzen und die LED in der Loop blinken lassen.
@ Michael L. (strompaedagoge) >Hat jemand eine Idee womit ich eine einfache kurze Pause zwischen dem >wechseln des Status der LED realisieren kann? Mit einer Statemachine
Delay oder ähnliches sollte in einer ISR schon noch funktionieren, ist aber problematisch. Normal sollte eine ISR nicht so lange dauern, dass man da sichtbares Blinken von LEDs hinbekommt. Möglich wäre es ggf. in der ISR einen Timer zu starten, so dass der dann per PWM das Blinken erzeugt. Eine Timer ISR könnte den Blinker dann Abstellen, wenn er fertig ist. Der erste Interrupts ist dann aber in der Regel fertig bevor die LED das erste mal aus geht.
>Jetzt soll als optische Ausgabe beim Auslösen des Interrupts auch noch >eine LED 3x blinken. Ich würde die LED schlicht in der ISR für einen oder sehr wenige Taktzyklen ein- und dann wieder ausschalten. Nicht geizen mit dem LED-Strom - dann kann man ihr Aufblitzen mit dem Auge problemlos wahrnehmen (sofern nicht gerade das volle Licht der Frühherbstsonne drauffällt).
Wenn es tatsächlich gewünscht ist, dass der Controller während der LED-Blinkerei "tot" ist, dann kannst du auch einfach eine Variable in einer Schleife hoch zählen und damit einen "delay" erzeugen. Nicht gerade elegant, aber sehr simpel und wenn der Controller in der Zeit eh nichts Anderes zu tun hat, dann kannst ihn auch einfach zählen lassen. Also: LED an Zählschleife LED aus Zählschleife LED an usw...
Michael L. schrieb: > -delay und millis funktionieren im Interrupt nicht > -timer nutz auch einen Interrupt zur Unterbrechung, was auch nicht > zielführend war. Wenn das alles nicht geht, geht der Rest auch nicht.
Michael L. schrieb: > Hat jemand eine Idee womit ich eine einfache kurze Pause zwischen dem > wechseln des Status der LED realisieren kann? Ordentlichen Programmierstil angewöhnen. Die einzig sinnvollen Vorschläge: Max M. schrieb: > In der ISR ein Flag setzen und die LED in der Loop blinken lassen. Falk B. schrieb: > Mit einer Statemachine Eine ISR sollte so kurz wie möglich sein und nur das allernotwendigste eledigen. Darin irgendwelche Verzögerungen einzubauen, ist geradezu widersinnig.
Michael L. schrieb: > Jetzt soll als optische Ausgabe beim Auslösen des Interrupts auch noch > eine LED 3x blinken. > > Da komme ich nicht weiter: > > -delay und millis funktionieren im Interrupt nicht > -timer nutz auch einen Interrupt zur Unterbrechung, was auch nicht > zielführend war. Und hier noch eine puristische Lösung für Sparfüchse: Eine Variable Typ Byte - in ASM wahlweise ein Register oder RAM-Zelle - wird beim ersten "Auslösen" mit 0x01 geladen. Im Timer-IRQ zählt man diese hoch. Bit 5 wird als Blinksignal an einem Port ausgegeben. Bit 6 und 7 zählen die Anzahl Blinkies hoch. Läuft die Variable über (255->0) wird das Blinken deaktiviert.
Lurchi schrieb: > Delay oder ähnliches sollte in einer ISR schon noch funktionieren, ist > aber problematisch Ich entnehme der Frage, dass Arduino gemeint ist. Und da tuts delay() und millis() eben NICHT in einer ISR. (zumindest nicht ohne besondere Vorkehrungen) Denn sie benötigen selber die Timer0 ISR für ihre Funktion.
Guten Morgen, Ja es ist der Arduino gemeint. Mir ist da noch eine Idee gekommen. Leider happert es etwas an der Umsätzung. Ich setzte einfach wärend des Interrups eine Variable b auf 1. In der Loop schleiße frage ich diese einfach ab und wenn der Wert 1 ist startet die Funktion blinken. Funktioniert auch, aber nur einmal. Setze ich die Variable b wieder auf 0 danach, blinkt die LED nicht mehr sondern wird nur von dem Interrupt an oder aus geschaltet, je nach vorherigem Zustand. Warum ist das so?
Michael L. schrieb: > Warum ist das so? Hmm.... Wahrscheinlich hast du einen endlichen Automaten gebaut, oder willst einen bauen, aber hast noch Probleme mit den Zustandsübergängen. Hilfreich: 1. Zustände klar benennen. 2. Übergänge eindeutig definieren.
Michael L. schrieb: > Mir ist da noch eine Idee gekommen. Leider happert es etwas an der > Umsätzung. Deine Idee taugt auch nichts. Was willst du? Du willst dreimal Blinken mit einem Takt von 500ms. Halbe Sekunde ein, halbe Sekunde aus. Was brauchst du dafür? Irgendwas, was dir eine halbe Sekunde macht. Was hast du? Deine Millis. Ein Zähler, der jede Millisekunde um 1 erhöht wird. Reicht das? Ja. Wie macht man aus den Millis eine halbe Sekunde? Weißt du, was ein Modulo ist? Das ist der Rest einer ganzzahligen Division. 7/2 = 3, Rest 1 643/500 = 1, Rest 143 1000/500 = 2 Rest 0 1500/500 = 3 Rest 0 Wann sind immer 500(ms) um? Genau, wenn der Rest 0 ist. Du willst 3 Mal blinken. Genau genommen ist das 6 Mal. 3 Mal ein, 3 Mal aus. Du setzt eine Variable 'blink' in deiner ISR also auf 6. In der Loop fragst du die Millis ab, ob der Rest gerade 0 ist und solange deine Variable nicht 0 ist, wird geblinkt.
1 | if(blink != 0) |
2 | {
|
3 | if((Millis % 500) == 0) |
4 | {
|
5 | TOGGLE_LED; |
6 | blink = blink - 1; |
7 | }
|
8 | }
|
Kannst es auch c-typisch so schreiben:
1 | if(blink) |
2 | {
|
3 | if(!(Millis % 500)) |
4 | {
|
5 | TOGGLE_LED; |
6 | blink--; |
7 | }
|
8 | }
|
Hat beim ersten Blinken noch einen kleinen Schönheitsfehler, aber das stört erstmal keinen großen Geist. Edit: Zweimal auf der Tastatur von % nach & gewurstet.
:
Bearbeitet durch User
Hmm... Ich habe da ein Beispiel für Taster und blinken in der Schublade, befürchte aber, dass das gnadenlos Oversized ist. Und für den Anfang auch schwer zu verstehen...... Aber was solls..... Siehe Anhang ..... (auch wenn ich mich damit gnadenlos blamiere) Im Vordergrund steht bei dem Beispiel nicht die effiziente Tasterabfrage, sondern Nebenläufigkeit, bzw. kooperatives Multitasking. Und eine einfache Form der Schrittkette/Ablaufsteuereung.
Thomas E. schrieb: > In der Loop fragst du die Millis ab, ob der Rest gerade 0 ist und > solange deine Variable nicht 0 ist, wird geblinkt. Du mußt natürlich sicherstellen, daß Millis vor jeder erneuten Abfrage auch weitergezählt wurde. Sonst macht der Controller das Blinken locker in derselben Millisekunde und du siehst gar nichts. Damit bist du dann in einer getakteten Schleife. Die braucht man aber sowieso für alles mögliche. Z.B.
1 | unsigned long MillisLast = 0; |
2 | Loop
|
3 | {
|
4 | if(Millis != MillisLast) |
5 | {
|
6 | MillisLast = Millis; |
7 | |
8 | //Hier kommt der Blinker hin
|
9 | }
|
10 | }
|
Da gibt es noch diverse andere Möglichkeiten. Dies sei mal eine davon.
Michael L. schrieb: > Mir ist da noch eine Idee gekommen. Leider happert es etwas an der > Umsätzung. > > Ich setzte einfach wärend des Interrups eine Variable b auf 1. In der > Loop schleiße frage ich diese einfach ab und wenn der Wert 1 ist startet > die Funktion blinken Wenn du mal die ERSTE ANTWORT auf deine Frage gelesen hättest.... Max M. schrieb: > In der ISR ein Flag setzen und die LED in der Loop blinken lassen.
1 | // Example of driving a stepper motor using
|
2 | // an Adruino and the AccelStepper library
|
3 | // via the a4899 stepper motor controller
|
4 | |
5 | |
6 | #include <AccelStepper.h> |
7 | #include <stdint.h> |
8 | |
9 | //---------------------------------------------------------------------------------------------
|
10 | |
11 | //Einstellungen anpassen
|
12 | float Quellspannung = 5.0; |
13 | |
14 | |
15 | // Versuchsaufbau
|
16 | // _ -> vorwärts
|
17 | // M| \\\\\\\\Schlitten\\\\\
|
18 | // -
|
19 | //Endschalter Endschalter
|
20 | //links Pin D2 rechts Pin D3
|
21 | //
|
22 | //Drehung rechts -> vorwärts
|
23 | //Drehung links -> rückwärts
|
24 | |
25 | //---------------------------------------------------------------------------------------------
|
26 | |
27 | // Pin Belegung Schrittmotor
|
28 | const uint8_t stepPin = 10; |
29 | const uint8_t dirPin = 11; |
30 | const uint8_t disablePin = 13; |
31 | const int buttonPin1 = 4; |
32 | const int buttonPin2 = 5; |
33 | const int buttonPin3 = 6; |
34 | const int led1Pin = 8; |
35 | const int led2Pin = 9; |
36 | |
37 | // Pin Belegung Spannungsteiler
|
38 | int AnalogPin1 = A1; |
39 | int AnalogPin2 = A2; |
40 | |
41 | //Variablen Spannungsteiler
|
42 | int R1 = 15000.0; |
43 | int R2 = 15000.0; //Wert des bekannten Widerstands |
44 | int R3 = 15000.0; |
45 | int R4 = 15000.0; //Wert des bekannten Widerstands |
46 | long Messwert1; |
47 | long Messwert2; |
48 | float SpannungU1; |
49 | float SpannungU2; //Spannung über dem zu messenden Widerstand |
50 | float SpannungU3; |
51 | float SpannungU4; //Spannung über dem zu messenden Widerstand |
52 | float SpannungLB; |
53 | float Widerstand; |
54 | float Widerstand2; |
55 | |
56 | //Variablen Taster
|
57 | int tasterRechts = 0; |
58 | int tasterLinks = 0; |
59 | int endschalterLinks = 0; |
60 | int endschalterRechts = 0; |
61 | int tasterVersuch = 0; |
62 | |
63 | // Entprellen Taster
|
64 | int reading; // Wert des Eingangs |
65 | int previous = LOW; // Vorheiger Wert des Eingangs |
66 | unsigned long time = 0; // letzter Zeitwert bei dem der Ausgangzustand wechselte. |
67 | unsigned long debounce = 500; // Entprellzeit |
68 | |
69 | //Variablen Led
|
70 | int b = 0; |
71 | int i = 0; |
72 | boolean value=LOW; // Startwert der LED |
73 | unsigned long previousMillis = 0; //speichert wieviele Sekunden seit der letzten Veränderung vergangen ist |
74 | unsigned long interval = 100; //Intervallänge |
75 | |
76 | //---------------------------------------------------------------------------------------------
|
77 | |
78 | // stepper motor Functionen
|
79 | void forwardstep() { |
80 | digitalWrite(dirPin, HIGH); |
81 | digitalWrite(stepPin, LOW); |
82 | delayMicroseconds(1); |
83 | digitalWrite(stepPin, HIGH); |
84 | }
|
85 | |
86 | void backwardstep() { |
87 | digitalWrite(dirPin, LOW); |
88 | digitalWrite(stepPin, LOW); |
89 | delayMicroseconds(1); |
90 | digitalWrite(stepPin, HIGH); |
91 | }
|
92 | |
93 | // setting up the AccelStepper library with custom actuator functions
|
94 | AccelStepper stepper(forwardstep, backwardstep); // use functions to step |
95 | |
96 | |
97 | void drehunglinks(){ |
98 | backwardstep(); |
99 | Serial.println("Drehung Links rueckwaerts"); |
100 | }
|
101 | |
102 | void drehungrechts(){ |
103 | forwardstep(); |
104 | Serial.println("Drehung Rechts vorwaerts"); |
105 | }
|
106 | |
107 | void motorRueckrechts(){ |
108 | drehunglinks(); |
109 | drehunglinks(); |
110 | drehunglinks(); |
111 | drehunglinks(); |
112 | drehunglinks(); |
113 | drehunglinks(); |
114 | drehunglinks(); |
115 | drehunglinks(); |
116 | drehunglinks(); |
117 | drehunglinks(); |
118 | Serial.println("Endschalter rechts"); |
119 | b = 1; |
120 | }
|
121 | |
122 | void motorRuecklinks(){ |
123 | drehungrechts(); |
124 | drehungrechts(); |
125 | drehungrechts(); |
126 | drehungrechts(); |
127 | drehungrechts(); |
128 | drehungrechts(); |
129 | drehungrechts(); |
130 | drehungrechts(); |
131 | drehungrechts(); |
132 | drehungrechts(); |
133 | Serial.println("Endschalter links"); |
134 | b = 1; |
135 | }
|
136 | |
137 | |
138 | // Bewegungsprofil Lukas
|
139 | void bewegungsprofilA(){ |
140 | |
141 | stepper.setCurrentPosition(0); |
142 | stepper.runToNewPosition(-20); |
143 | stepper.runToNewPosition(20); |
144 | stepper.runToNewPosition(-20); |
145 | stepper.runToNewPosition(20); |
146 | stepper.runToNewPosition(-20); |
147 | stepper.runToNewPosition(20); |
148 | stepper.runToNewPosition(-20); |
149 | stepper.runToNewPosition(20); |
150 | stepper.runToNewPosition(-20); |
151 | stepper.runToNewPosition(20); |
152 | stepper.runToNewPosition(-20); |
153 | stepper.runToNewPosition(20); |
154 | stepper.runToNewPosition(-20); |
155 | stepper.runToNewPosition(20); |
156 | stepper.runToNewPosition(-240); |
157 | }
|
158 | |
159 | |
160 | // Auseinanderfahren bis Lichtbogenabriss, danach noch 5 Steps weiter
|
161 | void bewegungsprofilB(){ |
162 | |
163 | while (SpannungLB < Quellspannung) |
164 | {
|
165 | digitalWrite(led1Pin, HIGH); |
166 | drehunglinks(); |
167 | spannungsteiler(); |
168 | }
|
169 | digitalWrite(led1Pin, LOW); |
170 | drehunglinks(); |
171 | drehunglinks(); |
172 | drehunglinks(); |
173 | drehunglinks(); |
174 | drehunglinks(); |
175 | }
|
176 | |
177 | |
178 | // Auseinanderfahren auf 4mm
|
179 | void bewegungsprofilC(){ |
180 | |
181 | stepper.setCurrentPosition(0); |
182 | stepper.runToNewPosition(-400); |
183 | }
|
184 | |
185 | |
186 | // Spannungsberechnung des Lichtbogens über Spannungsteiler
|
187 | void spannungsteiler(){ |
188 | //5 Messungen machen und Mittelwert bilden
|
189 | Messwert1=0; |
190 | for(int i=0;i<5;i++){ |
191 | Messwert1+=analogRead(AnalogPin1); |
192 | }
|
193 | Messwert1 = trunc((Messwert1)*1/5); |
194 | |
195 | //5 Messungen machen und Mittelwert bilden
|
196 | Messwert2=0; |
197 | for(int i=0;i<5;i++){ |
198 | Messwert2+=analogRead(AnalogPin2); |
199 | }
|
200 | Messwert2 = trunc((Messwert2)*1/5); |
201 | |
202 | //Spannungen berechnen
|
203 | SpannungU2=(Quellspannung/1023.0)*Messwert1; |
204 | SpannungU1=(Quellspannung-SpannungU2); |
205 | SpannungU4 = (Quellspannung/1023.0)*Messwert2; |
206 | SpannungU3 = (SpannungU1*(SpannungU4/SpannungU2)); |
207 | SpannungLB = Quellspannung - SpannungU3 - SpannungU4; |
208 | |
209 | // Serial.print("Spannung ueber R1 betraegt ");
|
210 | // Serial.print(SpannungU1,2);
|
211 | // Serial.println(" Volt!");
|
212 | //
|
213 | // Serial.print("Spannung ueber R2 betraegt ");
|
214 | // Serial.print(SpannungU2,2);
|
215 | // Serial.println(" Volt!");
|
216 | //
|
217 | // Serial.print("Spannung ueber R3 betraegt ");
|
218 | // Serial.print(SpannungU3,2);
|
219 | // Serial.println(" Volt!");
|
220 | //
|
221 | // Serial.print("Spannung ueber R4 betraegt ");
|
222 | // Serial.print(SpannungU4,2);
|
223 | // Serial.println(" Volt!");
|
224 | |
225 | Serial.print("Spannung ueber Lichtbogen betraegt "); |
226 | Serial.print(SpannungLB,2); |
227 | Serial.println(" Volt!"); |
228 | Serial.println(); |
229 | Serial.println("-----------------------------------------"); |
230 | Serial.println(); |
231 | |
232 | // delay(1000);
|
233 | }
|
234 | |
235 | |
236 | // Led Blinken
|
237 | void blinken(){ |
238 | if (i<8){ |
239 | if(millis()-previousMillis > interval) |
240 | {
|
241 | previousMillis = millis();// aktueller Zeitspeicher |
242 | value = !value; // Zustand der LED ändern |
243 | digitalWrite(led1Pin,value); |
244 | i++; |
245 | }
|
246 | }
|
247 | }
|
248 | |
249 | |
250 | //---------------------------------------------------------------------------------------------
|
251 | |
252 | void setup() |
253 | {
|
254 | Serial.begin(9600); // configuration of gpio interface |
255 | |
256 | pinMode(stepPin, OUTPUT); |
257 | pinMode(dirPin, OUTPUT); |
258 | pinMode(disablePin, OUTPUT); |
259 | pinMode(led1Pin, OUTPUT); |
260 | pinMode(led2Pin, OUTPUT); |
261 | pinMode(buttonPin1, INPUT); |
262 | pinMode(buttonPin2, INPUT); |
263 | pinMode(buttonPin3, INPUT); |
264 | |
265 | digitalWrite(disablePin, HIGH); |
266 | |
267 | // ramp parameters
|
268 | stepper.setMaxSpeed(200); |
269 | stepper.setAcceleration(300); |
270 | |
271 | // Interups
|
272 | attachInterrupt(0, motorRuecklinks, RISING); //Pin D2 Endschalter Links |
273 | attachInterrupt(1, motorRueckrechts, RISING); //Pin D3 Endschalter Rechts |
274 | |
275 | |
276 | }
|
277 | |
278 | //---------------------------------------------------------------------------------------------
|
279 | |
280 | |
281 | void loop() |
282 | {
|
283 | tasterRechts = digitalRead(buttonPin1); |
284 | tasterLinks = digitalRead(buttonPin2); |
285 | tasterVersuch = digitalRead(buttonPin3); |
286 | |
287 | |
288 | |
289 | |
290 | // Beim Wechsel des Eingangs von LOW zu HIGH und nach der Entprellzeit:
|
291 | if (tasterRechts == HIGH && previous == LOW && millis() - time > debounce) { |
292 | time = millis(); |
293 | drehungrechts(); |
294 | // digitalWrite(led2Pin, HIGH);
|
295 | previous = reading; |
296 | while (previous == HIGH) |
297 | {
|
298 | drehungrechts(); |
299 | }
|
300 | // digitalWrite(led2Pin, LOW);
|
301 | }
|
302 | |
303 | |
304 | else if (tasterLinks == HIGH && previous == LOW && millis() - time > debounce) { |
305 | time = millis(); |
306 | drehunglinks(); |
307 | previous = reading; |
308 | while (previous == HIGH) |
309 | {
|
310 | drehunglinks(); |
311 | }
|
312 | // digitalWrite(led2Pin, LOW);
|
313 | }
|
314 | |
315 | else { if (tasterVersuch == HIGH && previous == LOW && millis() - time > debounce) { |
316 | time = millis(); |
317 | spannungsteiler(); |
318 | bewegungsprofilB(); |
319 | previous = reading; |
320 | }
|
321 | }
|
322 | |
323 | if (b == 1){ |
324 | blinken(); |
325 | // b = 0;
|
326 | }
|
327 | |
328 | |
329 | }
|
330 | |
331 | |
332 | |
333 | //---------------------------------------------------------------------------------------------
|
Eric B. schrieb: > Michael L. schrieb: >> Warum ist das so? > > Weil dein Code, den wir nicht kennen, einen Bug hat. So da isser.
:
Bearbeitet durch User
Ich fange mal an... Aber da ist so viel drin, dass mir fast schwindelig wird. Du hast da 2 Endlosschleifen drin... Und, wenn sie nicht endlos sind, dann sind sie sowieso überflüssig. HIGH und LOW sind nicht int, sondern bool. (auch wenn es hier wenig Unterschied macht.) b ist nicht volatile, das ist ein grober Fehler. Serial.print() und seine Brüder können deine ISR in den Deadlock zwingen. Auf jeden Fall würde ich das "entkoppeln". Damit meine ich z.B. das Debounce als einzelnen Teil auslagern. 3 Bedingungen in einer IF gelten bei mir schon als unlesbar/unübersichtlich.
@ Michael L. (strompaedagoge) >>> Michael L. schrieb: >>> Warum ist das so? >> >> Weil dein Code, den wir nicht kennen, einen Bug hat. >So da isser. Der gehört in den ANHANG!!
Michael L. schrieb: > void motorRueckrechts(){ > drehunglinks(); > ... > } > > void motorRuecklinks(){ > drehungrechts(); > ... > } >... > void setup() > { ... > // Interups > attachInterrupt(0, motorRuecklinks, RISING); //Pin D2 Endschalter > Links > attachInterrupt(1, motorRueckrechts, RISING); //Pin D3 Endschalter > Rechts > } Also, wenn der Motor ganz links angekommen ist, löst er einen Interrupt auf Pin D2 aus, dreht wie verrückt nach rechts, bis zum Anschlag rechts. Dann löst er da einen Interrupt auf Pin D3 aus, und dreht wie verrückt nach links, bis zum Anschlag. Dann löst er einen Interrupt auf Pin D2 aus, dreht wie verrückt nach rechts, usw. Oder braucht der mehr als 10 Drehungen um bis zum Anschlag zu kommen? EDIT: Irgendwas N-fach wiederholen macht man so:
1 | for(uint8_t i = 0; i < N; i++) |
2 | {
|
3 | irgendwas(); |
4 | }
|
z.B.
1 | void motorRuecklinks() |
2 | {
|
3 | for(uint8_t i = 0; i < 10; i++) |
4 | {
|
5 | drehungrechts(); |
6 | }
|
7 | Serial.println("Endschalter links"); |
8 | b = 1; |
9 | }
|
:
Bearbeitet durch User
Michael L. schrieb: > // Example of driving a stepper motor using Wichtige Regeln - erst lesen, dann posten! Groß- und Kleinschreibung verwenden Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang ------------------------------------------- Hallo Michael L., Ergänzung: erst lesen, dann verstehen, dann posten!
Arduino F. schrieb: > Ich fange mal an... > Aber da ist so viel drin, dass mir fast schwindelig wird. > > Du hast da 2 Endlosschleifen drin... > Und, wenn sie nicht endlos sind, dann sind sie sowieso überflüssig. > HIGH und LOW sind nicht int, sondern bool. (auch wenn es hier wenig > Unterschied macht.) > > b ist nicht volatile, das ist ein grober Fehler. > Serial.print() und seine Brüder können deine ISR in den Deadlock > zwingen. > > Auf jeden Fall würde ich das "entkoppeln". > Damit meine ich z.B. das Debounce als einzelnen Teil auslagern. > 3 Bedingungen in einer IF gelten bei mir schon als > unlesbar/unübersichtlich. Okay den voherigen Beitrag kann ich nicht mehr bearbeiten um den Code in den Anhang zu packen. Wo siehst du zwei Endlosschleifen? Das debouncen ist etwas unschön, geb ich zu. Funktioniert aber zum Glück. Serial.print() war halt eine einfache Möglichkeit zum Überprüfen. Ist für die spätere Verwendung nicht erforderlich. Fliegt also erstmal raus. Der Motor braucht deutlich mehr Schritte um von einem Endschalter zum anderen zu kommen (>1000). Fällt ja gar nicht auf das ich vom programmieren eher wenig Ahnung habe. ;)
Hier:
1 | while (previous == HIGH) |
2 | {
|
3 | //
|
4 | }
|
Ich sehe nicht, wo in der Schleife, previous sich je ändern könnte. Also gibts nur zwei Möglichkeiten: 1. die Schleife wird nicht durchlaufen (dann kann sie weg) 2. die Schleife wird endlos durchlaufen (Programm "hängt")
Arduino F. schrieb: > Hier: >
1 | > while (previous == HIGH) |
2 | > { |
3 | > // |
4 | > } |
5 | >
|
> Ich sehe nicht, wo in der Schleife, previous sich je ändern könnte. > > Also gibts nur zwei Möglichkeiten: > 1. die Schleife wird nicht durchlaufen (dann kann sie weg) > 2. die Schleife wird endlos durchlaufen (Programm "hängt") Scheinbar braucht der das previous gar nicht. Eigentlich soll der bei einem Tastendruck einen Schritt vorwärts machen und wenn der Taster gedrpückt bleibt sich einfach weiter drehen.....
Michael L. schrieb: > Hat jemand eine Idee womit ich eine einfache kurze Pause zwischen dem > wechseln des Status der LED realisieren kann Externe Schaltung zum Blinken im ISR Triggern.
Daß das Blinken nur einmal funktioniert liegt daran, daß die beteiligten Variablen (b und i) hinterher nicht wieder in den Ausgangszustand gesetzt werden. blinken() braucht noch einen else-Zweig, damit, wenn i>=8 ist (also wenn das Blinksignal fertig ist), der Ausganszustand wiederhergestellt wird, also b=0 und i=0.
Siehe Anhang. Keine Garantie dass es funktioniert, oder überhaupt annähernd macht was du denkst das es tun soll, aber es kompiliert ;-) Ah, .cpp in .ino oder so was umbenennen für Arduino.
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.