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
  AT90CAN Interrupt wird nicht ausgelöst slsb02 5 270 19.11.2019 15:04
Letzter Beitrag: slsb02
  Interrupt vs. LCD Nasenbär 10 1.000 22.08.2019 16:30
Letzter Beitrag: @Thomas
  RGB LED Lauflicht per Taster unterbrechen AC_DC_new 28 3.742 05.08.2018 19:16
Letzter Beitrag: AC_DC_new
  Lauflicht mit Kontrolle Golffahrer 13 2.396 13.05.2018 19:59
Letzter Beitrag: Tommy56
  LED-Bilnker: Wechsel durch Interrupt djculture2001 10 2.621 04.10.2017 19:23
Letzter Beitrag: djculture2001
  Interrupt und I2C gibt das Probleme? Badger1875 5 2.916 03.10.2017 23:26
Letzter Beitrag: GuaAck
  Problem mit externem Interrupt manfred474 13 3.997 13.08.2017 08:54
Letzter Beitrag: MicroBahner
  Taster an Interrupt - Prellen geschickter vermeiden als millis() zu prüfen? Flap 19 9.903 04.08.2017 08:10
Letzter Beitrag: Binary1
  Lauflicht mit Fernbedienung und Shift Register Golffahrer 8 2.976 02.07.2017 19:05
Letzter Beitrag: Tommy56
  Lauflicht mit Nano Pixel und Joystick strobo 3 1.766 20.05.2017 20:16
Letzter Beitrag: Tommy56

Gehe zu:


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