PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "fremde" zeichen



inka
19.09.2017, 16:11
hallo allerseits,

in einem der erklärungsbeispiele für "blink without delay" stiess ich auf folgenden code:


/*
/*
Blink Without Delay - anhand von Beispielen erklärt
fünf parallel laufende, voneinander unabhängige, unterschiedliche Zeiten


https://www.arduinoforum.de/arduino-Thread-Blink-Without-Delay-mal-anders-erkl%C3%A4rt




!!! Variablen zum speichern von Zeiten aus millis() und micros() immer 'unsigned long' deklarieren !!!


*/




// Variablen deklarieren in denen die Startzeiten
// der einzelnen Zeitfunktionen gespeichert werden
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;
unsigned long startzeit_4 = 0;
unsigned long startzeit_5 = 0;


// Definitionen der einzelnen Schaltzeiten
#define laufzeit_1 1234UL
#define laufzeit_1 1234UL
#define laufzeit_2 2345UL
#define laufzeit_3 54321UL
#define laufzeit_4 1111UL
#define laufzeit_5 22UL


// Die Anschlusspins der einzelnen LEDs festlegen
const int led_1 = 10;
const int led_2 = 11;
const int led_3 = 12;
const int led_4 = 13;


// Pins als Ausgang
void setup()
{
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
}






void loop()
{




// laufzeit_1 EIN, laufzeit_1 AUS - LED schalten in loop - Schaltzeiten in Millisekunden
if (millis() - startzeit_1 >= laufzeit_1)
{
startzeit_1 = millis();
digitalWrite(led_1, digitalRead(led_1) ^ 1);
}








// laufzeit_2 EIN, laufzeit_2 AUS - LED schalten in Funktion - Schaltzeiten in Millisekunden
if (millis() - startzeit_2 >= laufzeit_2)
{
startzeit_2 = millis();
led2();
}








// laufzeit_3 EIN, laufzeit_3 AUS - LED schalten in loop - Schaltzeiten in Microsekunden
if (micros() - startzeit_3 >= laufzeit_3)
{
startzeit_3 = micros();
digitalWrite(led_3, digitalRead(led_3) ^ 1);
}








// asymetrische Zeiten - laufzeit_5 EIN, laufzeit_4 AUS - LED schalten in loop - Schaltzeiten in Millisekunden
if (!digitalRead(led_4) && millis() - startzeit_4 >= laufzeit_4 )
{
startzeit_5 = millis();
digitalWrite(led_4, digitalRead(led_4) ^ 1);
}
if (digitalRead(led_4) && millis() - startzeit_5 >= laufzeit_5 )
{
startzeit_4 = millis();
digitalWrite(led_4, digitalRead(led_4) ^ 1);
}






}


// Unterprogramm für Led 2
void led2()
{
digitalWrite(led_2, digitalRead(led_2) ^ 1);
}




was bedeutet z.b. hier: #define "laufzeit_1 1234UL" das "UL"?

oder hier: "digitalWrite(led_4, digitalRead(led_4) ^ 1);" das "^ 1"?

Sisor
19.09.2017, 17:27
^: Bitweises exklusives Oder.
UL: Die Konstante hat explizit den Typ unsigned long.

HaWe
19.09.2017, 17:51
hallo allerseits,

in einem der erklärungsbeispiele für "blink without delay" stiess ich auf folgenden code:


/*
/*
Blink Without Delay - anhand von Beispielen erklärt
fünf parallel laufende, voneinander unabhängige, unterschiedliche Zeiten


https://www.arduinoforum.de/arduino-Thread-Blink-Without-Delay-mal-anders-erkl%C3%A4rt




!!! Variablen zum speichern von Zeiten aus millis() und micros() immer 'unsigned long' deklarieren !!!


*/




// Variablen deklarieren in denen die Startzeiten
// der einzelnen Zeitfunktionen gespeichert werden
unsigned long startzeit_1 = 0;
unsigned long startzeit_2 = 0;
unsigned long startzeit_3 = 0;
unsigned long startzeit_4 = 0;
unsigned long startzeit_5 = 0;


// Definitionen der einzelnen Schaltzeiten
#define laufzeit_1 1234UL
#define laufzeit_1 1234UL
#define laufzeit_2 2345UL
#define laufzeit_3 54321UL
#define laufzeit_4 1111UL
#define laufzeit_5 22UL


// Die Anschlusspins der einzelnen LEDs festlegen
const int led_1 = 10;
const int led_2 = 11;
const int led_3 = 12;
const int led_4 = 13;


// Pins als Ausgang
void setup()
{
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
pinMode(led_4, OUTPUT);
}






void loop()
{




// laufzeit_1 EIN, laufzeit_1 AUS - LED schalten in loop - Schaltzeiten in Millisekunden
if (millis() - startzeit_1 >= laufzeit_1)
{
startzeit_1 = millis();
digitalWrite(led_1, digitalRead(led_1) ^ 1);
}








// laufzeit_2 EIN, laufzeit_2 AUS - LED schalten in Funktion - Schaltzeiten in Millisekunden
if (millis() - startzeit_2 >= laufzeit_2)
{
startzeit_2 = millis();
led2();
}








// laufzeit_3 EIN, laufzeit_3 AUS - LED schalten in loop - Schaltzeiten in Microsekunden
if (micros() - startzeit_3 >= laufzeit_3)
{
startzeit_3 = micros();
digitalWrite(led_3, digitalRead(led_3) ^ 1);
}








// asymetrische Zeiten - laufzeit_5 EIN, laufzeit_4 AUS - LED schalten in loop - Schaltzeiten in Millisekunden
if (!digitalRead(led_4) && millis() - startzeit_4 >= laufzeit_4 )
{
startzeit_5 = millis();
digitalWrite(led_4, digitalRead(led_4) ^ 1);
}
if (digitalRead(led_4) && millis() - startzeit_5 >= laufzeit_5 )
{
startzeit_4 = millis();
digitalWrite(led_4, digitalRead(led_4) ^ 1);
}






}


// Unterprogramm für Led 2
void led2()
{
digitalWrite(led_2, digitalRead(led_2) ^ 1);
}




was bedeutet z.b. hier: #define "laufzeit_1 1234UL" das "UL"?

oder hier: "digitalWrite(led_4, digitalRead(led_4) ^ 1);" das "^ 1"?


UL hinter einer Zahl heißt, dass sie den Datentyp UL = unsigned long hat (wird z.B. für millis() benötigt)
und ^ ist ein logischer Operator und bedeutet XOR (edit: bitweise)
( x ^ 1 ) ergibt mit x=0 eine 1 und mit x=1 eine 0, invertiert also x.

andere Operatoren der Sprache C(++) findest du z.B. hier:
https://www.tutorialspoint.com/cprogramming/c_operators.htm

HTH!

inka
20.09.2017, 18:25
danke (auch an sisor) es hat geholfen...

dann bedeutet es, dass:

mit: " digitalWrite(led_4, digitalRead(led_4) ^ 1);"

der zustand von "led_4" gelesen und mit einem invertierten wert vom gelesenen wieder beschrieben wird...

Sisor
20.09.2017, 21:04
danke (auch an sisor) es hat geholfen...

dann bedeutet es, dass:

mit: " digitalWrite(led_4, digitalRead(led_4) ^ 1);"

der zustand von "led_4" gelesen und mit einem invertierten wert vom gelesenen wieder beschrieben wird...
Ja, genau. Folgendes hätte den gleichen Effekt:
digitalWrite(led_4, !digitalRead(led_4));