-         

Ergebnis 1 bis 5 von 5

Thema: neue funktion, wie geht das?

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344

    neue funktion, wie geht das?

    Anzeige

    hi allerseits,

    das progrämmchen von hermann gefält mir so gut, dass ich es als eine funktion in jedem programm haben möchte. Der aufruf:

    Code:
    void WaitforStart(void); // blink until any switch is pressed, 
                          // then wait until switch is released
    der code selbst:
    Code:
    void WaitforStart(void)    // blink until any switch is pressed, 
    {                       // then wait until switch is released 
      uint8_t t1, t2; 
      unsigned int col=OFF; 
    
      while (1)             // blinking StatusLED until any switch is pressed 
      { 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); 
        if (t1==t2) 
        { 
          if (t1) 
          { 
            break; 
          } 
          else 
          { 
            col ^= GREEN; 
            StatusLED(col); 
          } 
        } 
        Msleep(50); 
      } 
    
      StatusLED(OFF);       // turn off StatusLED and ... 
      BackLED(ON,ON);       // ... turn on both BackLED's 
    
      while (1)             // wait until switch is released 
      { 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); 
        if (t1==t2) 
        { 
          if (!t1) 
          { 
            break; 
          } 
        } 
        Msleep(50); 
      } 
    
      BackLED(OFF,OFF);     // turn off BackLED's indication start of race 
    }
    wie mache ich das nun?

    danke schon mal für Euere tipps...
    gruß inka

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    01.02.2007
    Ort
    Ashausen
    Alter
    59
    Beiträge
    64
    Hi inka,

    das ist nicht so schwer. Es gibt wie immer verschieden Möglichkeiten. Wenn Du die Funktion in jedem Programm haben willst, dann empfiehlt sich folgendes:
    Du erstellest zwei neue Dateien "inka.h" und inka.c".

    So sieht die inka.h aus
    Code:
    #ifndef INKA_H_
    #define INKA_H_
    
    #endif /*INKA_H_*/
    
    void WaitforStart(void); // blink until any switch is pressed, 
                          // then wait until switch is released
    und so die "inka.c"
    Code:
    void WaitforStart(void)    // blink until any switch is pressed, 
    {                       // then wait until switch is released 
      uint8_t t1, t2; 
      unsigned int col=OFF; 
    
      while (1)             // blinking StatusLED until any switch is pressed 
      { 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); 
        if (t1==t2) 
        { 
          if (t1) 
          { 
            break; 
          } 
          else 
          { 
            col ^= GREEN; 
            StatusLED(col); 
          } 
        } 
        Msleep(50); 
      } 
    
      StatusLED(OFF);       // turn off StatusLED and ... 
      BackLED(ON,ON);       // ... turn on both BackLED's 
    
      while (1)             // wait until switch is released 
      { 
        t1 = PollSwitch(); 
        t2 = PollSwitch(); 
        if (t1==t2) 
        { 
          if (!t1) 
          { 
            break; 
          } 
        } 
        Msleep(50); 
      } 
    
      BackLED(OFF,OFF);     // turn off BackLED's indication start of race 
    }
    Im deinem Hauptprogramm (nennen wir es "test.c") machst Du dann folgendes:
    Code:
    #include "inka.h" 
    #include "asuro.h"
    // weitere #include Anweisungen
    
    int main(void)
    {
    	
      Init();
      WaitforStart();
     
      while(1)
      {
        // Dein Programm
      } 
      return 0;
    }
    Damit sollte es funktionieren. Wenn Du noch Fragen hast, dann frag einfach...

    Noch ein kleiner Hinweis: void WaitforStart(void); ist nicht der Aufruf der Funktion, sonder die Deklaration. Damit sagst Du dem Programm, dass es eine solche Funktion gibt, und welche Parameter und Returnwerte es erwartet bzw. zurück gibt. Der Aufruf erfolgt immer mit den Konkreten Parametern – in diesem Fall also keinen (void).

    Gruß,

    _HP_
    Ist es nicht schrecklich, dass der menschlichen Klugheit so enge Grenzen gesetzt sind und der menschlichen Dummheit überhaupt keine?
    - Konrad Adenauer

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Ich möchte mal darauf hinweisen, dass C außer while() noch andere Schleifenstrukturen kennt, z.B.:

    do while()

    Damit würde doch so ein Progrämmchen viel netter aussehen und die unschönen break-Anweisungen würden verschwinden:

    char t,t1;
    do {
    /* Platz fuer Schleifeninhalt */
    t1=t;
    t=PollSwitch();
    }while (( t& t1)==0);

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    hi ihr beiden, es hat mit der funktion geklappt, auch mit der neuen lib.

    Ich glaube ich hab mich schon lange nicht mehr so gefreut über eine grün blinkende LED die nach dem drücken eines tasters auf rot umschaltete . Trotz der breaks, die kommen "morgen" dran...

    danke nochmals


    @radbruch
    in den
    /* Platz fuer Schleifeninhalt */
    kommt da das ganze programm rein, incl. des "return 0" am schluss? wohl eher nicht, oder?
    braucht man in deinem beispiel die zweifache abfrage von PollSwitch nicht?
    gruß inka

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Nein, das Ganze kommt irgendwo IN ein Programm und soll dazu dienen, eine gedrückte Taste abzuwarten.
    Als "Schleifeninhalt" würde sich hier z.B. ein Blinken der StatusLED anbieten:

    StatusLED(GREEN);
    Msleep(200);
    StatusLED(OFF);
    Msleep(300);

    Bei diesem Beispiel muss aber die Taste mindestens eine Sekunde (=zwei Durchläufe) gedrückt sein um erkannt zu werden.

    Ein Abfrage in dieser Art:

    t=PollSwitch();
    t1=PollSwicht();

    könnte dazu führen, dass bei einer Störung durch die unmittelbar folgenden Abfragen mit PollSwitch() sowohl bei t als auch bei t1 falsche Werte geliefert werden könnten. Deshalb lese ich je Runde (=Programmzyklus) nur einmal einen Wert aus (t) und vergleiche dann diesen mit dem Wert der letzten Runde (t1).

    while() prüft VOR dem Eintritt der Schleife, ob die Abbruchbedingung erfüllt ist. Deshalb muss man die zu prüfenden Bedingungen schon zuvor sezten und die Schleife wird gegebenenfalls nicht betreten.

    do while() wird immer zumindest einmal ausgeführt und prüft erst am Ende der Schleife, ob die Abbruchbedingung erfüllt ist. Für Abfragen auf Bedingungen, die während der Schleifenausführung auftreten, ist es deshalb meiner Meinung nach die bessere Wahl.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •