C Einsteiger static-Variable

PapstRatze

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
436
so kurze Vorgeschichte ;).

Bin studierender jetzt im 3ten Semester und habe gerade Informatik aufgebrummt bekommen. Heute ist schon das erste Praktikum zu der Sache und ich muss zugeben bin etwas langsam aus den Startlöchern gekommen was das Modul angeht ;).

Wir Programmieren ausschließlich in C und sollen heute MSP430GXXX Launchpad einen Servo ansteuern.

Das schöne ist, da wir gerade mal 2 Vorlesungen hatten und eigentlich nicht wirklich was wissen, wurde bereits das Ansprechen des Servos über das Modul vom Prof. vorgearbeitet.
Dieses gibt dann 3 nette Parameter hervor:

readAnalog:
hat keine Parameter und liefert einen Wert von 0 bis 1023, welcher linear von der Spannung an Pin 1.5 abhängt.
setServoTo:
stellt einen Servo ein, im Zahlenbereich von 0 bis 100
waitMilliseconds:
hält das Programm für die als Argument angegebene Zeit an.

Ich werde nicht alle alle Aufgaben durchgehen, so ne kleine Idee hab ich durchaus ;) aber vorallem bei Aufgabe 2 steh ich auf dem schlauch...

Aufgabe 1:
[...] Schreiben Sie eine Funktion mit der Signatur
int setServoAndRead(int percentage)
die den Servo auf die in Prozent angegebene Position stellt, dann 300 millisekunden wartet und zum Schluss die Spannung misst und als Ergebnis zurückliefert...[...]
[...] Schreiben Sie eine main-Funktion die einige Aufrufe von setServoAndRead testet.

Aufgabe 2:
Speichern sie in setServoAndRead die jeweils zuletzt eingestellte Position in einer static-Variablen [...]

... so den rest bekomme ich dann hin, hauptsächlich das Speichern in einer static-Variablen macht mich verrückt...

Falls jemand bereit ist mir Hilfe zu geben und mich jetzt nicht direkt fertig machen will weil ich einfach noch nichts weiß, dann Freu ich mich schon auf die Antworten :D
 
PapstRatze schrieb:
Aufgabe 1:
[...] Schreiben Sie eine Funktion mit der Signatur
int setServoAndRead(int percentage)
die den Servo auf die in Prozent angegebene Position stellt, dann 300 millisekunden wartet und zum Schluss die Spannung misst und als Ergebnis zurückliefert...[...]
[...] Schreiben Sie eine main-Funktion die einige Aufrufe von setServoAndRead testet.

Deine 3 Funktionen dafür hast du ja bereits gegeben. Zusätzlich brauchst du ja nur noch das Ergebnis von readAnalog() zurückliefern (return).

PapstRatze schrieb:
Aufgabe 2:
Speichern sie in setServoAndRead die jeweils zuletzt eingestellte Position in einer static-Variablen [...]

Bei einer static Variablen setzt du einfach nur das Schlüsselwort static vor die Deklaration:
Code:
int meineFunktion() {
   static int meinWert = 0;
   ...
}

Im Kontext einer Variablendeklaration sagt dieses Schlüsselwort, dass diese Variable auf einer festen Speicheradresse gespeichert wird. Daraus ergibt sich die Möglichkeit, dass eine Funktion, die mit static-Variablen arbeitet, beim nächsten Durchlauf die Informationen erneut nutzt, die in der Variablen gespeichert wurden. Ohne static würde die Variable bei jedem Aufruf wieder neu instantiiert.
 
Also wäre für Aufgabe 1 die Funktion in etwas so:

Code:
int setServoAndRead(int percentage)
{
  void setServoTo(int percentage);

  void waitMilliseconds(unsigned int 300);
  
  unsigned int readAnalog(void);

  return readAnalog()
}


und im main steht dann sowas wie:
Code:
int main( void )
{
 initialize()
   
   int a = setServoAndRead(10);
    int b = setServoAndRead(20);
    int c = setServoAndRead(30); //....
    

  return 0;
}
 
Oha :D

Bei
Code:
void setServoTo(int percentage);
handelt es sich um eine Deklaration. Das erste Schlüsselwort void besagt, dass es keinen Rückgabewert hat, "int percentage" zeigt dir, dass ein Parameter von Typ int (also Ganzzahl erwartet wird).

Der Aufruf schaut dementsprechend zB so aus:
Code:
setServoTo(15);

Bei
Code:
unsigned int readAnalog(void);
wird eine Methode readAnalog definiert, die also Rückgabe-Type "unsigned int", also positive Ganzzahlwerte hat und keine Parameter (void) erwartet. Das "void" hier ist allerdings optional.

Der Aufruf schaut etwa so aus:
Code:
unsigned int messwert;
messwert = readAnalog();

In der Variable messwert steht nun die Rückgabe von readAnalog(). Diesen Wert kannst du dann später mit return auch wieder in deiner eigenen Methode zurückgeben.
 
PapstRatze schrieb:
Also wäre für Aufgabe 1 die Funktion in etwas so:

Code:
int setServoAndRead(int percentage)
{
  void setServoTo(int percentage);

  void waitMilliseconds(unsigned int 300);
  
  unsigned int readAnalog(void);

  return readAnalog()
}

Sieht komisch aus:
Eher so...
Code:
int setServoAndRead(int percentage)
{
  setServoTo(percentage);

  waitMilliseconds(300);
  
  static int letzterWert;

  letzterWert = percentage;
  
  return readAnalog();
}
 
Zuletzt bearbeitet:
Laut Aufgabenstellung musst du ja noch setServoAndRead testen.

Da readAnalog() "liefert einen Wert von 0 bis 1023, welcher linear von der Spannung an Pin 1.5 abhängt.", musst du hier wohl noch umrechnen und dann testen, ob das Stellen funktioniert hat.
 
Wie snow1 schon schreibt sollst du die Funktion ja testen. Die Frage ist, was genau damit gemeint ist. Ob Werte rauskommen? Oder ob richtige Werte rauskommen? Demnach musst du evtl. noch ein wenig Logik einbauen um zu schauen ob das richtige dabei rauskommt.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben