Ich bin an Arduino-Skizzen mit einem void setup()
Teil gewöhnt , der einmal ausgeführt wird, und einem void loop()
Teil, der sich immer wieder wiederholt . Was passiert, wenn Sie ungültige Funktionen außerhalb der Hauptfunktion haben void loop()
? Werden diese alle parallel weiterlaufen oder laufen sie nacheinander ab? Oder werden bestimmte Void-Funktionen erst ausgeführt, wenn bestimmte Kriterien erfüllt wurden (z. B. eine while-Schleife)?
Wann werden beispielsweise im folgenden Code void receiveData(int byteCount)
die void sendData()
Funktionen und ausgeführt?
//I2C_test
//This code demonstrates communication via an I2C bus between a raspberry pi and an arduino.
//When the Raspberry pi (master) sends data to the Arduino (slave), the Arduino uses this
//data to control a motor. After the Arduino has recieved data from the master, it then collects
//data from the external environment via a sensor and sends this data back to the Raspberry pi.
#include <Wire.h>
int number = 0; //Declare variables
int val = 0;
void setup() {
//Anything between the curly brackets runs once when the arduino is turned on or reset
pinMode(0, INPUT);
//Set pin 0 as input and 3 as output
pinMode(3, OUTPUT);
Serial.begin(9600);
//Set the data rate for serial transmission at 9600bps
Wire.begin(0x04);
//Initiate the Wire library, join the Arduino as a slave, and specify its 7 bit slave address
Wire.onReceive(receiveData);
//Define callbacks for i2c communication
Wire.onRequest(sendData);
}
void loop() {
//The code between the curly brackets keeps repeating
delay(100);
}
void receiveData(int byteCount) {
while(Wire.available()) {
number = Wire.read();
//Set the variable "number" to the data sent by the master
analogWrite(3, number);
//Write this number to pin 3 (PWM). This controls the motor speed
}
val = analogRead(0);
//Read the voltage on pin 0 (connected to the sensor). Map input voltages between 0 and 5 volts into integer values between 0 and 1023
}
void sendData() {
Wire.write(val);
//Send the data read from the sensor to the master.
}
arduino-uno
i2c
Blue7
quelle
quelle
Antworten:
Die
setup()
undloop()
Funktionen sind ungewöhnlich, da sie vom Arduino-Code automatisch für Sie aufgerufen werden. Keine anderen Funktionen verhalten sich so.Im Allgemeinen wird eine Funktion nur ausgeführt, wenn Sie sie explizit selbst aufrufen (z. B. von innen
setup()
oderloop()
) oder einen anderen Teil des Programms anweisen, sie aufzurufen. (Es gibt andere Möglichkeiten, Funktionen auszuführen, aber dies beinhaltet normalerweise einige sehr fortgeschrittene Bastelarbeiten, die am besten vermieden werden.)Zum Beispiel
pinMode()
ist eine Funktion wie jede andere. Es wird nur ausgeführt, wenn Sie tatsächlich so etwas wiepinMode(3, INPUT)
in Ihren Code eingefügt haben. Zu diesem Zeitpunkt wird es einmal ausgeführt, beendet und dann wird die aufrufende Funktion dort fortgesetzt, wo sie aufgehört hat (sie werden nie parallel ausgeführt).Der von Ihnen gepostete Beispielcode ist sehr interessant. Schauen Sie sich diese Zeilen an in
setup()
:Diese Zeilen erzählen die
Wire
Objekt aufrufenreceiveData()
undsendData()
als Reaktion auf I2C Ereignisse. Dazu werden Funktionszeiger übergeben, die von gespeichert und verwendet werdenWire
.Ich würde empfehlen, online nach Informationen zu C / C ++ - Funktionszeigern zu suchen, wenn Sie mehr darüber erfahren möchten. Sie könnten auch interessiert sein, die
attachInterrupt()
Funktion von Arduino zu erkunden .quelle
receiveData()
undsendData()
jedoch nur ausgeführt werden, wenn sie aufgerufen werden, warum werden sie dann innerhalb dervoid setup()
Funktion und nicht innerhalb der Hauptfunktion aufgerufenvoid loop()
? Sicherlich werden diese Funktionen niemals aufgerufen, es sei denn, es besteht die seltene Möglichkeit, dass ein i2c-Ereignis vorliegt, während sich der Befehlszeiger noch in dervoid setup
Funktion befindet. Wäre es nicht besser, diese Funktionen innerhalb dervoid loop
Funktion aufzurufen, damit die Funktion immer dann aufgerufen wird, wenn ein i2c-Ereignis vorliegt?void setup()
, sie werden als Parameter übergeben vononReceive
undonRequest
, sie sind Rückrufe als Kommentar Staaten. In einer sehr kurzen Zusammenfassung: Dies weist die (Code aus der) Wire-Bibliothek an, diese Funktionen aufzurufen , wenn bestimmte Dinge passieren ( arduino.cc/en/Reference/WireOnReceive , arduino.cc/en/Reference/WireOnRequest ...)twi_init()
wenn Sie anrufenWire.begin
. Wenn es eine I2C-Aktivität gibt, beendet der µC seine aktuelle Aufgabe (es sei denn ... vergiss es im Moment :-) und geht in den Code der Wire-Bibliothek, der dann die (je nach dem, was gerade passiert) Funktion aufruft, als die Sie sich registriert haben Rückruf (receiveData
zum Beispiel). Ein Rückruf ist der generische Name für Funktionen wiereceiveData
odersendData
, die von einem Interrupt-Handler in Wire aufgerufen werden .Wird dieser Fall nicht
setup()
einmal aufgerufen undloop()
wiederholt aufgerufen? dh dass es ein Unsichtbares gibt,main()
das so aussehen könnte:Entschuldigung, ich schaue nur in das Arduino und habe fast keine C / C ++ - Erfahrung. Ich versuche, diese
loop()
Situation selbst in den Griff zu bekommen .quelle
init()
dem wird der Timer für den Gangmillis
,delay
etc. Alsoinit()
für die allgemeine Initialisierung ist,setup()
ist für Ihre Initialisierung undloop
ist für, na ja, Looping. Sie können Ihre eigenen schreiben,main
wenn Sie die volle Kontrolle übernehmen möchten.;
ist nach dem vorletzten nicht erforderlich}
:-)Ich kann Dees Antwort nicht kommentieren. Der eigentliche Code, der in der Hauptschleife ausgeführt wird, ist hier :
Und ja,
setup()
wird einmal angerufen undloop()
wiederholt aufgerufen (zusammen mit einigen seriellen Sachen).quelle
Es funktioniert wie eine normale Funktion, es muss aufgerufen werden, um einen Sinn zu ergeben. loop () / setup () werden von einer main () -Funktion aufgerufen, die aus dem Arduino-Verzeichnis kompiliert und darin verknüpft ist. receiveData / sendData werden von Ihrem Programm aufgerufen, dessen Root sich in loop / setup-Funktionen befindet.
quelle