Pages: [1] 2   Go Down
Author Topic: Ein paar allgemeine Programmierfragen  (Read 1347 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Moin!
npaar allgemeine Programmierfragen:
1) muss man alle Befehle in loop() tun oder kann man auch etwas wie:
      
Code:
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??? smiley-red
« Last Edit: June 12, 2013, 02:30:38 pm by uwefed » Logged

Arduino Liebhaber

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2441
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

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.

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.

4) Sind diese Fragen dumm und blöde??? smiley-red

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

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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?
Logged

Arduino Liebhaber

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4702
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein µC hat sleep modes, für den Fall dass er zwar Strom hat, diesen aber nicht verbrauchen soll  smiley-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 ...
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2441
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Germany, Osnabrück
Offline Offline
God Member
*****
Karma: 25
Posts: 572
E-Technik Student - Master
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3418
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

http://blog.blinkenlight.net/experiments/counting/faster-counter/.

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.
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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?
Logged

Arduino Liebhaber

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3418
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Arduino Liebhaber

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.
Logged

Arduino Liebhaber

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
irgendwie sichtbar

smiley-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 )

Code:
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.
Code:
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
Code:
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
}

Quote
32 =
33 = !
34 = "
....
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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)?
Quote
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... ?
Logged

Arduino Liebhaber

Pages: [1] 2   Go Up
Jump to: