Ein paar allgemeine Programmierfragen

Moin!
npaar allgemeine Programmierfragen:

  1. muss man alle Befehle in loop() tun oder kann man auch etwas wie:
int wasweisich = keineahnung;
      void setup() {
        pinMode(wasweisich, bla);
      }
      digitalWrite(wasweisich, HIGH);
      delay(1);
      digitalWrite(wasweisich, LOW);

Programm vorbei.
2) Kann man void loop irgendwie unterbrechen (etwas wie break() in einer while-Schleife)?
3) Wenn man ohne ein delay(irgendewas) dazwischen am laufenden Band einen pin ein und aus schaltet, erreicht man dann theoretisch eine Frequenz von ca. 16MHz oder etwas weniger?
4) Sind diese Fragen dumm und blöde??? :blush:

Dasichbinich:

  1. muss man alle Befehle in loop() tun oder kann man auch etwas wie:
    int wasweisich = keineahnung;
    void setup() {
    pinMode(wasweisich, bla);
    }
    digitalWrite(wasweisich, HIGH);
    delay(1);
    digitalWrite(wasweisich, LOW);
    Programm vorbei.

Ja, kannst Du. Wenn Du allen Code in die setup-Funktion packst, dann passiert nach dem Abarbeiten von setup() nichts mehr und bis zum nächsten Reset des Controllers wird nur eine leere loop() wieder und wieder aufgerufen. Das mache ich oft zum Testen von Routinen mit seriellen Debug-Ausgaben am Bildschirm, damit es nicht endlos über den Bildschirm scrollt.

Dasichbinich:
2) Kann man void loop irgendwie unterbrechen (etwas wie break() in einer while-Schleife)?

Du kannst die loop() Funktion genau wie auch jede andere Funktion mit “return” verlassen. Im Fall der loop-Funktion fängt die loop dann aber sofort wieder von vorne an zu laufen.

Wenn Du die loop “anhalten” Möchtest, dann kannst Du das mit einer Endlosschleife, z.B.:
while (true==true) ;
oder kurz:
while (1) ;
Solange die Bedingung in der Klammer wahr ist (also immer) wird danach ein leerer Befehl “;” ausgeführt.
Danach geht nichts mehr bis zum nächsten Reset.

Dasichbinich:
3) Wenn man ohne ein delay(irgendewas) dazwischen am laufenden Band einen pin ein und aus schaltet, erreicht man dann theoretisch eine Frequenz von ca. 16MHz oder etwas weniger?

Nein.
Wenn Du digitalWrite zum Schalten verwendest, erreichst Du sehr viel weniger als 16 MHz, wohl kaum über 100 kHz.
Wenn Du direkt die Ports ansteuerst, kannst Du eine höhere Schaltfrequenz erzielen, ich glaube maximal 4 MHz.

Dasichbinich:
4) Sind diese Fragen dumm und blöde??? :blush:

Ich bin mir nicht ganz sicher, wie diese Frage gemeint ist.
:wink:

Ich bin mir nicht ganz sicher, wie diese Frage gemeint ist.
smiley-wink

Nicht so schlimm!!!

Wirklich aufhören lassen, aber dann noch was anderes mach kann man loop und return also nicht?

Wirklich aufhören lassen, aber dann noch was anderes mach kann man loop und return also nicht?

Das macht keinen Sinn, denn dann kannst Du ja aus dem Loop eine andere Funktion aufrufen und dort mittels return wieder in den Loop zurückkehren, worauf Du dann das "Andere" machen kannst.
Aber vielleicht verstehen wir Dich nur falsch und Du willst etwas ganz anderes. In diesem Fall solltest Du aber beschreiben, was Du erreichen willst und nicht, wie Du es ausgeführt hättest.

Ein µC hat sleep modes, für den Fall dass er zwar Strom hat, diesen aber nicht verbrauchen soll :wink:
Kann auch per Signal aus dem Schlaf aufwachen.

Ansonsten sind Programme mit Ende eigentlich nicht für Controller gedacht.
Na ja, wenn der Arduino nur einen Start-Knopf hat, kann der Knopf auch den Reset auslösen, aber das ist schon etwas beschränkt ...

Sieh loop() als das was er macht, wenn er nichts zu tun hat: Prüfen ob irgendwas passiert ist ...

Dasichbinich:
Wirklich aufhören lassen, aber dann noch was anderes mach kann man loop und return also nicht?

Ne, "wirklich aufhören" und "dann noch was anderes machen" klingt etwas nach "ein bisschen tot".

Entweder das Programm macht noch was, oder es macht nichts mehr.

Du kannst Dir durchaus loop-Funktionen machen, die nur noch einen einzelnen Button überwachen, "sonst nichts", aber wenn der Button gedrückt wird, legt das volle Programm los.

void loop()
{
if (Button_wurde_gedrueckt()) StarteDasVolleProgramm();
}

Dann mußt Du eben nur eine Funktion haben, die auf eine bestimmte Aktion wartet, z.B. dass ein Button gedrückt wurde oder daß ein Temperatursensor eine bestimmte Temperatur mißt oder eine bestimmte Tageszeit gekommen ist, und dann startet Deine Funktion StarteDasVolleProgramm(), die dann mehr macht als auf die Startaktion zu warten.

Aus diesem Grund habe ich für mich und andere freiwillige diese Lib geschrieben:
Projektvorstellung: einfache Threads auf dem Arduino mit Hilfe von Makros

Das hier nicht wirklich "nichts" passiert ist mir schon klar, aber es ist einfacher verschachtelte Programme aufzubauen in denen einige Funktionen immer zeitversetzt oder eventbasiert aufgerufen werden

Was die maximal mögliche Schaltfrequenz angeht, das habe ich schon mal hier breitgetreten:

Faster Counter | Blinkenlight.

Wenn Du nur einen Pin schaltest, dann kannst Du nochmal doppelt so schnell werden. Das absolute Maximum wird erreicht wenn man per eine Fuse so setzt, daß an einem der Pins der Takt einfach durchgeschleift wird. Wie das geht steht im Datenblatt.

Ein µC hat sleep modes, für den Fall dass er zwar Strom hat, diesen aber nicht verbrauchen soll
Kann auch per Signal aus dem Schlaf aufwachen.

Wie gehen denn die Befehle dafür? Steht das sonst irgendwo auf der Seite schon?

Guckst Du hier:

http://code.google.com/p/narcoleptic/source/browse/user+guide.txt

Allerdings verpulvern der Linearregler und der seriell / USB Konverter normalerweise schon soviel, daß sich das bei einen Arduino nicht mehr lohnt. Mit dem nackten Chip sieht es anders aus:

http://interface.khm.de/index.php/lab/experiments/sleep_watchdog_battery/

Grundsätzlich sind echte low power Designs nicht einfach. Unter 100uA schafft man aber leicht. Bei 10uA wird die Luft langsam dünner :wink:

danke, das hat mir geholfen. Noch was:
Was ist der Unterschied zwischen Serial.print() und Serial.write() ???
Übrigens, kann man den PinMode auch in void loop() ändern?

print wandelt Datentypen (z.B. int als Zahl, optional BIN, HEX, DEC float mit vorgegebener Anzahl Nachkommastellen )
write gibt einzelne char, texte, und byte arrays aus. Ohne zu wandeln.

Den PinMode kann man auch in void loop() ändern.
Macht einen Unterschied, ob der Pin HIGH oder LOW ist, bzw. ob er vorher INPUT uder INPUT_PULLUP war.

print wandelt Datentypen (z.B. int als Zahl, optional BIN, HEX, DEC float mit vorgegebener Anzahl Nachkommastellen )
write gibt einzelne char, texte, und byte arrays aus. Ohne zu wandeln.

Wenn man die Daten mit dem Seriellen Monitor anschaut, kommt es aber doch im Endeffekt aufs gleiche heraus?! Schließlich muss der Rechner die Daten ja irgendwie sichtbar machen, da sieht man ja nicht, ob es eine Zahl oder ein String ist.

irgendwie sichtbar

:wink:
Genau.

Willst du z.B. ein 'A' oder eine 65 oder eine 41 sehen?
Das musst du schon definieren. ( Kann alles die gleiche Variable sein )

int ix='A';  
char x= ix;

Serial.write(x); // gibt ein 'A' aus 
Serial.print(ix); // gibt 65 aus

Ganz vereinfacht:
SerialMonitor gibt nur Text aus, der über die serielle Leitung gesendet wird.
Print wandelt Zahlen in den entsprechenden Text um,
zB.

int x=1234;
Serial.print(x);

wandelt eine Zahl (1234) in den Text "1234" und sendet dann diese 4 Zeichen.

Probier doch mal einfach aus

void loop()
{
   static char c=32;  // im ersten Durchlauf nur Druckbares
   int i = c;   
   Serial.print (i); 
   Serial.write (" = ");
   Serial.write (c);
   Serial.println();
   delay(500);
   c++; // 33, 34, ... der Überlauf nach 127 macht es interessant
}

32 =
33 = !
34 = "

....

Willst du z.B. ein 'A' oder eine 65 oder eine 41 sehen?

War nur eine allgemeine Frage. Aber wenn ich etwas programmiert hätte, was solche Werte an den Kompi sendet, Wäre mir das A am liebstem.
41 wäre ein A in ASCII, nicht war (HEXadecimal)?

static char c=32; // im ersten Durchlauf nur Druckbares
int i = c;

Kann man einem Integer einfach einen Char-Werte zuweisen? Ich hab mal gelesen dafür gibt es sowas wie parseInt oder so... ?

Mal was anderes: ICh hab grad ganz normal die Arduino Software gestartet und anstatt, dass mein Sketch aufgeht lädt der nur ewig und sagt dann einfach frech wie er is:
Launch4j:
An error occurred while starting the application.
Wie kommtn das jetzt?
Warum nur, warum????

Dasichbinich:
Mal was anderes: ICh hab grad ganz normal die Arduino Software gestartet und anstatt, dass mein Sketch aufgeht lädt der nur ewig und sagt dann einfach frech wie er is:
Launch4j:
An error occurred while starting the application.
Wie kommtn das jetzt?
Warum nur, warum????

Verwendest Du zufällig MacOS? Da ist kürzlich das letzte Java-Update fehlgeschlagen, so dass Java-Anwendungen (wie es auch die Arduino-Software ist) nicht mehr ausgeführt werden können:

Braucht dann ein neues Update

Auch könnte ich mir vorstellen, dass Java-Programme allgemein immer dann nicht laufen, wenn gerade ein Java-Update ausgeführt wird (nicht nur auf Apple-Plattformen).

Verwendest Du zufällig MacOS?

Nein. Ich hab trotzdem mal Java auf den neusten Stand gebracht. Dann hab ich im Internet (genauer gesagt, auf irgendeinem Forum) gelesen Das man den Ordner mit den Projekten umbennen, oder einen neunen machen soll. Hat dann erst mal wieder geklappt, aber als ich neustart gemacht hab, war es wieder wie vorher. Mir ist aufgefallen, dass der unterordner "libraries", der automisch erstellt wurde als ich die Arduino Software installiert hab, ungefähr zwanzig Unterordner hat (man kann immer den Ordner öffnen, dann kommt ein neuer, der genauso heißt und immer so weiter ungefähr zwanzig mal und den letzten kann man nicht mehr öffnen). Wenn ich diesen Ordner-Salat löschen will, meint mein Rechner nur "die Namen der Dateien sind zu groß, als dass man sie löschen kann" und tut nix. Und das gannze habe ich jetzt zweimal, weil ich den Inhalt vom ersten Ordner mit den Projekten in einen anderen getan hab, der auch anders heißt, aber den ersten kann ich wegen diesen doofen verzweigten libraries Ordner nicht Löschen!!! AAAAAh! :0

Dasichbinich:
den ersten kann ich wegen diesen doofen verzweigten libraries Ordner nicht Löschen!!! AAAAAh!

Auch nicht mit Administratorrechten?

Hört sich an als wenn Deine Festplatte wenigstens (mindestens) einen logischen Fehler hat, wenn sie nicht sogar defekt ist.

Beseitigung des Fehlers, falls es nur logische Fehler sind:

  • Alle wichtigen Daten von der Festplatte sichern (Vorsichtsmaßnahme gegen möglichen Datenverlust)
  • Dateisystem überprüfen und logische Fehler beseitigen

Unter Windows prüfst Du das Dateisystem (beispielsweise), indem Du unter "Computer" das gewünschte Laufwerk mit rechten Maustaste anklickst, aus dem Kontext-Menü ""Eigenschalten" auswählst und dann unter "Tools-Fehlerüberprüfung" auf den Button "Jetzt prüfen" klickst. Du benötigst dazu Administratorrechte, die ggf. angefordert werden, wenn Du die Funktion von einem Account eines eingeschränkten Benutzers aus aufrufst.

Ich hab schon alles erdenkliche versucht und noch auf einer Menge anderen Seiten alle Tipps ausprobiert, klappt aber net. Bin voll am verzweifeln. =(