Forum: Mikrocontroller und Digitale Elektronik Interrupt Probleme beim Arduino


von Michael (Gast)


Lesenswert?

Hallo zusammen,

ich möchte das nachfolgende Programm immer wieder durch einen Interrupt 
starten bzw das Programm soll durch eine andere PWM gestartet werden!
Da ich noch ein Blutiger Anfänger bin weiß ich nicht was ich falsch 
mache!
Danke schon mal für eure Hilfe im Vorraus!

Hier das Programm:


volatile int state = LOW;


void setup()
{

  pinMode(13, OUTPUT);
  attachInterrupt(0, blink, CHANGE);

}

void loop()
{
  -->muss ich hier noch eine while() einsetzen dass, das Programm 
unendlich
  läuft?

  tone(13, 5500, 5000);
  while(true) {}
}

void blink()
{
  state = !state;
}

von Markus M. (mark_m)


Lesenswert?

setup() wird nur einmal zum Programmstart ausgeführt. loop() wird 
endlos, ohne dein zutun, vom Arduino Framework aufgerufen. Innerhalb von 
loop() kein "while(true){}" da loop() sonst nicht mehr verlassen wird.

Du musst jetzt noch ein wenig Logik in loop() einbringen, damit Du 
keinen Dauerton erhältst.

Grüsse

von Karl H. (kbuchegg)


Lesenswert?

> durch einen Interrupt starten bzw das Programm soll durch eine andere
> PWM gestartet werden!

Diese Sichtweise ist grundsätzlich falsch.
Denn: Dein Programm läuft ja schon längst!
Da gibt es nichts mehr zu starten.

Die einzige Frage die du dir stellen kannst lautet, ob du nicht 
innerhalb von loop() (welches ja laufend immer wieder aufgerufen wird) 
mit einem if eine Entscheidung triffst, die abhängig von deiner 
Variablen 'start' einen Programmteil ausführt oder nicht ausführt.

Und wie Markus schon geschrieben hat: loop() darf nicht in einer 
Endlosschleife hängen bleiben.

von EGS (Gast)


Lesenswert?

Moin,

Ich würd dir empfehlen auf eine bestimmte Flanke des Interup-Inputs zu 
reagieren, z.B. auf die steigende.

volatile int state = LOW;


void setup()
{

  pinMode(13, OUTPUT);
  attachInterrupt(0, blink, Rising);

}

void loop() --> Dauerernde Abarbeitung
{

while(state = true) {
tone(13, 5500, 5000);
}

}

void blink() -->Interuptroutine
{
  state = !state;

}

Bei jeder Änderung des Interuptpins wird ja dein Interupt ausgelöst. 
Wenn du da nun noch Schwankungen/nicht entprellte Signale dran hast, 
wird "blink" jedesmal ausgeführt und somit dann auch Tone neu gestartet.

Zusätzlich muss dein Ton, wenn es nur in dem Fall, dass deine LED ein 
ist auch einen Ton geben soll in die While-Schleife...siehe oben.

MfG EGS

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und wie Markus schon geschrieben hat: loop() darf nicht in einer
>
> Endlosschleife hängen bleiben.

void loop()
{

}

Das ist ja in dieser Umgebung schon die Endlosschleife, sogesehen das 
"main" aus anderer C-Programmierung.

Wenn er keinen Interupt verwendet und mittels des Aufrufs:

tone();

dann

"void tone()

{
Programmtext...
return();
}"

aufruft, muss am ende von tone dann noch ein return(); angefügt werden, 
damit er wieder in loop landet. Für die Tone-Funktion ist dies aber 
großer Mist, weil dann auch die Tonerzeugung abbricht.

Hatte am Anfang auch Probleme, das er mir aus Unterprogrammen nicht 
wieder rauskam, irgendwie bin ich aber dann wieder drauf gekommen, das 
da was fehlen musste...

MfG EGS

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Karl Heinz Buchegger schrieb:
>> Und wie Markus schon geschrieben hat: loop() darf nicht in einer
>>
>> Endlosschleife hängen bleiben.
>
> void loop()
> {
>
> }
>
> Das ist ja in dieser Umgebung schon die Endlosschleife,

eben.
Die Schleife sitzt ausserhalb der loop().

> sogesehen das
> "main" aus anderer C-Programmierung.

Nö.
Auf einem Ardunio arbeitet man so, dass man ein main voraussetzt, 
welches so aussieht
1
int main()
2
{
3
  setup();
4
5
  sei();
6
7
  while(1)
8
  {
9
    loop();
10
  }
11
}

Hier steckt deine Hauptschleife, und der ganze Aufbau ist dir vorgegeben 
und liegt ausserhalb deines Einflussbreiches. D.h. in loop() kommt keine 
Endlosschleife rein, die erledigt der 'Aufrufer' von loop().


Wenn du schon das Arduino Framework benutzt, dann musst du MIT ihm 
arbeiten und nicht GEGEN es. Deine Schwierigkeiten zeigen, dass du 
unbedingt deinen Kopf durchsetzen willst, anstatt dich dem anzupassen, 
was dir das Framework vorgibt. Und so ein Framework kann stur sein :-)
Deine Ausdfürungen zu tone() sind für mich jetzt erst mal nicht 
verständlich, dein Verständnis von return ist fehlerhaft. Genauso wie 
dein Verständnis darüber, wie tone() arbeitet.

von Düsendieb (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Nö.
> Auf einem Ardunio arbeitet man so, dass man ein main voraussetzt,....

Wenn man aber aus Unwissen über diese schon existierende Hauptschleife 
noch eine While (1) Schleife in loop() einbaut, passiert doch auch 
nichts Schlimmes, oder?

Warum ist das verboten?

von Karl H. (kbuchegg)


Lesenswert?

Düsendieb schrieb:
> Karl Heinz Buchegger schrieb:
>> Nö.
>> Auf einem Ardunio arbeitet man so, dass man ein main voraussetzt,....
>
> Wenn man aber aus Unwissen über diese schon existierende Hauptschleife
> noch eine While (1) Schleife in loop() einbaut, passiert doch auch
> nichts Schlimmes, oder?

Das weiß ich nicht, weil ich nicht weiß, was in der Hautschleife an 
diesen Stellen
1
  while( 1 ) {
2
 
3
    xxxx
4
5
    loop();
6
7
    xxxx
8
  }
9
}

sonst noch so alles passiert.
Irgendwo muss ja auch das Arduino Framework seine Buchhaltung machen. So 
Dinge wie zb. die laufenden Millisekunden oder auch das Abschalten eines 
Tones (um beim Thema zu bleiben) nachdem seine Dauer abgelaufen ist, 
machen sich ja nicht von alleine.
Gib dem Framework seine Chance, die Dinge, die es vor oder nach dem 
Aufruf von loop() machen will, auch zu tun. Im 'schlimmsten' Fall macht 
das Framework hier nichts, weil sowieso alles Interrupt gesteuert 
abläuft. Dann ist der scheinbar unnötige laufende Aufruf von loop() aber 
der geringere Beinbruch, als wie wenn im Framework irgendwelche Dinge 
nicht funktionieren, weil du nicht nach den Regeln spielen willst.

von Fabian O. (xfr)


Lesenswert?

Düsendieb schrieb:
> Wenn man aber aus Unwissen über diese schon existierende Hauptschleife
> noch eine While (1) Schleife in loop() einbaut, passiert doch auch
> nichts Schlimmes, oder?

Das Arduino-Framework bekommt keine Rechenzeit mehr. Ich würde also 
damit rechnen, dass bestimmte Funktionen nicht mehr funktionieren. Das 
obige Hauptprogramm ist ja nicht vollständig, sondern da kommen noch die 
internen Funktionen des Frameworks dazu:
1
int main()
2
{
3
  aruino_intern_setup();
4
  setup();
5
6
  sei();
7
8
  while(1)
9
  {
10
    arduino_intern_loop();
11
    loop();
12
  }
13
}

Wenn Du in loop() eine Endlosschleife produzierst, wird 
arduino_intern_loop() nicht mehr aufgerufen. Alle Funktionen, die davon 
abhängen, funktionieren dann nicht mehr wie erwartet.

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Nö.
>
> Auf einem Ardunio arbeitet man so, dass man ein main voraussetzt,
>
> welches so aussieht

Hust, also was die IDE im Hintergrund macht ist jetzt nicht das Thema, 
aber die IDE und Dokumentation sagt unbestreitbar:

loop ist die Hauptschleife des immer abgearbeiteten Programmcodes. Setup 
nur einmal zum µC-Start/Reset.

Da  man auch innerhalb des Void loop ander Routinen aufrufen kann bin 
ich nicht nur an diese struktur gebunden. Wichtig ist nur, dass ich 
wieder dahin zurückkehren muss, wenn ich auf den Aufruf folgende 
Anweisungen auführen möchte.

Bestes Beispiel:

ich rufe in einem Programm im eine LCD-Ansteuerung auf:

void loop()
{
LCD();

 weitere Anweisungen... //werden nur abgearbeitet wenn ich aus LCD() 
zurückspringe (egal ob bedingt oder absolut)
}

LCD()
{
LCD Befehle...
return(); --> muss sein damit ich in loop wieder lande.
}

von Düsendieb (Gast)


Lesenswert?

Hallo Karl-Heinz,
ich habe auch gerade meine ersten Arduino Erfahrungen gemacht und aus 
alter Gewohnheit das Programm mit der while(1) Schleife aufgebaut. 
Beschwert hat sich der Apparat nicht und das Programm macht auch was ich 
erwartet habe.

Diese ominösen delay Konstrukte werde ich sowieso nie nutzen.

Axel

von EGS (Gast)


Lesenswert?

EGS schrieb:
> loop ist die Hauptschleife des immer abgearbeiteten Programmcodes. Setup
>
> nur einmal zum µC-Start/Reset.

wenn ich aber eine andere Routine aufrufe, wird das Hauptprogramm 
natürlich hier unterbrochen, bis ich an die Stelle zurückspringe.

Das ist bei euch auch so ohne die Arduino IDE.

Eigentlich sind es alles nur wahr oder falsch vergleiche die dann 
bedingte oder absolute Sprünge ausführen. Die IDE macht aus "LCD(); nur 
den aufruf eines Bestimmten Programmspeicherbereiches.

von Karl H. (kbuchegg)


Lesenswert?

Düsendieb schrieb:
> Hallo Karl-Heinz,
> ich habe auch gerade meine ersten Arduino Erfahrungen gemacht und aus
> alter Gewohnheit das Programm mit der while(1) Schleife aufgebaut.
> Beschwert hat sich der Apparat nicht

Natürlich beschwert sich da keiner.
Was erwartest du vom Compiler? Dass er deine Programmlogik überprüft?

> und das Programm macht auch was ich
> erwartet habe.

Ach, weißt du was.
Macht doch was ihr wollt
Ich bin es leid, erwachsene Männer in der Programmierung erziehen zu 
müssen.

von Fabian O. (xfr)


Lesenswert?

EGS schrieb:
> LCD()
> {
> LCD Befehle...
> return(); --> muss sein damit ich in loop wieder lande.
> }

Nö. Wenn die Funktion LCD() zu Ende ist, wird auch ohne explizites 
return automatisch zurückgesprungen. Was soll denn sonst passieren?

von EGS (Gast)


Lesenswert?

Düsendieb schrieb:
> Hallo Karl-Heinz,
> ich habe auch gerade meine ersten Arduino Erfahrungen gemacht und aus
> alter Gewohnheit das Programm mit der while(1) Schleife aufgebaut.
> Beschwert hat sich der Apparat nicht und das Programm macht auch was ich
> erwartet habe.
>
> Diese ominösen delay Konstrukte werde ich sowieso nie nutzen.
>
> Axel

Die ominösen "delay()" konstrukte sind in den normalen AVR studiosn auch 
drin. Hier heissen diese dann halt "wait()" und im Arduino benutzt man 
den Programmlaufzeittimer wenn man kein Delay haben möchte.

Denn wie der Name delay() oder wait() bereits impleziert wird der 
Prozessor hier zum warten und nixtun verdammt. alle anderen 
Programmteile laufen dann richtigerweise auch nicht weiter.

Ein gutes Beispiel wo dies in Software auch drin ist ist Java. hier kann 
man sein ganzes System mit der Wartefunktion auslasten , obwohl nix 
passiert ;)

MfG EGS

von Düsendieb (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ach, weißt du was.
> Macht doch was ihr wollt
> Ich bin es leid, erwachsene Männer in der Programmierung erziehen zu
> müssen.

Hallo Karl Heinz,
mach bitte weiter, soviel fundiertes Wissen und so viel 
Hilfsbereitschaft wie bei Dir ist echt klasse.


Axel

von EGS (Gast)


Lesenswert?

Fabian O. schrieb:
> Nö. Wenn die Funktion LCD() zu Ende ist, wird auch ohne explizites
>
> return automatisch zurückgesprungen. Was soll denn sonst passieren?
>
>
>
> Beitrag melden Bearbeiten Löschen

Die Arduino IDE macht wie schon gesagt daraus nen Sprungbefehl, mit der 
Anweisung "Return();" springt er an den Punkt von dem der Sprungbefehl 
aufgerufen wurde zurück.

Anscheinend war/ist die IDE in diesem Fall darauf angewiesen. Getestet 
mit einem Belichtungstimer der seine Werte auf einerm LCD (Sollzeit, 
Restzeit, Belichtungsstärke und Gehäuseinnentemperatur über einem LM75) 
darstellt.

MfG EGS

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Fabian O. schrieb:
>> Nö. Wenn die Funktion LCD() zu Ende ist, wird auch ohne explizites
>>
>> return automatisch zurückgesprungen. Was soll denn sonst passieren?
>>
>>
>>
>> Beitrag melden Bearbeiten Löschen
>
> Die Arduino IDE macht wie schon gesagt daraus nen Sprungbefehl, mit der
> Anweisung "Return();" springt er an den Punkt von dem der Sprungbefehl
> aufgerufen wurde zurück.

Sorry.
Aber du redest einfach nur Unsinn.

Die IDE hast schon mal überhaupt nichts damit zu tun.
Und eine Funktion kehrt immer zu ihrem Aufrufer zurück. Entweder 
vorzeitig, wenn sie auf ein return trifft, oder wenn der Programmfluss 
durch die Funktion zu Ende ist. So gesehen hat jede Funktion an ihrem 
unteren Ende einen impliziten return.

Und das hat auch nichts mit Arduino zu tun, sondern das ist in der 
Programmiersprache C++ so festgelegt.

> Getestet mit

Keine Ahnung was du dir wieder eingehandelt hast, weil du nicht nach den 
Regeln spielen willst. Und ich wills auch nicht wissen.
Aber hör bitte auf hier Unsinn zu verzapfen.

von F. F. (foldi)


Lesenswert?

Dann schaut mal dort nach:
http://arduino.cc/en/Tutorial/WhileLoop

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Keine Ahnung was du dir wieder eingehandelt hast, weil du nicht nach den
>
> Regeln spielen willst. Und ich wills auch nicht wissen.
>
> Aber hör bitte auf hier Unsinn zu verzapfen.

Sorry aber leider scheinst du nicht zu wissen was die Arduino IDE ist. 
Das ist dein Interpreter der daraus den Programmcode compiliert. 
Solltest du eigentlich wissen.

Lies bitte erst die Doku zu den Arduinos bevor du mir irgendwas 
unterstellst.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Karl Heinz Buchegger schrieb:
>> Keine Ahnung was du dir wieder eingehandelt hast, weil du nicht nach den
>>
>> Regeln spielen willst. Und ich wills auch nicht wissen.
>>
>> Aber hör bitte auf hier Unsinn zu verzapfen.
>
> Sorry aber leider scheinst du nicht zu wissen was die Arduino IDE ist.
> Das ist dein Interpreter der daraus den Programmcode compiliert.

Ja, genau
(Facepalm)


> Lies bitte erst die Doku zu den Arduinos bevor du mir irgendwas
> unterstellst.

Das würde ich dir als Arduino-Programmierer erst mal sehr ans Herz 
legen.

http://arduino.cc/en/Reference/loop

Wo siehst du hier in der Doku, dass in loop eine while Schleife 
stattfindet?

http://arduino.cc/en/Tutorial/Sketch

Scroll runter zu "Setup und Loop"
Welchen Teil von
" The loop() function is called over and over and is heart of most 
sketches."
verstehst du nicht?

von F. F. (foldi)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wo siehst du hier in der Doku, dass in loop eine while Schleife
> stattfindet?

Hier z.B.: http://arduino.cc/en/Tutorial/WhileLoop

Code Ausschnitt:
1
void setup() {
2
  // set the LED pins as outputs and the switch pin as input:
3
  pinMode(indicatorLedPin, OUTPUT);
4
  pinMode (ledPin, OUTPUT);
5
  pinMode (buttonPin, INPUT);
6
}
7
8
void loop() {
9
  // while the button is pressed, take calibration readings:
10
  while (digitalRead(buttonPin) == HIGH) {
11
    calibrate(); 
12
  }
13
  // signal the end of the calibration period
14
  digitalWrite(indicatorLedPin, LOW);

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und das hat auch nichts mit Arduino zu tun, sondern das ist in der
>
> Programmiersprache C++ so festgelegt.

C und C++ sind zwar nahe Verwandte aber die Arduino Programmiersprache 
ist eher C als C++ vermenge das mal nicht.

Karl Heinz Buchegger schrieb:
> Wo siehst du hier in der Doku, dass in loop eine while Schleife
>
> stattfindet?
>
>
>
> http://arduino.cc/en/Tutorial/Sketch
>
>
>
> Scroll runter zu "Setup und Loop"
>
> Welchen Teil von
>
> " The loop() function is called over and over and is heart of most
>
> sketches."
>
> verstehst du nicht?
>

Weiss nicht was du mir da in den Mund legen willst, aber ich habe nix 
gegenteiliges behauptet. ich sagte nur, dass wenn ich einen Sprung 
ausführe dem Programm sagen muss, dass wieder zurückspringen muss.

Entweder die Funktion die den Sprung auslöst (z.B. delay(); ) macht dies 
von sich aus oder ich muss dafür sorgen, dass ich an der Ausgangsadresse 
im Programmcode wieder mit dem hauptprogramm weitermache. Ansonsten 
arbeite ich den Programmcode ab der auf meine Sprungziel folgt.

Nixc anderes habe ich gesagt, und wenn du denkst das ist Unsinn, bitte.

von Karl H. (kbuchegg)


Lesenswert?

Frank Frank schrieb:
> Karl Heinz Buchegger schrieb:
>> Wo siehst du hier in der Doku, dass in loop eine while Schleife
>> stattfindet?
>
> Hier z.B.: http://arduino.cc/en/Tutorial/WhileLoop

ACh geh bitte, Frank.

Da gehts doch um ganz was anderes.


> void loop() {
>   // while the button is pressed, take calibration readings:
>   while (digitalRead(buttonPin) == HIGH) {
>     calibrate();
>   }

hier wird so lange gewartet, bis die Kalibrierung fertig ist.
Das hat doch überhaupt nichts damit zu tun, ob man jetzt den kompletten 
Inhalt von loop in eine Endlosschleife packt,
1
void loop()
2
{
3
  while( 1 ) {
4
5
    xyz
6
7
  }
8
}

oder ob man die Endlossschleife vom Aufrufer
1
void loop()
2
{
3
  xyz
4
}

erledigen lässt.

Steht doch auch in dem von dir verlinkten Beispiel: solange die Schleife 
läuft, geht nichts anderes mehr.
Nicht alles was hinkt, ist auch ein Argument.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Karl Heinz Buchegger schrieb:
>> Und das hat auch nichts mit Arduino zu tun, sondern das ist in der
>>
>> Programmiersprache C++ so festgelegt.
>
> C und C++ sind zwar nahe Verwandte aber die Arduino Programmiersprache
> ist eher C als C++ vermenge das mal nicht.

Es gibt kein 'Eher'.
Entweder du programmierst C oder du programmierst C++

Gibt es in C Klassen?
Nein
Gibt es im Arduino Framework Klassen?
Ja

Kann daher das Arduino Framework und damit auch Arduino Programme C 
sein?`
Nein

> Nixc anderes habe ich gesagt

Was du behauptet hast ist, dass du hier
1
void loop()
2
{
3
LCD();
4
5
 weitere Anweisungen... //werden nur abgearbeitet wenn ich aus LCD() 
6
zurückspringe (egal ob bedingt oder absolut)
7
}
8
9
LCD()
10
{
11
LCD Befehle...
12
return(); --> muss sein damit ich in loop wieder lande.
13
}
den return brauchst, weil sonst irgendwelche dubiosen Sachen passieren.
Und das ist einfach nur Unsinn.
Lern doch bitte erst mal deine Programmiersprache richtig, ehe du dich 
mit mir anlegst.
Ich diskutier doch auch nicht mit den Jungs von der BMW 
Motorenentwicklung darüber ob der Spalt in den Diesel-Vorglühkerzen(!) 4 
oder 5 hunderstel Millimeter groß sein muss und wundere mich dann 
darüber, dass mir die den Vogel zeigen.

von F. F. (foldi)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Frank Frank schrieb:
>> Karl Heinz Buchegger schrieb:
>>> Wo siehst du hier in der Doku, dass in loop eine while Schleife
>>> stattfindet?
>>
>> Hier z.B.: http://arduino.cc/en/Tutorial/WhileLoop
>
> ACh geh bitte, Frank.
>
> Da gehts doch um ganz was anderes.

> Steht doch auch in dem von dir verlinkten Beispiel: solange die Schleife
> läuft, geht nichts anderes mehr.
> Nicht alles was hinkt, ist auch ein Argument.

Du hast ja recht in allem was du sagst, es war nur der Hinweis, dass es 
generell nicht "verboten" ist.

von Karl H. (kbuchegg)


Lesenswert?

Frank Frank schrieb:

> Du hast ja recht in allem was du sagst, es war nur der Hinweis, dass es
> generell nicht "verboten" ist.


Ja ... wenn einem der Zusatz '... geht nichts anderes mehr ...' egal ist 
oder man das sogar genau so haben möchte.

verboten ist grundsätzlich in der Programmierung überhaupt nichts. Ich 
kann durch 0 dividieren soviel ich lustig bin. Mein Programm wird zwar 
nicht das tun, was ich eigentlich will, aber niemand kann mich daran 
hindern es zu tun. Und schon gar nicht der Compiler.

von F. F. (foldi)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Frank Frank schrieb:
>
>> Du hast ja recht in allem was du sagst, es war nur der Hinweis, dass es
>> generell nicht "verboten" ist.
>
>
> Ja ... wenn einem der Zusatz '... geht nichts anderes mehr ...' egal
> ist oder man das sogar genau so haben möchte.
>
> verboten ist grundsätzlich in der Programmierung überhaupt nichts. Ich
> kann durch 0 dividieren soviel ich lustig bin. Mein Programm wird zwar
> nicht das tun, was ich eigentlich will, aber niemand kann mich daran
> hindern es zu tun. Und schon gar nicht der Compiler.

Karl Heinz,

auf Arduino.cc gibt es genau die Hinweise und Warnungen, die du hier 
beschrieben hast. Der Vergleich mit der "Null" ist gut.

Soll er erstmal Beispiel abschreiben, verändern und dann sieht er wie 
das funktioniert.

von Verwirrter Anfänger (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb
> Es gibt kein 'Eher'.
> Entweder du programmierst C oder du programmierst C++
>
> Gibt es in C Klassen?
> Nein
> Gibt es im Arduino Framework Klassen?
> Ja
>
> Kann daher das Arduino Framework und damit auch Arduino Programme C
> sein?`
> Nein

Um dass nochmal zu erweitern.

Aus dem Arduino FAQ:
> Can I program the Arduino board in C?

>In fact, you already are; the Arduino language is merely a set of C/C++ functions
>that can be called from your code. Your sketch undergoes minor changes (e.g.
>automatic generation of function prototypes) and then is passed directly to a
>C/C++ compiler (avr-g++). All standard C and C++ constructs supported by avr-g++
>should work in Arduino. For more details, see the page on the Arduino build
>process.

(http://arduino.cc/en/Main/FAQ)

Der Code wird also nach kleinen Anpassungen an avr-g++ weitergeleitet. 
Und da sich avr-g++ ganz gut an die Sprachstandards hält, verhalten sich 
Funktionen auch genauso wie in allen anderen C++ Programmen.

von Karl H. (kbuchegg)


Lesenswert?

Verwirrter Anfänger schrieb:

> Der Code wird also nach kleinen Anpassungen an avr-g++ weitergeleitet.
> Und da sich avr-g++ ganz gut an die Sprachstandards hält, verhalten sich
> Funktionen auch genauso wie in allen anderen C++ Programmen.

Genau.
Das in diesem Text immer von C/C++ als Sprache die Rede ist, schreibe 
ich der 'Vorsicht der Dokuschreiber' zu, die verhindern wollen, dass die 
Leute gleich mal beim Lesen von C++ die Hände über dem Kopf 
zusammenschlagen.
Eine Sprache C/C++ gibt es nicht. Es gibt C und es gibt C++. Bis auf 
einige Ausnahmen ist gültiges C auch gültiges C++, so dass viele Leute 
immer das Gefühl haben, man könne beides so gesehen in einen Topf 
werfen. Aber streng genommen stimmt das nicht - was allerdings für 95% 
aller C-Programmierer ziemlich irrelevant sein dürfte. Die Dinge, die in 
C++ - 'Subset' (nicht wörtlich nehmen) anders sind als in echtem C, sind 
entweder schnell angepasst, oder sowieso verpönt.

von EGS (Gast)


Angehängte Dateien:

Lesenswert?

Sorry, Mittagspause...

Also Karl Heinz, es geht nicht darum ob die IDE C oder C++ benutzt, da 
stimme ich dir ja zu. Es ging darum, das du mir unterstellt hast, dass 
ich mit dem:

while(state = 1);{... ne Endlosschleife starten wollte.

Ich habe nur gesagt, dass das "void loop(){..} das dem Main aus anderen 
Compilern gleichzusetzen ist.

Im void läuft der hauptprogrammcode ab(wie du auch richtig aus der FAQ 
reuszitiert hast). Wenn ich aber eine weitere Programmroutine aufrufe 
führe ich einen Sprung im Programmcode aus an die Speicheradresse des 
Programmes in dem die betrefenden Anweisungen hinterlegt sind. Wenn ich 
dann nicht explizit sage ich will an der Quelleadresse des Sprunges mit 
der Programmabarbeitung fortfahren, werden die Programmteile des main 
nicht weiter abgearbeitet außer ich komme wieder an eine Stelle, die 
mich mittels Sprungbefehls wieder in den main/loop zurückführt.

Und mein while(state = 1) sollte ihm bloss sagen, das er den Ton bloss 
erzeugen soll wenn sein Ausgangspin aktiv ist. ich hätte ihm da auch 
nen:

if(state = 1)
{..}

oder

switch(state)
case 1{
...}
case 0{
...} empfehlen können.

Es ist aber egal, welchen ich davon empfehle, denn in der Mmemonik 
werden die Befehle in Sprungbefehlen (rjmp, spb, spa, jmp,...) 
umgewandelt und an der Zieladresse Register und Akku-Operationen 
hinterlegt. Und das hat nix mit C/C++ zu tun.

Und da kannst du nix dran ändern und im C++ noch so viel anders machen 
wollen, das ist der Maschinencode.

von Fabian O. (xfr)


Lesenswert?

EGS schrieb:
> Ich habe nur gesagt, dass das "void loop(){..} das dem Main aus anderen
> Compilern gleichzusetzen ist.

Und das ist falsch.

> Wenn ich aber eine weitere Programmroutine aufrufe
> führe ich einen Sprung im Programmcode aus an die Speicheradresse des
> Programmes in dem die betrefenden Anweisungen hinterlegt sind. Wenn ich
> dann nicht explizit sage ich will an der Quelleadresse des Sprunges mit
> der Programmabarbeitung fortfahren, werden die Programmteile des main
> nicht weiter abgearbeitet außer ich komme wieder an eine Stelle, die
> mich mittels Sprungbefehls wieder in den main/loop zurückführt.

Das ist völliger Blödsinn. Eine Funktion springt automatisch an die 
Stelle ihres Aufrufs zurück, wenn sie ans Ende gelangt. Sie fängt nicht 
wieder von vorne an oder führt irgendwelchen anderen Programmcode aus.

> Und mein while(state = 1) sollte ihm bloss sagen, das er den Ton bloss
> erzeugen soll wenn sein Ausgangspin aktiv ist. ich hätte ihm da auch
> nen:
>
> if(state = 1)
> {..}
>
> oder
>
> switch(state)
> case 1{
> ...}
> case 0{
> ...} empfehlen können.
>
> Es ist aber egal, welchen ich davon empfehle

Nein. Denn bei einem while wird die loop()-Funktion nicht verlassen und 
die Arduino-internen Funktionen kommen nicht zum Zug.

von EGS (Gast)


Lesenswert?

Fabian O. schrieb:
> Nein. Denn bei einem while wird die loop()-Funktion nicht verlassen und
>
> die Arduino-internen Funktionen kommen nicht zum Zug.

? Hab och auch nicht behauptet, aber wie gesagt, das ist der C-Code.

Wenn ich nen while einbinde, wird in Mmemonik darasus >>springe bedingt 
zu Adresse<<. Und wenn du du mal in das Datenblatt der Atmels schauen 
würdest und nicht von den Compiler ausgehst die du in C oder C++ 
fütterst würdest du sehen, wieviele "ret" (= return, die Quell-Adresse 
wird im Adressregister hinterlegt) ein Mmemonik-Code enthält.

Deswegen habe ich ja bereits gesagt, die Funktion muss dieses return 
bereits enthalten, ansonsten muss ich selber dafür sorgen das es 
vorhanden ist.

Verwirrter Anfänger schrieb:
> the Arduino language is merely a set of C/C++ functions
>
>>that can be called from your code. Your sketch undergoes minor changes (e.g.
>
>>automatic generation of function prototypes

Funktionen!=Klassen...

von Josef D. (jogedua)


Lesenswert?

> Also Karl Heinz, es geht nicht darum ob die IDE C oder C++ benutzt, da
> stimme ich dir ja zu. Es ging darum, das du mir unterstellt hast, dass
> ich mit dem:
>
> while(state = 1);{... ne Endlosschleife starten wollte.
>

while(state = 1); IST eine Endlosschleife!

von Karl H. (kbuchegg)


Lesenswert?

EGS wir drehen uns im Kreis

Auf der einen Seite willst du in einer Programmiersprache programmieren, 
auf der anderen Seite lehnst du es ab, die Regeln der Sprache zu 
akzeptieren.

Was soll das?

von Karl H. (kbuchegg)


Lesenswert?

> Ich habe nur gesagt, dass das "void loop(){..} das dem Main aus
> anderen Compilern gleichzusetzen ist.

Nein.
Es ist dem inneren (markiertem) Teil von
1
int main()
2
{
3
  ...
4
5
  while( 1 ) {
6
7
    irgendwas
8
9
    >>>>>> hier kommt der Inhalt von loop()   <<<<<<
10
  }
11
}

gleichzusetzen!
Über den Rest dieses, vom Framework vorgegeben, main() hast du keine 
Kontrolle. Also mach auch keine Annahmen drüber.

von Karl H. (kbuchegg)


Lesenswert?

> Es ist aber egal, welchen ich davon empfehle, denn in der
> Mmemonik werden die Befehle in Sprungbefehlen
> (rjmp, spb, spa, jmp,...) umgewandelt und an der Zieladresse
> Register und Akku-Operationen hinterlegt.
> Und das hat nix mit C/C++ zu tun.

Richtig. Das hat nicht das geringste mit C bzw. C++ zu tun.
Warum führst du es dann an?

von spess53 (Gast)


Lesenswert?

Hi

>while(state = 1); IST eine Endlosschleife!

Nicht unbedingt. 'state' kann immer noch in einer Interruptroutine 
verändert werden. Und dann ist es eine Endlichschleife.

MfG Spess

von EGS (Gast)


Lesenswert?

Josef D. schrieb:
>> Also Karl Heinz, es geht nicht darum ob die IDE C oder C++ benutzt, da
>> stimme ich dir ja zu. Es ging darum, das du mir unterstellt hast, dass
>> ich mit dem:
>>
>> while(state = 1);{... ne Endlosschleife starten wollte.
>>
>
> while(state = 1); IST eine Endlosschleife!

Nö eben nicht, denn "state" ist eine Variable, die durch die 
Interuptroutine beinflusst wird. Durch dden Befehl "state=!state" wird 
dieser bei auftreten des Interupts negiert, daher ist er nicht immer 
wahr, woraus folgt, das die Programmteile aus der while-Schleife nur bei 
state == 1.

aber ich seh grad ich hab nen "=" vergessen, dann ist es berechtigt. 
Soll natürlich while(state == 1) heißen...t'schuldigung.

MfG EGS

von Fabian O. (xfr)


Lesenswert?

EGS schrieb:
> Wenn ich nen while einbinde, wird in Mmemonik darasus >>springe bedingt
> zu Adresse<<. Und wenn du du mal in das Datenblatt der Atmels schauen
> würdest und nicht von den Compiler ausgehst die du in C oder C++
> fütterst würdest du sehen, wieviele "ret" (= return, die Quell-Adresse
> wird im Adressregister hinterlegt) ein Mmemonik-Code enthält.

> Deswegen habe ich ja bereits gesagt, die Funktion muss dieses return
> bereits enthalten, ansonsten muss ich selber dafür sorgen das es
> vorhanden ist.

Es geht hier um die Programmierung des Arduinos in C++. Dazu muss man 
überhaupts nichts über den Maschinencode des Prozessors wissen. Sondern 
man muss die Regeln von C++ kennen. Die besagen, dass am Ende einer 
Funktion zurückgesprungen wird. Der Compiler fügt das ret also 
automatisch ein, auch ohne dass man explizit return schreibt.

von Karl H. (kbuchegg)


Lesenswert?

> Deswegen habe ich ja bereits gesagt, die Funktion muss dieses
> return bereits enthalten,

Das tut sie doch!

Deine Assembler Betrachtungen in allen Ehren. Aber die interessieren 
hier keinen!
Wie die Sprache C++ (oder meinetwegen auch C) funktioniert, definiert 
der Sprachstandard und nicht irgendwelche Assembler-Instruktionen! Es 
ist Aufgabe des Compilers, diejenigen Instruktionen auszuwählen, die dem 
entsprechen, was der Sprachstandard für den von mir niedergeschriebenen 
C-Code vorsieht.

> ansonsten muss ich selber dafür sorgen das es
> vorhanden ist.
Quatsch. Hältst du Compilerbauer wirklich für so blöd, dass sie nicht 
wissen, was am Ende einer Funktion zu tun ist?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
>> Deswegen habe ich ja bereits gesagt, die Funktion muss dieses
>> return bereits enthalten,
>
> Das tut sie doch!
>
> Deine Assembler Betrachtungen in allen Ehren. Aber die interessieren
> hier keinen!
> Wie die Sprache C++ (oder meinetwegen auch C) funktioniert, definiert
> der Sprachstandard und nicht irgendwelche Assembler-Instruktionen! Es
> ist Aufgabe des Compilers, diejenigen Instruktionen auszuwählen, die dem
> entsprechen, was der Sprachstandard für den von mir niedergeschriebenen
> C-Code vorsieht.

und ich vergaß dazuzuschreiben (wenn schon, dann wollen wir auch genau 
sein):

... und zwar so, dass sich dadurch die vom Sprachstandard geforderte 
Funktionalität ergibt.

Langer Rede kurzer Sinn:
Als Programmierer orientiere ich mich daran, was mir der Sprachstandard 
garantiert und welche Funktionalität er mir garantiert.
Wie das dann auf Op-Code Ebene realisiert wird, ist Aufgabe des 
Compilers und hat mich zuallererst mal nicht zu interessieren.

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Richtig. Das hat nicht das geringste mit C bzw. C++ zu tun.
>
> Warum führst du es dann an?

Weil deine Compiler aus diesen C oder C++ Codeabschnitten einen vom 
Interpreter verständlichen Code formt, und auf diese Arbeistweise muss 
man sich beziehen. Denn hier finden dann die Sprünge statt.

Das das Void loop nicht genau dem main entspricht ist mir klar, ich habe 
bloss einen Ausdruck ("gleichzusetzen") benutzt, der nicht auch 
"ebenbürtig" oder "genau das selbe" bedeutet. In der Arduino IDE ist das 
void loop halt das main der AVR-Studios, darauf soll es hinauslaufen.

EGS schrieb:
> Das ist ja in dieser Umgebung schon die Endlosschleife, sogesehen das
>
> "main" aus anderer C-Programmierung.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:

> Das das Void loop nicht genau dem main entspricht ist mir klar, ich habe
> bloss einen Ausdruck ("gleichzusetzen") benutzt, der nicht auch
> "ebenbürtig" oder "genau das selbe" bedeutet.

Dein Problem ist, dass du dich eigentlich in fast allem höchst ungenau 
ausdrückst. Genauer gesagt, drückst du dich sehr oft sehr schwammig aus 
und versuchst dich dann hinterher wieder herauszuwinden.

> In der Arduino IDE ist das

Die IDE interessiert schon mal überhaupt keinen.
IDE = Integrated Development Environment
Das ist also einfach die Entwicklungsumgebung.
 Projektverwaltung, Editor, Compiler, Linker

> void loop halt das main der AVR-Studios, darauf soll es hinauslaufen.

und als wie 'ungenau' soll ich jetzt diese Aussage wieder auffassen?
Zum 10-ten mal: Nein. Diese angedeutete 'Entsprechung' ist nicht 
zulässig.

loop() entspricht einem Teil des main() aus der Nicht-Arduino Welt. Aber 
ein Teil ist nicht das Ganze.

Mehr Präzission, wo es notwendig ist!

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Quatsch. Hältst du Compilerbauer wirklich für so blöd, dass sie nicht
>
> wissen, was am Ende einer Funktion zu tun ist?

Eigene Funktionen schreiben und nen *.h-File daraus erstellen, dann 
musst du dies selber vorsehen.

Ansonsten ist man auch so nix anderes als die meisten hier immer über 
Arduino-Benutzer meckern. Man benutzt fertige Funktionen (libaries), die 
man ja dann nicht vertsehn muss was in ihnen passiert, nur das drumherum 
interessiert.

Welche Operationen hinter logischen und arithmetischen Operationen im C 
oder C++ stehen sind dann meistens doch ganz gut zu wissen.

PS: wenn du dann auch noch beruflich dich mit Step7 AWL-Programmen 
auseinandersetzen darfst wirst du merken das dir C da nicht mehr 
weiterhilft, AWL ist hardwarenahe Programmierung, weil bereits in 
MMemonik. Da schreibst du deine Funktionen selber. Hier vergisst du nur 
einmal den bedingten oder absoluten rücksprung, ansonsten vergisst du 
einen Zykluss lang nen ganzen Programmteil, was dann schnell mal richtig 
Geld kostet.

von Karl H. (kbuchegg)


Lesenswert?

Und, ach ja:

> Weil deine Compiler aus diesen C oder C++ Codeabschnitten einen
> vom Interpreter verständlichen Code formt

Einen Interpreter gibt es schon mal gar nicht.
Es sei denn, du betrachtest die Befehlsdekodierung und Ausführung 
innerhalb der CPU als 'Interpreter' - was allerdings eine eher unübliche 
Sicht der Dinge ist. Unter einem Interpreter versteht man in der 
Informatik was anderes, selbst wenn man die in Silizium gegossene Logik 
in weitesten Sinne auch als eine Art Interpreter, realisiert durch 
Mikrocode, bezeichnen könnte.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Karl Heinz Buchegger schrieb:
>> Quatsch. Hältst du Compilerbauer wirklich für so blöd, dass sie nicht
>>
>> wissen, was am Ende einer Funktion zu tun ist?
>
> Eigene Funktionen schreiben und nen *.h-File daraus erstellen, dann
> musst du dies selber vorsehen.

Was für ein Unsinn.


> PS: wenn du dann auch noch beruflich dich mit Step7 AWL-Programmen
> auseinandersetzen darfst wirst du merken das dir C da nicht mehr
> weiterhilft, AWL ist hardwarenahe Programmierung, weil bereits in
> MMemonik. Da schreibst du deine Funktionen selber. Hier vergisst du nur
> einmal den bedingten oder absoluten rücksprung, ansonsten vergisst du
> einen Zykluss lang nen ganzen Programmteil, was dann schnell mal richtig
> Geld kostet.

Hier geht es aber nicht um AWL oder Step7
Hier geht es um C++ bzw. C

Ich kann nur hoffen, dass du dich in AWL besser auskennst als in C. Denn 
sonst hast du mit "richtig Geld kostet" voll ins Schwarze getroffen.

Ich kenn mich mit AWL nicht aus, daher melde ich mich auch nicht zu 
Wort, wenn es darum geht. Aber mit C kenn ich mich richtig gut aus und 
daher sag ich dir ... du erzählst hier C-Neulingen Unsinn.

von Fabian O. (xfr)


Lesenswert?

EGS schrieb:
> In der Arduino IDE ist das
> void loop halt das main der AVR-Studios, darauf soll es hinauslaufen.

Der Satz wird durch Wiederholen nicht korrekter. Erstens hat das nichts 
mit den IDEs zu tun und zweitens ist es schlichtweg falsch. Die 
main()-Funktion in C/C++ wird nur ein einziges Mal zu Beginn des 
Programms aufgerufen. Die loop()-Funktion wird dagegen vom 
Arduino-Framework in einer Endlosschleife wiederholt aufgerufen. So 
gesehen ist die setup()-Funktion der main()-Funktion ähnlicher als 
loop().

Aber was bringen solche schwammigen Aussagen? Außer Verwirrung von 
Anfängern tragen sie nichts zum Thema bei. Wenn man mit dem 
Arduino-Framework programmiert muss man die Funktionen so benutzen wie 
vorgesehen. Dazu gehört, dass man in loop() nicht selber eine 
Endlosschleife definiert.

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die IDE interessiert schon mal überhaupt keinen.
>
> IDE = Integrated Development Environment
>
> Das ist also einfach die Entwicklungsumgebung.
>
>  Projektverwaltung, Editor, Compiler, Linker

An der hast du dich hochgezogen, da lass ich mir das Wort im Munde nicht 
umdrehen.

Die schwammige Formulierung des Vergleichs soll ja auch so sein, da Sie 
nicht als ebenbürtig anzusehen sind.

main ist auch nicht das ganze. Da die Hauptfunktion des loop und des 
main aber eine dauerhaft immer wieder abgearbeitete Programmstruktur 
enthält sogesehen das gleiche machen. aus dem loop heraus rufen die 
Funktionen die anderen inkludierten Programmfunktionen auf, die du 
entweder im main bei dir hast oder auch über "#include lcd.h" bei dir 
hast. Dein main ist auch nicht alles.

von Fallobst (Gast)


Lesenswert?

EGS schrieb:
> Das ist dein Interpreter der daraus den Programmcode compiliert.

EGS schrieb:
> Interpreter verständlichen Code formt

YMMD!

PS: Es gibt hier keinen Interpreter!


EGS schrieb:
> und auf diese Arbeistweise muss
> man sich beziehen. Denn hier finden dann die Sprünge statt.

Das wird der Compiler schon richtig machen. Man muss sich als reiner 
C-Programmierer damit überhaupt nicht auseinandersetzen.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Karl Heinz Buchegger schrieb:
>> Die IDE interessiert schon mal überhaupt keinen.
>>
>> IDE = Integrated Development Environment
>>
>> Das ist also einfach die Entwicklungsumgebung.
>>
>>  Projektverwaltung, Editor, Compiler, Linker
>
> An der hast du dich hochgezogen, da lass ich mir das Wort im Munde nicht
> umdrehen.

Ich hab mich an der IDE hochgezogen?
Wo genau?

Kann natürlich sein, dass ich mich mal vertippt habe. Aber ansonsten hab 
ich ständig auf das Framework verwiesen.
Framework  !=   IDE



> main ist auch nicht das ganze. Da die Hauptfunktion des loop und des
> main aber eine dauerhaft immer wieder abgearbeitete Programmstruktur
> enthält sogesehen das gleiche machen. aus dem loop heraus rufen die
> Funktionen die anderen inkludierten Programmfunktionen auf, die du
> entweder im main bei dir hast oder auch über "#include lcd.h" bei dir
> hast. Dein main ist auch nicht alles.

Selbst wenn ich ein Auge zudrücke, enthält dieser Absatz schon wieder so 
viele Dinge, die auf ein Nichtverstehen der tatsächlichen Sachlage 
schliessen lassen, dass ich mir das jetzt einfach mal spare darauf 
einzugehen.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Selbst wenn ich ein Auge zudrücke, enthält dieser Absatz schon wieder so
> viele Dinge, die auf ein Nichtverstehen der tatsächlichen Sachlage
> schliessen lassen,


Entweder das, oder du verwendest die Wörter tatsächlich in einer eigenen 
Bedeutung, die du anlassbezogen gerade erfindest, wenn du die Wörter 
benutzt.
In diesem Falle ist jegliche weitere Diskussion sinnlos - obwohl ich 
sowieso der Meinung bin, dass sie sinnlos ist. Nur sollten spätere Leser 
nicht auf eine falsche Fährte gelockt werden.

von EGS (Gast)


Lesenswert?

Fallobst schrieb:
> PS: Es gibt hier keinen Interpreter!

http://www.elektronik-kompendium.de/sites/com/1705231.htm

Wenn der Compiler es aber nicht richtig macht, muss man entweder selber 
wissen was los ist oder wartet aufs update vom Entwickler des 
Compilers...

Schöne Sache so kommt die ganze Bananen-Software zustande...

YMMD

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

EGS schrieb:
> main ist auch nicht das ganze. [...]

EGS, wenn man Dir zuhört, ist das genauso wie einem Blinden zuzuhören, 
der von Farben redet. Hör einfach auf damit. Du erzählst nur halbe 
Wahrheiten, die niemandem helfen.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Fallobst schrieb:
>> PS: Es gibt hier keinen Interpreter!
>
> http://www.elektronik-kompendium.de/sites/com/1705231.htm
>
> Wenn der Compiler es aber nicht richtig macht, muss man entweder selber
> wissen was los ist oder wartet aufs update vom Entwickler des
> Compilers...

Wenn ein Compiler DIESES Detail nicht richtig macht, kommt er erst gar 
nicht von der Entwicklungsmaschine runter!

Du scheinst wirklich Compilerbauer für komplett unfähige Vollidioten zu 
halten. Denkst du wirklich ein Compiler muss nicht erstmal sich durch 
eine Testuite durchackern, ehe er auf das breite Publikum losgelassen 
wird?

Das ein Compiler schon mal Fehler enthalten kann, streitet keiner ab. 
Aber es gibt Fehler, die fallen SOFORT beim allerersten Testlauf auf.
Und da die meisten Compiler in ihrer eigenen Sprache geschrieben sind 
(ein C-Compiler ist in C geschrieben), ist das erste nichttriviale 
Testprogramm sein eigener Source-Code. Der Compiler übersetzt sich also 
einmal selbst. Da kriegt man einen A-Compiler raus. Dieser A-Compiler 
muss nochmal seinen eigenen Code übersetzen. Man kriegt einen 
B-Compiler. A-Compiler und B-Compiler müssen Byte für Byte identisch 
sein, sonst verlässt diese Compilerversion die Entwicklungsmaschine 
nicht.

Was denkst du, wieviele Compilerfehler, bei denen ein wesentliches 
Grundfeature falsch behandelt wird, es durch diesen Prozess schaffen?

von Josef D. (jogedua)


Lesenswert?

spess53 schrieb:
> Hi
>
>>while(state = 1); IST eine Endlosschleife!
>
> Nicht unbedingt. 'state' kann immer noch in einer Interruptroutine
> verändert werden. Und dann ist es eine Endlichschleife.
>
> MfG Spess

Ich gebe ja zu, dass ich das nicht im Blick hatte. Trotzdem bleibt meine 
Aussage richtig.
state wird hier überhaupt nicht ausgewertet, sondern auf 1 gesetzt.
Und diese Zuweisung ergibt immer !=0, also wahr, also Endlosschleife.

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wenn ein Compiler DIESES Detail nicht richtig macht, kommt er erst gar
>
> nicht von der Entwicklungsmaschine runter!
>
>
>
> Du scheinst wirklich Compilerbauer für komplett unfähige Vollidioten zu
>
> halten. Denkst du wirklich ein Compiler muss nicht erstmal sich durch
>
> eine Testuite durchackern, ehe er auf das breite Publikum losgelassen
>
> wird?

Denke ich nicht, unterstelle anderen nicht immer deinen Gedanken.
(Sorry, ist aber so).

Klar durchläuft es Testreihen, aber selbst wenn, sind da eben auch noch 
Fehler drinen, die in bestimmten Konstellationen auftreten können. Man 
kann nicht jeden Fehler abfangen und berücksichtigen, dann wären wir ja 
bei ewigen Entwicklungszeiten und hätten hinterher nicht soviele 
Probleme mit der Technik (bestes Beispliel Intel Chipsätze für Haswell 
haben Probleme mit USB3.0 Geräten nach S3-Standby, erkennen die 
Teilweise nicht mehr, nue Neustart hilft...oh da wird ja alles wieder 
neu initialisiert und auch das ADR zurückgesetzt in den Controllern...).

Und neue Compiler sollen den Code der am Ende rauskommt optimiert haben, 
da sie neue Programmabfolgen berücksichtigen oder über andere 
Mmemonikbefehle schneller arbeiten. Also kann der Code aus dem neuen 
Compiler nicht mit dem vorherigen verglichen werden. Das der Gleiche 
Compiler als Grundlage die selben Ergebnisse liefern muss, ist denke ich 
allen klar.

Da es hier um µCs geht muss man diese betrachten und nicht die SCHEISS 
C++ Programme. Ich kann Windows und Linux nicht direkt mit dem BIOS 
vergleichen (beispielhaft), da läuft die ganze Diskussion aber grade 
hin.

von EGS (Gast)


Lesenswert?

Josef D. schrieb:
> Ich gebe ja zu, dass ich das nicht im Blick hatte. Trotzdem bleibt meine
>
> Aussage richtig.
>
> state wird hier überhaupt nicht ausgewertet, sondern auf 1 gesetzt.
>
> Und diese Zuweisung ergibt immer !=0, also wahr, also Endlosschleife.

NEEEIIIINN eben nicht, wenn im nächsten Durchlauf die Interuptroutine 
aufgerufen wird, wenn state == 1 dann wird es doch wieder negiert. daher 
ist es dann wieder 0, bis der Interupt wieder ausgelöst wird.

von EGS (Gast)


Lesenswert?

Edit: aber nur wenn while(state==1) geschrieben wird, denn state=1 setzt 
den ja auf 1...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

EGS schrieb:

> Klar durchläuft es Testreihen, aber selbst wenn, sind da eben auch noch
> Fehler drinen, [...]

Ich empfehle Dir: Verlasse Dein Haus nie mehr. Setz Dich irgendwo still 
in eine Ecke, schalte das Licht und Deinen Rechner aus und warte einfach 
die nächsten Jahre ab, was passiert.

Du redest Dich hier um Kopf und Kragen. Wenn Du tatsächlich Recht 
hättest, dürftest Du keiner Elektronik um Dich herum mehr trauen und Du 
wärest bestimmt schon 50mal in Deinem Leben von einer tollwütig 
gewordenen Straßenbahn überfahren worden.

Du schwafelst ein Zeug... das geht auf keine Kuhhaut. Allein schon Dein 
altklug erscheinender Versuch, Karl Heinz die C-Welt (Compiler & Co) zu 
erklären, entpuppt sich für jeden, der bereits mehr als 2 Postings von 
Karl Heinz gelesen hat, als absolut lächerlich.

Wenn man keine Ahnung hat, einfach mal die Fresse halten.

von EGS (Gast)


Lesenswert?

Frank M. schrieb:
> Ich empfehle Dir: Verlasse Dein Haus nie mehr. Setz Dich irgendwo still
>
> in eine Ecke, schalte das Licht und Deinen Rechner aus und warte einfach
>
> die nächsten Jahre ab, was passiert.

Zusammenhang? Fehler in Soft- und Hardware liegen beim Entwickler, 
wurden beim Test übersehen und/oder billigend in Kauf genommen, da man 
sie nicht als hochprior zu beheben eingestuft wurden. Gibt es genug 
Beispile für.

Da brauche ich keine Angst zu haben, da rede ich mich nicht um Kopf und 
Kragen. Und ne tollwütige Straßenbahn, mach du dich nicht auch 
lächerlich.

Deine herablassende Art kannst du lassen.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:

>> Du scheinst wirklich Compilerbauer für komplett unfähige Vollidioten zu
>>
>> halten. Denkst du wirklich ein Compiler muss nicht erstmal sich durch
>>
>> eine Testuite durchackern, ehe er auf das breite Publikum losgelassen
>>
>> wird?
>
> Denke ich nicht, unterstelle anderen nicht immer deinen Gedanken.
> (Sorry, ist aber so).

Das muss ich aber annehmen, wenn von dir die Behauptung kommt, dass 
Compiler keinen automatischen Return in eine Funktion einbauen können, 
wenn die in einem anderen Source Code File steckt.

> sind da eben auch noch
> Fehler drinen, die in bestimmten Konstellationen auftreten können.
> Man kann nicht jeden Fehler abfangen und berücksichtigen

Oh. Das auch ein Compiler Fehler hat gestehe ich dir gerne zu. Aber das 
er auf ein Return am Ende einer Funktion vergisst, das gestehe ich dir 
nicht zu. Wenn das passieren würde (was in einer Entwicklerversion schon 
sein kann), dann fällt das beim allerersten Testprogramm, welches durch 
den Compiler gejagt wird sofort auf. Spätestens wenn ein Compiler sich 
selbst übersetzt, fallen die meisten Compilerfehler auf. Denn ein 
Compiler ist ein nichttriviales Programm, welches aus einigen hundert 
Funktionen besteht und sich über mindestens 20 verschiedene Source Code 
Files hinzieht, so dass jeder Fehler an dieser Stelle sofort ein 
abstürzendes Programm ergibt. Übersetzt ein Compiler also sich selbst 
und ist das Ergebnis abstürzender Compiler, dann hat man mit Sicherheit 
etwas verbockt. Ist das Ergebnis aber ein lauffähiger Compiler, dann 
kann man mit einer gewissen Sicherheit davon ausgehen, dass zumindest 
díe C-Basiskonstrukte mit einiger Sicherheit fehlerfrei sind. Ein vom 
Compiler vergessener Return am Ende einer Funktion würde hier mit 
Sicherheit sofort auffallen.

> Mmemonikbefehle schneller arbeiten. Also kann der Code aus dem neuen
> Compiler nicht mit dem vorherigen verglichen werden.

Du hast den Bootstrap-Prozess im Compilerbau nicht verstanden.
Hätte mich auch gewundert, wenn du es verstanden hättest.


> C++ Programme. Ich kann Windows und Linux nicht direkt mit dem BIOS
> vergleichen (beispielhaft), da läuft die ganze Diskussion aber grade
> hin.

:-)
Und wenn man in der Ecke steht, macht man flugs ein neues Thema auf und 
versucht den anderen den Themenwechsel in die Schuhe zu schieben.

Das Thema ist immer noch:
C++ auf einem Arduino
Was sichert mir die Sprache zu, was sichert sie mir nicht zu.

Bisher sind von dir nur Behauptungen gekommen, dass du Dinge machen 
musst, die
a) durch nichts belegt sind
b) von denen explizit im Sprachstandard steht, dass du sie eben genau
   nicht machen musst

und wischi-waschi Aussagen, die du nach der 5-ten Urgenz dann doch 
vielleicht eventuell in die richtige Richtung verstanden haben willst, 
weil du dich absichtlich 'etwas schwammig' ausgedrückt hast.


> Da brauche ich keine Angst zu haben, da rede ich mich nicht
> um Kopf und Kragen.

Da hast du recht. Also die Sache mit der Angst haben.
Denn um Kopf und Kragen hast du dich schon längst geredet.


Egal. Ich denke die eigentliche Ausgangssituation ist ausreichend klar 
gestellt worden, so dass auch ein Leser in nächster Zukunft erkennen 
kann, wie die Dinge wirklich sind.

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das muss ich aber annehmen, wenn von dir die Behauptung kommt, dass
>
> Compiler keinen automatischen Return in eine Funktion einbauen können,
>
> wenn die in einem anderen Source Code File steckt.

Also nocheinmal, anscheinend kann/konnte die Arduino IDE das nicht. Denn 
die Abfrage des LM75 in meinem Beispiel ist nicht wieder aus dem 
Unteraufruf in das loop zurückgekehrt. Erst als ich das besagte Return 
eingefügt hatte.

Selbiges betraf das LCD, Werte wurden korrekt angezeigt, aber die 
Programmschleife hing in den Unterprogrammen fest. Nur noch die 
Drehencoder Werte wurden mittels Interupt erfasst. Komisch ist dass es 
halt so funktionierte, ich hatte keine while-Schleifen verwendet, 
sondern klassisch if und switch case.

http://arduino.cc/en/Reference/Return

i'm out...

PS: du hast mit C++ angefangen, da brauch ich auch nicht streiten.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:
> Karl Heinz Buchegger schrieb:
>> Das muss ich aber annehmen, wenn von dir die Behauptung kommt, dass
>>
>> Compiler keinen automatischen Return in eine Funktion einbauen können,
>>
>> wenn die in einem anderen Source Code File steckt.
>
> Also nocheinmal, anscheinend kann/konnte die Arduino IDE das nicht. Denn
> die Abfrage des LM75 in meinem Beispiel ist nicht wieder aus dem
> Unteraufruf in das loop zurückgekehrt. Erst als ich das besagte Return
> eingefügt hatte.


Und das kommt dir nicht irgendwie komisch vor, dass scheinbar ausser dir 
niemand diese Probleme hat?

Dein Selbstvertrauen möchte ich haben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

EGS schrieb:
> Also nocheinmal, anscheinend kann/konnte die Arduino IDE das nicht.

Verwische hier nicht immer die Begriffe. Eine IDE ist ein besserer 
Editor, sonst gar nix. Was hat das mit dem Compiler zu tun?

> Denn
> die Abfrage des LM75 in meinem Beispiel ist nicht wieder aus dem
> Unteraufruf in das loop zurückgekehrt. Erst als ich das besagte Return
> eingefügt hatte.

Am Ende der Funktion? Das glaube ich nicht. Du hattest vermutlich eher 
am Ende von Loop noch zusätzlich eine Endlosschleife drin, die Du 
nachträglich durch ein vorangestelltes return-Statement unwirksam 
gemacht hast. Ergo hast Du wohl eher einen Fehler in Deinem Programm 
überdeckt...

> Selbiges betraf das LCD, Werte wurden korrekt angezeigt, aber die
> Programmschleife hing in den Unterprogrammen fest. Nur noch die
> Drehencoder Werte wurden mittels Interupt erfasst. Komisch ist dass es
> halt so funktionierte, ich hatte keine while-Schleifen verwendet,
> sondern klassisch if und switch case.

Du hättest Dich mit Deinem Arduino 3 mal nach Mekka verneigen sollen, 
dann hätte es bestimmt auch geklappt. Hör auf zu schwafeln und zeig 
Deinen Code, dann sag ich Dir auch, wo Deine Fehler stecken.

> http://arduino.cc/en/Reference/Return

Ja und? Du hast keine Ahnung von dem, was Du da verzapfst.

von Karl H. (kbuchegg)


Lesenswert?

Frank M. schrieb:

> Du hättest Dich mit Deinem Arduino 3 mal nach Mekka verneigen sollen,
> dann hätte es bestimmt auch geklappt.

Weils grade so schön passt

http://c2.com/cgi/wiki?VoodooChickenCoding

von EGS (Gast)


Lesenswert?

Frank M. schrieb:
> Am Ende der Funktion? Das glaube ich nicht. Du hattest vermutlich eher
>
> am Ende von Loop noch zusätzlich eine Endlosschleife drin, die Du
>
> nachträglich durch ein vorangestelltes return-Statement unwirksam
>
> gemacht hast. Ergo hast Du wohl eher einen Fehler in Deinem Programm
>
> überdeckt...

Glaube ich kaum, die letzten Befehle werden auch sauber ausgeführt. Wenn 
dem so wäre würde ich ja Funkltionen vermissen.

Frank M. schrieb:
> Hör auf zu schwafeln und zeig
>
> Deinen Code, dann sag ich Dir auch, wo Deine Fehler stecken.
>
>> http://arduino.cc/en/Reference/Return
>
> Ja und?

Verweis auf den verwendeten Befehl, und sorry nicht jeder hat den ganzen 
Tag seinen privaten Rechner um den Hals hängen. Um eventuell mal seinen 
Code posten zu können.

von Electronics'nStuff (Gast)


Lesenswert?

Schlagt' euch tot um den Sch*** Arduino-Compiler :)
Die sinnloseste Diskussion, die ich seit langem gelesen habe!

von F. F. (foldi)


Lesenswert?

Interessiert sich eigentlich noch irgend jemand für die Ausgangsfrage?

Für mich ist zumindest klar, dass ich den Entschluss, ganz schnell von 
Arduino weg zu gehen und C zu lernen, sicher nicht bedauern werde.

Gerade Karl Heinz hat mir schon so nützliche Tipps gegeben (@Karl Heinz: 
manchmal auch indirekt, indem ich deine Texte anderen zu Hilfe las).

Arduino soll so einfach sein und tatsächlich hatte ich nach drei Monaten 
ein erstes Projekt fertig. Mit One-Wire, PWM und ...
Wäre sicher nicht so schnell gegangen, wenn ich anders angefangen hätte.
Aber mit Arduino, mag sein, dass es doch geht, sprich mal einen ganzen 
Port an! Ich hatte da ganz gewaltige Schwierigkeiten den Kodierschalter 
zum laufen zu bekommen. In C ein Klacks.

Im Moment lerne ich zwar wieder mehr Basics und insbesondere über 
Stromversorgung, aber C (später auch C++) haben doch wesentlich mehr 
Aussicht auf langfristigen Erfolg. Arduino ist eine Sackgasse.

Aber vielleicht helft ihr jetzt mal wieder dem Threadsteller bei seinem 
Problem!

von EGS (Gast)


Lesenswert?

Frank Frank schrieb:
> Interessiert sich eigentlich noch irgend jemand für die Ausgangsfrage?
> ...

Sorry hast ja recht, aber dachte dass hatten wir bereits geklärt:

volatile int state = LOW;


void setup()
{

  pinMode(13, OUTPUT);
  attachInterrupt(0, blink, Rising);

}

void loop() --> Dauerernde Abarbeitung
{

while(state == true) { //--> Wichtig hatte hier vorhin auch nur ein "="
tone(13, 5500, 5000);
}

}

void blink() -->Interuptroutine
{
  state = !state;

}

Sind leider abgedriftet...

Wie gesagt alternativ zum while(... auch nen if(...

von Karl H. (kbuchegg)


Lesenswert?

Frank Frank schrieb:
> Interessiert sich eigentlich noch irgend jemand für die Ausgangsfrage?


Was war das?
Ach ja, die Frage nach dem tone().

Lässt sich auf 2 Arten beantworten
  tone kann man auch auf Dauerton stellen
  oder eben in loop() nach jeweils einer bestimmten Zeit wieder
  neu starten.

So wie er es gemacht hat, ist der Aufbau nicht sehr schlau und ich sehe 
grade, dass unter anderem eines der Probleme darin besteht, dass er am 
Ende von loop() eine Endlosschleife eingebaut hat.


> Wäre sicher nicht so schnell gegangen, wenn ich anders angefangen hätte.
> Aber mit Arduino, mag sein, dass es doch geht, sprich mal einen ganzen
> Port an!

Doch das geht.
Nur weil du vom Framework Funktionen und Klassen bereit gestellt 
bekommst, bedeutet das ja nicht, das alles andere still gelegt wurde. 
D.h. Portzugriffe funktionieren auch in diesem Framework genau so, wie 
wir das hier ohne Framework auch machen. Prinzipiell ist das alles 
komplett gleich (Kunststück, liegt ja auch derselbe Compiler mit 
denselben AVR-Header Files drunter)

Wenn du also setup() und loop() in diesem Zusammenhang siehst
1
int main()
2
{
3
  xxxx
4
  setup();
5
  xxxx
6
7
  sei();
8
9
  while( 1 ) {
10
    xxxx
11
    loop();
12
    xxxx
13
  }
14
}
wobei xxxx Codeteile markiert, die einfach da sind und die du nicht 
beeinflussen kannst, dann programmierst du im Grunde auch nicht soo viel 
anders, als wir hier.
Einzig aufpassen muss man, weil ja das Arduino Framework sich einige 
Dinge für sich selber reserviert (ich denke mal Timer werden die 
prominentesten derartige Kondidaten sein). D.h. die sind für dich 
insofern tabu, als du nicht mit direkter Register-Manipulation drann 
gehen solltest.

> Aussicht auf langfristigen Erfolg. Arduino ist eine Sackgasse.

Man muss immer im Hinterkopf behalten, was die Idee am Arduino war. Die 
Idee war es nicht, dem Crack, der auch noch das letzte Bit beim Vornamen 
kennen möchte, ein Werkzeug in die Hand zu geben.

> Aber vielleicht helft ihr jetzt mal wieder dem Threadsteller bei seinem
> Problem!

Ist gar nicht mal so einfach, weil zumindest für mich nicht so ganz 
ersichtlich ist, wo die Reise überhaupt hingehen soll.

Ein ....
1
void loop()
2
{
3
  tone(13, 5500);
4
}

... erfüllt im Grunde seine Vorgabe schon - Dauerton.
Was er da mit dem Interrupt vor hat, kann ich zwar ungefähr erraten, 
macht aber für mich eher wenig Sinn.

von Verwirrter Anfänger (Gast)


Lesenswert?

Frank Frank schrieb:
> Arduino ist eine Sackgasse.

Wieso?

Für mich ist ein Arduino eine Auffahrt auf die C / C++ Autobahn.

Das Arduino Framework ist C++ mit einigen zusätzlichen Libraries, einer 
IDE und Entwicklungsboards. Auf einem Arduino kannst du nahezu alles 
machen, was mit Standard AVR-C / AVR-C++ auch geht.
1
PORTB |= (1 < PB2) | (1 < PB3);

geht auf einem Arduino genauso wie mit dem normalen avr-g++. Das Einzige 
bei dem du aufpassen musst, sind ein paar Interrupts. Der Timer 0 wird 
u.a. für die millis() Funktion belegt, und die Serial Library benutzt 
natürlich die entsprechenenden Interrupts. Aber ansonsten ist nahezu 
alles möglich.

Ich benutz meinen Arduino ganz gerne mal, wenn ich schnell was 
ausprobieren will. Gerade wenn es um Sensoren oder andere Periphery 
geht, für die es schon Libraries gibt. Mal schnell RFID ausprobieren, 
geht doch um einiges einfacher als alles von Hand zu machen. Später kann 
man das dann "ordentlich" machen, aber nur um zu wissen, ob es überhaupt 
funktioniert ist der Arduino meiner Meinung nach gut geeignet.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:


> Ein ....
>
1
> void loop()
2
> {
3
>   tone(13, 5500);
4
> }
5
>
>
> ... erfüllt im Grunde seine Vorgabe schon - Dauerton.

Das war natürlich kompletter Blödsinn.
EGS hat schneller kapiert, was das Ziel der Übung war.

Eine andere Lösung könnte zb so aussehen
1
void setup()
2
{
3
  pinMode(13, OUTPUT);
4
  attachInterrupt(0, blink, FALLING);
5
}
6
7
void loop()
8
{
9
}
10
11
void blink()
12
{
13
   tone(13, 5500, 5000);
14
}

von EGS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ... erfüllt im Grunde seine Vorgabe schon - Dauerton.
>
> Was er da mit dem Interrupt vor hat, kann ich zwar ungefähr erraten,
>
> macht aber für mich eher wenig Sinn.

Ich hätte es eher so gedeutet, das er hier durch den Interup getriggert 
den Ton erst erzeugen will und mit einem erneuten Wechsel des Zustands 
am Interuptpin diesen wieder beendet. Sowas wie nen Alarmton, der bei 
Beendigung der Alarmsituation wieder ausgeht.

Dazu brauchen wir aber Input von Michael.

von Karl H. (kbuchegg)


Lesenswert?

EGS schrieb:

> Ich hätte es eher so gedeutet, das er hier durch den Interup getriggert
> den Ton erst erzeugen will und mit einem erneuten Wechsel des Zustands
> am Interuptpin diesen wieder beendet.

Ja, habs erst gemerkt, als ich mal gegoogelt habe, was attachInterrupt 
eigentlich macht :-)

Ich bin vorher von irgendeiner Timer Situation ausgegangen, wodurch die 
Tondauer von 5.5 Sekunden keinen Sinn mehr gemacht hat.

Mein Fehler. Ich hätte erst googlen sollen und dann schreiben.

> Sowas wie nen Alarmton, der bei
> Beendigung der Alarmsituation wieder ausgeht.

Zum Bleistift.
Wie eine Lösung genau aussehen soll, kann man erst sagen, wenn man weiß, 
wie Michael sich das Zusammenspiel aus Pin und Tröte vorstellt.

Das wäre für mich ein Fall für den Vorschlaghammer, aber jeder wie er 
mag und ich bin sicher, das war auch nur ein Testprogramm :-)

von Fallobst (Gast)


Lesenswert?

Verwirrter Anfänger schrieb:
> Aber ansonsten ist nahezu alles möglich.

Gegenbeispiel:
Ein paar meiner Projekte sind recht zeitkritisch. Da darf kein Interrupt 
mal für 100 Zyklen den Programmablauf unterbrechen. Genau das machen die 
Arduino-Libs. Ich habe den µC gerne unter meiner Kontrolle, genauso wie 
den Timer0. Wenn ich einen Millisekundentimer benötige ist der in 30 
Sekunden von Hand(!) programmiert. Allgemein habe ich noch keine Libs 
gesehen, die so verschwenderisch mit Resourcen umgehen, wie diese.

Außerdem bin ich froh, dass ich nicht genötigt werde eine steinzeitliche 
IDE (die sich modern nennt) zu benutzen.

Verwirrter Anfänger schrieb:
> einiges einfacher als alles von Hand zu machen

Hm, das gibts auch ohne Arduino. Einfach 1 Minute gurgeln. Außerdem 
Resourcensparender und mit Sicherheit schneller.

Verwirrter Anfänger schrieb:
> Für mich ist ein Arduino eine Auffahrt auf die C / C++ Autobahn.

Naja, eher Abfahrt in die 30ger-Zone, in der jeder fahren kann.

von EGS (Gast)


Lesenswert?

Glaube ich auch, war zwischendurch nen Tee trinken. Dann hab ich mich 
wieder gesammelt.

Bin wohl nen bissel ausgeschlagen ;)

Wollen den Leuten hier doch helfen.

MfG,
der sich auf seinen Feierabend freuende EGS

von EGS (Gast)


Lesenswert?

Fallobst schrieb:
> Außerdem bin ich froh, dass ich nicht genötigt werde eine steinzeitliche
>
> IDE (die sich modern nennt) zu benutzen.

Jeder nach seiner Facon, ich steinige auch keinen weil er VW nicht mag 
oder Nissan liebt.

Man muss halt schaun wie man mit zurecht kommt.

Fallobst schrieb:
> Allgemein habe ich noch keine Libs
>
> gesehen, die so verschwenderisch mit Resourcen umgehen, wie diese.

Dafür ist der Arduino auch nicht gedacht. Mir würde z.B. nicht in den 
Sinn kommen den Arduino in ner Industrieanlage einzusetzen wo ms schon 
über Erfolg oder Misserfolg entscheiden. Die Intention der MAcher war ja 
für Künstler und einfache DIY Projekte.

MfG EGS

von Fallobst (Gast)


Lesenswert?

EGS schrieb:
> Jeder nach seiner Facon, ich steinige auch keinen weil er VW nicht mag
> oder Nissan liebt.
>
> Man muss halt schaun wie man mit zurecht kommt.

Das größte Manko ist, dass man nur schwer Projekte mit mehreren Dateien 
machen kann.

PS: In meinem aktuellen Projekt habe ich zurzeit über 30 
Source+Header-Dateien.

von EGS (Gast)


Lesenswert?

Naja seis drum, man kann wenn man mag auch jeden anderen Compiler 
verwenden, wird ja von den Machern sogar erläutert wie, im Endeffekt 
sind es die Arduino Umgebung Software und die Hardware die man getrennt 
benutzen kann.

Aber wie gesagt lasst und dem TO helfen.

von F. F. (foldi)


Lesenswert?

Karl Heinz Buchegger schrieb:
> ... erfüllt im Grunde seine Vorgabe schon - Dauerton.
> Was er da mit dem Interrupt vor hat, kann ich zwar ungefähr erraten,
> macht aber für mich eher wenig Sinn.

Hab ich auch nicht verstanden.

Ich hatte verschiedene Bücher zu Arduino hier, im Netz gegooglet und 
hatte nichts dazu gefunden. Erst jetzt weiß ich, dass ich da auch C oder 
C++ einbauen kann.
Aber wenn man das dann schon weiß und man weiß wie es in C geht, dann 
brauche ich das doch gar nicht mehr.

Die Syntax von Arduino gab da anfangs nichts zu her und ich hatte mir 
dann eine eigene Lösung gestrickt.

Hatte damals mit Visual Basic, die allererste Version, angefangen. War 
relativ teuer. Damals über 400 DM und nach einigen anfänglichen 
Versuchen mit den Lernvorgaben, wollte ich was Eigenes machen. Da kam 
dann immer der Hinweis, "geht nur mit dem SDK", welches dann noch mal 
mit über 700 Euro zu Buche geschlagen hätte.
So ähnlich sehe ich Arduino auf der Softwareseite. Will ich 
ausschließlich den Funktionsumfang von Arduino nutzen, dann gehen einige 
Sachen nur schwer bis gar nicht.
Wobei ich die Boards ganz toll finde. Insbesondere den Nano fürs 
Steckbrett.

von EGS (Gast)


Lesenswert?

Also wie ich sehe sind da noch einige Farge offen was den Arduino 
angeht. Bitte schaut euch nur mal die FAQ unter:

http://arduino.cc/en/Main/FAQ

an...da werden einige sicherlich nen Aha-Effekt erleben ;)

Arduino kann ich mit Makerfile/AVR programmieren (dann z.B. ohne 
Bootlader) ich kann nen Arduino aber auch als ISP Benutzen um andere 
AVRs oder selbergebaute Arduino Boards zu flashen...

MfG EGS

von Michael (Gast)


Lesenswert?

Danke für soviele Infos!
Habe das Programm jetzt nochmal geschrieben! Es funktioniert auch!
Einzigstes Manko ich kann den Interrupt nur zweimal ganz schnell 
hintereinander auslösen, danach funktioniert es nicht mehr! Warum???



volatile int state = LOW;


void setup()
{

  pinMode(13, OUTPUT);
  attachInterrupt(0, blink, RISING);

}

void loop()
{

  while(state == true){}
}



void blink()
{

  state = !state;
  tone(13, 5500, 5000);

  return;

}

von Fallobst (Gast)


Lesenswert?

Michael schrieb:
> return;

OMG...........................
EGS hat es also geschafft. Das return braucht du hier NICHT!


Ansonsten ist dein Programm ein bisschen komisch. Die Variable state ist 
hier nutzlos - schau dir das nochmal an.

von Fabian O. (xfr)


Lesenswert?

Fallobst schrieb:
> Die Variable state ist
> hier nutzlos - schau dir das nochmal an.

Genau wie die Warteschleife in loop(). Was reden wir denn schon seit 80 
Beiträgen ...

von Michael (Gast)


Lesenswert?

Irgendwie bringt mich das hier gerade alles durcheinander! Soviele 
Beiträge!
Da ist es schwierig das gute herauszufiltern!

von EGS (Gast)


Lesenswert?

Fallobst schrieb:
>> return;
>
>
>
> OMG...........................
>
> EGS hat es also geschafft. Das return braucht du hier NICHT!

Eigentlich nicht, der Interupt des Arduino macht das ja von selbst. Wenn 
man weiss was der Interupt macht seis gedankt :)

Aber zurück, ich hatte ihm da folgenden Code empfohlen:

EGS schrieb:
> volatile int state = LOW;
>
> void setup()
>
> {
>
>   pinMode(13, OUTPUT);
>
>   attachInterrupt(0, blink, Rising);
>
> }
>
> void loop() --> Dauerernde Abarbeitung
>
> {
>
> while(state == true) { //--> Wichtig hatte hier vorhin auch nur ein "="
>
> tone(13, 5500, 5000);
>
> }
>
> }
>
> void blink() -->Interuptroutine
>
> {
>
>   state = !state;
>
> }

Aber egal, wir wollen ja nicht abdriften. Hier würde wenn ein Interupt 
auftritt der Zustand von State negiert werden (aus true wird false und 
aus false wird true, je nach Zustand von "state). und im loop während 
"state" true ist der Ton erzeugt.

In seinem Programm läuft was ganz anderes:

er erzeugt in der Interuptroutine den Ton, und negiert den Zustand von 
State . Im loop macht er eigentlich nix sinnvolles, da er hier nur 
Währen state gleich true, nix tut.

von Markus M. (mark_m)


Lesenswert?

Michael schrieb:
> Habe das Programm jetzt nochmal geschrieben! Es funktioniert auch!
> Einzigstes Manko ich kann den Interrupt nur zweimal ganz schnell
> hintereinander auslösen, danach funktioniert es nicht mehr! Warum???
Der Grund steht in der Dokumentation zu "tone()".
1
Only one tone can be generated at a time. If a tone is already playing on a different pin, the call to tone() will have no effect. If the tone is playing on the same pin, the call will set its frequency.

Du musst warten bis der Tone geendet hat oder Du schaltest den Tone 
manuell EIN und AUS.
1
void loop()
2
{
3
  if( state )
4
  {
5
    tone(13, 5500);
6
  }
7
  else
8
  {
9
    noTone(13);
10
  }
11
}
12
13
void blink()
14
{
15
  state = !state;
16
}

Und lass bitte die Endlosschleife in "loop()" weg.

von Manuel X. (vophatec)


Lesenswert?

EGS schrieb:

> PS: wenn du dann auch noch beruflich dich mit Step7 AWL-Programmen
> auseinandersetzen darfst wirst du merken das dir C da nicht mehr
> weiterhilft, AWL ist hardwarenahe Programmierung, weil bereits in
> MMemonik. Da schreibst du deine Funktionen selber. Hier vergisst du nur
> einmal den bedingten oder absoluten rücksprung, ansonsten vergisst du
> einen Zykluss lang nen ganzen Programmteil, was dann schnell mal richtig
> Geld kostet.

P.S.:

Das zeigt MIR das du von nichts richtig Ahnung hast, und zwar ne ganze 
Menge. AWL ist mitnichten Hardwarenah, die Struktur ist nur 
Assemblerähnlich, das wars auch schon. Ausserdem ist AWL seit Jahren auf 
dem absteigenden Ast. Und wenn DIR deine, sowieso sehr lückenhaften und 
teilweise falschen, C Kenntnisse auf der S7 nicht weiterhelfen, ist das 
dein Problem, denn heutzutage programmiert man S7 eher in ST/SCL (was 
syntaktisch Pascal ähnelt) oder mittlerweile sogar, oh Wunder, in C ...

Ich trolle ungern, aber DU hast von nichts richtig Ahnung, vermischt 
Sachen die nichts miteinander zu tun haben und hälst dich nicht an 
Regeln die dir ein System vorgibt. Ich hoffe nur du programmierst nichts 
was mal in den Handel kommt, denn dann kannst mit dem teuer werden in 
der Tat recht haben.

von Oliver (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Weils grade so schön passt
>
> http://c2.com/cgi/wiki?VoodooChickenCoding

Schöner link ;)

Wobei

http://c2.com/cgi/wiki?CargoCultProgramming

es eigentlich noch besser trifft.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.