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
Lauflicht mit Interrupt
03.12.2019, 23:26
Beitrag #1
Lauflicht mit Interrupt
Ich hab folgendes Programm im I-net gefunden .
Mir stellt sich nun die Frage wo sind die Taster dort definiert bzw. woher weis ich wo ich sie anschliessen muss an welchem Ausgang ?

Code:
//Lauflicht - Interruptgesteuert
//by Uwe Thissen
//
//Beispiel eines Lauflichts das mittels zweier Taster per Interrupt gesteuert werden kann.
// 1. Taster ändert die Laufrichtung (Interrupt 0)
// 2. Taster schaltet alle LEDs aus oder an (Interrupt 1)
//Die Laufgeschwindigkeit kann mittels eines Potentiometers geändert werden.
//
#define potiPin A0                 //Pin des Potentiometers festlegen

int buttonRichtung = true;  //Laufrichtung
int buttonZustand = LOW;  //Anfangszustand der LEDs
//----------------------------------------------------------------------------------------------------------------------------------------
void anfangsZustand()
{
  for (int i = 8; i < 14; ++i) digitalWrite(i, buttonZustand);  //Anfangszustand der LEDs setzen
}
//----------------------------------------------------------------------------------------------------------------------------------------
void setLed(int pin)                              //Zustand einer LED aendern
{
  digitalWrite(pin, !buttonZustand);
  delay(analogRead(potiPin));             //Potentiometer für Delay abfragen
  digitalWrite(pin, buttonZustand);
}
//----------------------------------------------------------------------------------------------------------------------------------------
void richtung()    //ISR-Laufrichtung
{
  buttonRichtung = !buttonRichtung;
  delay(100);
}
//----------------------------------------------------------------------------------------------------------------------------------------
void zustand()    //ISR-Anfangszustand der LEDs
{
  buttonZustand = !buttonZustand;
  anfangsZustand();
  delay(100);
}
//----------------------------------------------------------------------------------------------------------------------------------------
void setup()
{
  for (int i = 8; i < 14; ++i) pinMode(i, OUTPUT);  //LED-Pins als Ausgang setzen
  anfangsZustand();
  attachInterrupt(0, richtung, RISING);                   //Interrupts definieren
  attachInterrupt(1, zustand, RISING);
}
//----------------------------------------------------------------------------------------------------------------------------------------
void loop()
{
  if (buttonRichtung)                                         //Laufrichtung ermitteln
    for (int i = 8; i < 14; ++i) setLed(i);
  else
    for (int i = 13; i > 7; --i) setLed(i);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 05:03
Beitrag #2
RE: Lauflicht mit Interrupt
(03.12.2019 23:26)senseman schrieb:  Ich hab folgendes Programm im I-net gefunden .
Mir stellt sich nun die Frage wo sind die Taster dort definiert bzw. woher weis ich wo ich sie anschliessen muss an welchem Ausgang ?

Ausgänge sind D8 bis D13. Das sieht man anhand der For-Schleifen.
Aber delays innerhalb von Interrupt-Routinen? Globale Variablen nicht volatile?
Ganz schlechter Code!
Das schafft man übrigens auch ganz ohne Interrupts und ohne Delays.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 08:40
Beitrag #3
RE: Lauflicht mit Interrupt
(04.12.2019 05:03)Gorathan schrieb:  
(03.12.2019 23:26)senseman schrieb:  Ich hab folgendes Programm im I-net gefunden .
Mir stellt sich nun die Frage wo sind die Taster dort definiert bzw. woher weis ich wo ich sie anschliessen muss an welchem Ausgang ?

Ausgänge sind D8 bis D13. Das sieht man anhand der For-Schleifen.
Aber delays innerhalb von Interrupt-Routinen? Globale Variablen nicht volatile?
Ganz schlechter Code!
Das schafft man übrigens auch ganz ohne Interrupts und ohne Delays.
Taster legt man üblicherweise nicht auf Ausgänge, sondern auf Eingangspins.
Auch die sind klar definiert mit IRQ0 und IRQ1. Welche Pins das sind findet man im Datenblatt.

Bei dem Rest, gebe ich dir Recht.
Solch schlechten Programmierstiel sollte man sich nicht aneignen und besser auch nicht verwenden.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 09:32
Beitrag #4
RE: Lauflicht mit Interrupt
(04.12.2019 05:03)Gorathan schrieb:  Globale Variablen nicht volatile?
Ganz schlechter Code!

Hallo, ich mische mich mal ein... ich bin selbst noch ein Anfänger und lerne gerade noch. Mir war bis gerade volatile gar nicht bekannt, habe aber jetzt
sofort einmal nachgelesen.

Also wenn ich das richtig verstehe, kann ich eine als volatile deklarierte Variable auch in Funktionen verwenden???

Wozu brauch man dann überhaupt noch Globale Variable?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 11:12
Beitrag #5
RE: Lauflicht mit Interrupt
(04.12.2019 09:32)DO3GE schrieb:  
(04.12.2019 05:03)Gorathan schrieb:  Globale Variablen nicht volatile?
Ganz schlechter Code!

Hallo, ich mische mich mal ein... ich bin selbst noch ein Anfänger und lerne gerade noch. Mir war bis gerade volatile gar nicht bekannt, habe aber jetzt
sofort einmal nachgelesen.

Also wenn ich das richtig verstehe, kann ich eine als volatile deklarierte Variable auch in Funktionen verwenden???

Wozu brauch man dann überhaupt noch Globale Variable?
Nein, das hast Du falsch verstanden!
Volatile ist dazu da, um globale Variablen in Interrupt-Funktionen zu verwenden.
Lies mal hier: https://www.arduino.cc/reference/de/lang.../volatile/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 13:06
Beitrag #6
RE: Lauflicht mit Interrupt
(04.12.2019 11:12)Gorathan schrieb:  Lies mal hier: https://www.arduino.cc/reference/de/lang.../volatile/

Genau das hatte ich auch gefunden und gelesen.
Aber bei mir ist dann void blink() dann ehr eine Function als ein Interrupt... oder???
Ich komme aus der .net Ecke und da würde man es ehr Functioin nennen.
Letztendlich ist es aber nur eine Definition/Bezeichnung, ich hab es aber richtig verstanden. ***Kleinlaut: HOFFE ICH *** ;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 13:09
Beitrag #7
RE: Lauflicht mit Interrupt
blink() in dem Beispiel ist eine Funktion, die als InterruptServeceRoutine genutzt wird (duch attachInterrupt).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
04.12.2019, 19:09
Beitrag #8
RE: Lauflicht mit Interrupt
Weil ich ja im Post#2 geschrieben habe, dass man das Ganze auch ohne Interrupt schreiben kann, will ich das hier mal beweisen:
Code:
const uint8_t LED_PINS[] = {2, 3, 4, 5, 6, 7}; // an D2...D7 sind die LEDs angeschlossen
const uint8_t LED_COUNT = sizeof(LED_PINS); // die Anzahl der LEDs wird ermittelt
const uint8_t POTI_PIN = A4; // am Pin A4 liegt der Mittelanschluss des Potis (10kOhm), aussen +5V und GND
const uint8_t SWITCH_PIN = 12; // am Pin D12 ist ein Taster nach GND angeschlossen

int8_t index = 0, direction = 1;
uint16_t speed = 0;
uint32_t nowMillis, stepMillis, switchMillis;
bool switchState = HIGH, oldState = HIGH;

void setup() {
  for (uint8_t i = 0; i < LED_COUNT; i++) {
    pinMode(LED_PINS[i], OUTPUT);
  }
  pinMode(POTI_PIN, INPUT);
  pinMode(SWITCH_PIN, INPUT_PULLUP);
  digitalWrite(LED_PINS[0], HIGH);
  stepMillis = millis();
}

void loop() {
  nowMillis = millis();
  speed = analogRead(POTI_PIN);
  switchState = digitalRead(SWITCH_PIN);
  if (switchState != oldState && nowMillis - switchMillis > 30) {
    switchMillis = nowMillis;
    if (!switchState) direction = -direction;
    oldState = switchState;
  }
  if (nowMillis - stepMillis > speed) {
    stepMillis = nowMillis;
    digitalWrite(LED_PINS[index], LOW);
    index += direction;
    if (index == LED_COUNT) index = 0;
    if (index < 0) index = LED_COUNT - 1;
    digitalWrite(LED_PINS[index], HIGH);
  }
}
Mit dem Poti kann man die Geschwindigkeit regeln und mit dem Taster die Laufrichtung umschalten.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  for-schleife, delay, millis, interrupt Harry 8 978 31.03.2020 21:02
Letzter Beitrag: Harry
Question deepsleep 433Mhz Interrupt Marc2014 15 1.096 28.03.2020 13:30
Letzter Beitrag: hotsystems
Question Lauflicht Spezial Charlie 7 671 25.03.2020 00:23
Letzter Beitrag: senseman
  Lauflicht mit externem Takt Manny 21 2.145 02.03.2020 12:36
Letzter Beitrag: Harry
Question Lauflicht mit zufälligem Stop Platinum 5 626 20.02.2020 20:07
Letzter Beitrag: Tommy56
  Loop-Teil mit Interrupt für bestimmte Zeit stoppen Alter Fritz 11 1.535 23.12.2019 23:10
Letzter Beitrag: hotsystems
  AT90CAN Interrupt wird nicht ausgelöst slsb02 5 881 19.11.2019 15:04
Letzter Beitrag: slsb02
  Interrupt vs. LCD Nasenbär 10 1.682 22.08.2019 16:30
Letzter Beitrag: @Thomas
  RGB LED Lauflicht per Taster unterbrechen AC_DC_new 28 5.665 05.08.2018 19:16
Letzter Beitrag: AC_DC_new
  Lauflicht mit Kontrolle Golffahrer 13 3.252 13.05.2018 19:59
Letzter Beitrag: Tommy56

Gehe zu:


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