Forum: Mikrocontroller und Digitale Elektronik Pause im Interrupt


von Michael L. (strompaedagoge)


Lesenswert?

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

von Max M. (jens2001)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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

von Lurchi (Gast)


Lesenswert?

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.

von LostInMusic (Gast)


Lesenswert?

>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).

von Schlumpf (Gast)


Lesenswert?

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...

von fehlerteufel (Gast)


Lesenswert?

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.

von Icke ®. (49636b65)


Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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.

von Michael L. (strompaedagoge)


Lesenswert?

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?

von Einer K. (Gast)


Lesenswert?

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.

von Eric B. (beric)


Lesenswert?

Michael L. schrieb:
> Warum ist das so?

Weil dein Code, den wir nicht kennen, einen Bug hat.

von Thomas E. (thomase)


Lesenswert?

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
von Einer K. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Max M. (jens2001)


Lesenswert?

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.

von Michael L. (strompaedagoge)


Lesenswert?

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
von Einer K. (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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!!

von Eric B. (beric)


Lesenswert?

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
von Arduinoquäler (Gast)


Lesenswert?

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!

von Michael L. (strompaedagoge)


Lesenswert?

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. 
;)

von Einer K. (Gast)


Lesenswert?

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")

von Michael L. (strompaedagoge)


Lesenswert?

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.....

von Bitwurschtler (Gast)


Lesenswert?

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.

von Nosnibor (Gast)


Lesenswert?

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.

von Eric B. (beric)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.