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
Setup Loop warum?
07.09.2015, 11:21
Beitrag #1
Setup Loop warum?
Code:
1.
Arduino nutzt Timer0 für seine Zeitbasis.

2.
Wenn man das nicht will, lässt man setup() und loop() weg und legt eine
main() an, ganz klassisch.

Ist diese Aussage exakt?

Danke

Nicht jeder Neuling in einem Forum hat keine Ahnung über die Materie!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.09.2015, 19:37
Beitrag #2
RE: Setup Loop warum?
Hallo fraju,

ob der Punkt 1. stimmt oder besser, relevant ist, kann ich nicht sagen.
Ich vermute mal nein, da es wohl eher eine Frage der in der IDE benutzten Compiler / Linker und Bibliotheken ist.
Tatsache ist wohl, dass
- es der Sprache C egal ist ob es eine main()-Funktion gibt - Arduino nutzt ein Subset von C
- Standardfunktionen loop() bzw. setup() gibt es in C nicht
- über die Library Arduino\hardware\arduino\cores\arduino\main.cpp immer ein "Codegerüst"
Code:
int main(void)
{
    init();

    setup();

    for (;;) {
        loop();
    }

    return 0;
}
erzeugt wird in dem dann die loop() und setup() aufgerufen werden.
- der Linker daher meckern würde, wenn im Arduinocode keine setup() / loop() - Funktionen stehen würden.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2015, 19:21 (Dieser Beitrag wurde zuletzt bearbeitet: 09.09.2015 19:23 von Bitklopfer.)
Beitrag #3
RE: Setup Loop warum?
Hi,
also wenn man mal den Blink Sketch ein bischen umschreibt dann sieht das so aus:
Code:
int main(){
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);              // wait for a second
  digitalWrite(4, LOW);    // turn the LED off by making the voltage LOW
  delay(100);              // wait for a second
}
läuft dann bis zum Delay....also die LED geht an...dann ist Ende.

Auch ein austausch der delay's bringt dann nichts...
Code:
int main(){
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);   // turn the LED on (HIGH is the voltage level)
  for (unsigned long int i = 0; i < 65000000; i++){int b = 5;}             // wait
  digitalWrite(4, HIGH);    // turn the LED off by making the voltage LOW
  for (unsigned long int i = 0; i < 65000000; i++){int b = 5;}             // wait
}
Vielleicht habe ich hier was nicht beachtet und es weis jemand was dazu...
Beide Programme liesen sich fehlerfrei Übersetzen und hochladen.
Doch von blinken keine Spur...

lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2015, 20:42 (Dieser Beitrag wurde zuletzt bearbeitet: 09.09.2015 21:37 von rkuehle.)
Beitrag #4
RE: Setup Loop warum?
Hallo BK,

ich habe mal deinen TestCode mit Serial.begin() / Serial.print() an allen möglichen Stellen erweitert. Erstmal kam nix raus.
A-Bär folgendes funktionierte dann:
Code:
int main(void){
  init(); // <=== wichtig
  Serial.begin(9600);
  for (int i=1;i=10;i++)
  {
    Serial.println("AN");
    delay(100);
    Serial.println("AUS");
  }
}
Der Grund: init() initialisiert die Peripheriekomponenten, also auch die Timer. Damit laufen dann auch die delay()-Aufrufe. Allerdings rennt die for-Schleife durch, wie du es schreibst Huh

Cool, habe selbst wieder was gelernt!
grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2015, 21:27
Beitrag #5
RE: Setup Loop warum?
(09.09.2015 20:42)rkuehle schrieb:  Hallo BK,

ich habe mal deinen TestCode mit Serial.begin() / Serial.print() an allen möglichen Stellen erweitert. Nix kommt raus.Das scheint mir auch logisch.

Ich denke mal, dass durch die Definition von main() in deinem Code die Funktion main() aus dem Codegerüst - aus main.cpp - komplett überschrieben wird.
Damit ist deine main()-Funktion da, wird einmal aufgerufen und abgearbeitet.
Thats all.
loop() und setup() existieren im .cpp-Code deines Sketches gar nicht mehr. Daherr kein Blinken.
Allerdings ist schon fraglich, warum die LED nicht wenigstens einmal den Status wechselt!?
Wann ist die LED an? 1. Sketch bei HIGH, 2. Sketch bei LOW?
Grüße Ricardo

Hi Ricardo,
also ich habe das mal erweitert:
Code:
int main(){
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);   // turn the LED on (HIGH is the voltage level)
  unsigned long int i;
  int b;
  
  int lp = 0;
  while(lp == 0){
  digitalWrite(4, HIGH);   // turn the LED on (HIGH is the voltage level)
  for( i = 0; i < 65000000; i++){
                            b++;}             // wait
  digitalWrite(4, LOW);    // turn the LED off by making the voltage LOW
  for( i = 0; i < 65000000; i++){
                            b++;}             // wait
  }
}

..also daraus resultiert nun das bei obigem Versuch es so war wie du sagtest das die main() nur einmal durchlaufen wurde und eben der der letzte digitalWrite Befehl bestimmt hat ob die LED an war oder nicht. Seltsamerweise werden die for Schleifen gänzlich ignoriert obwohl ich denen eine Aufgabe gegeben habe wo der Compiler Optimierer sofern vorhanden nicht ignorieren darf.
Durch das einfügen der while Schleife wird nun der Code endlos ausgeführt - zu sehen an der reduzierten Helligkeit der LED an Port 4. Die LED an Port 5 wird auch korrekt eingeschaltet. Aber warum die for Schleifen nicht laufen wundert mich schon zumal das ja nun wirklich keine speziellen Funktionen sein sollten.
Nunja...wenn ich zu Fuß programmieren will dann nehm ich das AVR Studio... das hier war nur ein Test um das Thema vom TE zu erörtern...
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2015, 21:33
Beitrag #6
RE: Setup Loop warum?
Schau mal eins höher!
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2015, 21:53
Beitrag #7
RE: Setup Loop warum?
main() wird nur einmal ausgeführt und dann wird zum "Startup-Code" zurückgesprungen der in euren ersten Beispielen nicht vorhanden war.
Hier kann man das nachlesen.

void setup() {} ist bei der Arduino IDE der "Startup-Code".
void loop() {} wohl eine von der IDE modifizierte main() Funktion die nicht in setup zurückspringt sondern sich immer wieder selbst aufruft.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.09.2015, 06:44 (Dieser Beitrag wurde zuletzt bearbeitet: 10.09.2015 07:00 von Bitklopfer.)
Beitrag #8
RE: Setup Loop warum?
(09.09.2015 21:33)rkuehle schrieb:  Schau mal eins höher!
Grüße Ricardo

Moin Ricardo,
weis zwar nicht wirklich auf was du verweisen tust...
..aber so genau interessiert mich das Thema auch nicht wirklich da nun schon klar ist das diese Art zu häcken mit der Ardi IDE nicht zusammenpasst. Den Code habe ich Lokal nicht mal gespeichert...Sleepy
Deswegen Schwamm drüber....fedisch..
Derzeit interessiert mich sowas viel mehr...Tongue
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


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