INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wie Interrupt einfügen?
08.11.2014, 16:01
Beitrag #1
Wie Interrupt einfügen?
Hallo zusammen,
ich habe nun mein erstes "Programm" erstellt und hurra, es läuft auch. jetzt wollte ich es noch etwas aufhübschen und dazu
1. die Verzweigung zum Teil Feuerwehr durch einen Interrupt auslösen und
2. die Ansteuerungen im Teil Servosteuerung per random auslösen.

Ich habe mich also wieder durch diverse Beispiele gelesen, bekomme es aber irgendwie nicht hin. Kann mir vielleicht jemand auf die Sprünge helfen?

Ich versuche mal mein Werk einzustellen und bedanke mich schon Mal.

[/php][/code]
// Variablentabelle Servosteuerung:
//volatile int state = LOW;
int Kontakt=3;
int Status=0;
int Servo1_rechts=40; //Zufahrt FW=rechts
int Servo1_links=41;
int Servo3_rechts=22;
int Servo4_rechts=23;
int Servo5_rechts=24;
int Servo6_rechts=25;
int Servo7_rechts=26;
int Servo8_rechts=27;
int Servo3_links=28;
int Servo4_links=29;
int Servo5_links=30;
int Servo6_links=31;
int Servo7_links=32;
int Servo8_links=33;
//Variablentabelle Feuerwehreinsatz:
int ledFWST=34; //Stop-LED in FW
int ledBl=35; //Blaulicht-LED inFW
int ledSTFW=36; //Stop vor FW
int ledSTPO=37; //Stop an Post
int ledBR=38; //Stop an Brand
int ledFWBl=39; //Blaulicht aus am Brandt- Stop aus
int RLS=4; // Reflexlichtschranke
int RLS_Stat=1;
void setup() {
//attachInterrupt(0,Feuerwehrablauf, CHANGE); als Komm, geht nicht
// Pins als Ausgang deklarieren:
pinMode(Servo3_rechts, OUTPUT); //Servo 3 rechts
pinMode(Servo4_rechts, OUTPUT); //Servo 4 rechts
pinMode(Servo5_rechts, OUTPUT); //Servo 5 rechts
pinMode(Servo6_rechts, OUTPUT); //Servo 6 rechts
pinMode(Servo7_rechts, OUTPUT); //Servo 7 rechts
pinMode(Servo8_rechts, OUTPUT); //Servo 8 rechts
pinMode(Servo3_links, OUTPUT); //Servo 3 links
pinMode(Servo4_links, OUTPUT); //Servo 4 links
pinMode(Servo5_links, OUTPUT); //Servo 5 links
pinMode(Servo6_links, OUTPUT); //Servo 6 links
pinMode(Servo7_links, OUTPUT); //Servo 7 links
pinMode(Servo8_links, OUTPUT); //Servo 8 links

pinMode (ledFWST, OUTPUT);
pinMode (ledBl, OUTPUT);
pinMode (ledSTFW, OUTPUT);
pinMode (ledSTPO, OUTPUT);
pinMode (ledBR, OUTPUT);
pinMode (ledFWBl, OUTPUT);

// Pins als Eingang deklarieren
pinMode(Kontakt, INPUT);
pinMode (RLS, INPUT_PULLUP);
}

void loop() {
Servoansteuerung:
Status = digitalRead(Kontakt); // Status vom Kontakt einlesen:
if (Status == HIGH) {goto Feuerwehrablauf;} // prüfen ob Kontakt geschlossen. Wenn ja ist Status=high=Feueralarm:
digitalWrite(Servo3_links, HIGH); //28
delay(500);
digitalWrite(Servo3_links, LOW); //28
delay(500);
digitalWrite(Servo4_rechts, HIGH); //23
delay(500);
digitalWrite(Servo4_rechts, LOW); //23
delay(600);
digitalWrite(Servo6_links, HIGH); //31
delay(500);
digitalWrite(Servo6_links, LOW); //31
delay(600);
digitalWrite(Servo8_rechts, HIGH); //27
delay(500);
digitalWrite(Servo8_rechts, LOW); //27
delay(600);
// USW 12 Mal
goto Servoansteuerung;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxx:


Feuerwehrablauf:
digitalWrite(ledFWST, HIGH); //Stop an FW einschalten
digitalWrite(ledSTFW, HIGH); //Stop vor FW einschalten
delay(500); //0,5 sec warten
digitalWrite(ledBl, HIGH); //Blaulicht einschalten
delay(500); //0,5 sec warten
digitalWrite(ledFWST, LOW); //Stop an FW ausschalten

//hier soll der Ablauf auf RLS=HIGH warten
RLSAbfrage:
RLS_Stat = digitalRead(RLS);
if (RLS_Stat == HIGH) {
delay(500);
goto RLSAbfrage;
}
digitalWrite(Servo3_links, HIGH); //Servo 3 links einschalten
digitalWrite(Servo4_rechts, HIGH); //Servo 4 rechts einschalten
delay(500); //0,5 sec warten
digitalWrite(Servo3_links, LOW); //Servo 3 links ausschalten
digitalWrite(Servo4_rechts, LOW); //Servo 4 rechts ausschalten
digitalWrite(ledSTPO, HIGH); //LED Post Stop einschalten
digitalWrite(ledBR,HIGH); //LED Brandt Stop einschlten
delay(5000); //5 sec warten
digitalWrite(Servo4_links, HIGH);
delay(500);
digitalWrite(Servo4_links,LOW);
digitalWrite(ledSTPO, LOW); //LED Post Stop ausschalten
delay(1500); //15sec warten
digitalWrite(ledFWBl,HIGH); //LED Blaulicht aus einschalten
delay(500); //0,5 sec warten
digitalWrite(ledBR,LOW); //LED Brandt Stop ausschalten
digitalWrite(ledFWBl,LOW); //LED Blaulicht aus ausschalten
delay(2000); //2sec warten, FW überfährt 2.RLS und schaltet FW-Einsatz aus
goto Servoansteuerung;


}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2014, 17:39
Beitrag #2
RE: Wie Interrupt einfügen?
(08.11.2014 16:01)citycar schrieb:  1. die Verzweigung zum Teil Feuerwehr durch einen Interrupt auslösen und
Warum?
Ich meine damit: Was versprichst Du Dir davon?

Zitat:2. die Ansteuerungen im Teil Servosteuerung per random auslösen.
Beschreibe mal etwas genauer, wie Du es haben willst.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2014, 17:53
Beitrag #3
RE: Wie Interrupt einfügen?
(08.11.2014 17:39)Thorsten Pferdekämper schrieb:  
(08.11.2014 16:01)citycar schrieb:  1. die Verzweigung zum Teil Feuerwehr durch einen Interrupt auslösen und
Warum?
Ich meine damit: Was versprichst Du Dir davon?

Zitat:2. die Ansteuerungen im Teil Servosteuerung per random auslösen.
Beschreibe mal etwas genauer, wie Du es haben willst.

Gruß,
Thorsten



Hallo Thorsten,
Der Feuerwehreinsatz soll später Mal auf Tastendruck ausgelöst werden und dann auch sofort und nicht erst nach Schleifendurchlauf starten.

Im Hauptteil werden Servos für den normalen Verkehrsablauf gesteuert und es wäre schön, wenn man nicht nach 5min beobachten einen sich wiederholenden sondern einen zufälligen Ablauf haben würde. Meine Idee dazu: Es gibt 6 Servos die je 2 Positionen annehmen können. Also alle X-Sekunden eine Zufallszahl 1-12 erzeugen und den entsprechenden Servo verfahren. So würde ein ziemliches undurchschaubares Durcheinander entstehen.


Schönen Abend noch und vielen Dank

Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2014, 18:38
Beitrag #4
RE: Wie Interrupt einfügen?
(08.11.2014 17:53)citycar schrieb:  Der Feuerwehreinsatz soll später Mal auf Tastendruck ausgelöst werden und dann auch sofort und nicht erst nach Schleifendurchlauf starten.
Dann nützt Dir das mit dem Interrupt erstmal nicht viel. Innerhalb einer Interrupt-Routine kann nicht wieder ein Interrupt ausgelöst werden. Das gilt auch für Timer-Interrupts. Das bedeutet, dass dort die delay()s nicht funktionieren werden.
Wahrscheinlich musst Du also erstmal die delay()s loswerden (und zwar alle). Jetzt kommt das übliche zu dem Thema: Such mal nach "blink without delay", bekomme das zum Laufen und versuche es komplett zu verstehen.
Es könnte sein, dass dann schon klar wird, wie man sozusagen verschiedene Dinge (pseudo-)parallel ablaufen lassen kann.

Ansonsten versuche mal das mit dem goto bleiben zu lassen. Definiere Dir für jeden "Unterprozess" eine eigene Funktion und rufe die dann aus dem loop() heraus auf. (Siehe auch hier: http://arduino.cc/en/pmwiki.php?n=Refere...eclaration.)

Zitat:Im Hauptteil werden Servos für den normalen Verkehrsablauf gesteuert und es wäre schön, wenn man nicht nach 5min beobachten einen sich wiederholenden sondern einen zufälligen Ablauf haben würde. Meine Idee dazu: Es gibt 6 Servos die je 2 Positionen annehmen können. Also alle X-Sekunden eine Zufallszahl 1-12 erzeugen und den entsprechenden Servo verfahren. So würde ein ziemliches undurchschaubares Durcheinander entstehen.
Also eine ganzzahlige Zufallszahl zwischen 1 und 12 (inklusive) erzeugt man mit
Code:
int zufallszahl = random(1,13);

(Siehe http://arduino.cc/en/pmwiki.php?n=Reference/Random.)
Einfacher geht's aber vielleicht so:
Code:
int servo = random(0,6);  // servo nummer 0 bis 5
int Position = random(0,2);   // Position 0 oder 1
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2014, 20:05
Beitrag #5
RE: Wie Interrupt einfügen?
Hallo Thorsten,

danke für die schnelle und ausführliche Antwort. Viel InfoShy.
Ich werde es nochmal versuchen und sollte ich nicht weiter kommen werde ich mich hoffnungsvoll wieder melden. Natürlich auch, wenn ich Erfolg habe.

Bis dahin

schönen Abend noch
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2014, 14:34
Beitrag #6
RE: Wie Interrupt einfügen?
Hallo Thorsten,

leider bin ich nicht weiter gekommen. Wenn ich Blink without delay richtig verstanden habe wird ein Intervall generiert und dann der Pinstatus entsprechen umgeschaltet. Soweit klar. wenn ich also unterschiedliche Zeiten benötige muss ich auch soviel Intervalle erzeugen. War mit delay einfacher, aber was nicht geht...
Die von dir vorgeschlagenen Möglichkeiten der Zufallszahlerzeugung liefert im ersten Fall lt. SeralMonitor immer eine 8. im 2.Fall eine 1. Das ist nicht wirklich Zufall.
Nebenbei ist mir noch aufgefallen, dass die Interrupt-Pins sehr empfindlich sind. So genügt schon das Berühren mit dem Finger zum Auslösen. Ich werde aber weiter versuchen eine Lösung zu finden.
Schönes Tag noch und nochmals Dank

Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2014, 14:58
Beitrag #7
RE: Wie Interrupt einfügen?
(09.11.2014 14:34)citycar schrieb:  Wenn ich Blink without delay richtig verstanden habe...
Der Witz ist, dass Du während der Wartezeit noch etwas anderes machen kannst, wie z.B. einen Pin abfragen und entsprechend handeln.

Zitat:Die von dir vorgeschlagenen Möglichkeiten der Zufallszahlerzeugung liefert im ersten Fall lt. SeralMonitor immer eine 8. im 2.Fall eine 1.
Zeig mal den entsprechenden Teil Deines Programms.

Zitat: Das ist nicht wirklich Zufall.
Echten Zufall gibt es nicht, aber die von random-Aufrufen erzeugte Folge sollte schon ziemlich zufällig aussehen.

Zitat:Nebenbei ist mir noch aufgefallen, dass die Interrupt-Pins sehr empfindlich sind. So genügt schon das Berühren mit dem Finger zum Auslösen.
Das ist bei jedem Input-Pin so. Du brauchst halt einen Pulldown-Widerstand oder Du schaltest gegen Masse und verwendest INPUT_PULLUP.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2014, 20:28
Beitrag #8
RE: Wie Interrupt einfügen?
Hallo Thorsten,
so, den Widerstand habe ich eingefügt, Phänomen ist weg.

Die Zufallszahlerzeugung habe ich zur Probe erstmal nur wie unten gezeigt gemacht, und wenn ich das heute laufen lasse kommt am Serial Monitor immer nur die Null. Da ich davon ausgehe, dass der Arduino das macht, was ich ihm vorgebe liegt das Problem wohl vor dem Bildschirm. Aber leider erkenne ich es nicht.
[/php]
long zufallszahl;
long servo;
long Position;
void setup(){
Serial.begin(9600);
int zufallszahl = random(1,13);
int servo = random(0,6); // servo nummer 0 bis 5
int Position = random(0,2); // Position 0 oder 1
}
void loop(){
Serial.println(zufallszahl);
delay(123);
Serial.println(servo);[/code]
delay(1540);
Serial.println(Position);
delay(1800);
}




Ich bedanke mich nochmals für die Unterstützung

Schönen Abend noch
Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  while Schleife nach sleep mode interrupt tklaus 13 247 23.11.2016 17:40
Letzter Beitrag: Tommy56
  NRF24L01 Interrupt MeisterQ 22 515 02.11.2016 15:50
Letzter Beitrag: MeisterQ
  Interrupt matthias3579 5 221 15.10.2016 13:23
Letzter Beitrag: hotsystems
  Interrupt und Sicherung der Prozessorregister MKc 5 224 31.08.2016 11:17
Letzter Beitrag: MKc
  Interrupt bei Serieller Übertragung Binatone 8 358 21.06.2016 14:09
Letzter Beitrag: Scheams
  Interrupt wenn softwareSerial Daten BennIY 3 442 01.05.2016 18:39
Letzter Beitrag: tiny85fan
  if Bedingung einfügen gronph 5 457 20.03.2016 13:56
Letzter Beitrag: gronph
  Timer Interrupt Anfängerprobleme Fox 4 618 05.03.2016 02:28
Letzter Beitrag: Fox
  Problem mit Pin Change Interrupt in Library Retian 0 321 10.02.2016 23:37
Letzter Beitrag: Retian
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.185 08.02.2016 16:28
Letzter Beitrag: ardu_arne

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste