PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : neue funktion, wie geht das?



inka
30.04.2007, 09:49
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:


void WaitforStart(void); // blink until any switch is pressed,
// then wait until switch is released

der code selbst:

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

_HP_
30.04.2007, 10:39
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


#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"


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:


#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_

radbruch
30.04.2007, 11:34
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

inka
30.04.2007, 16:30
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?

radbruch
01.05.2007, 10:23
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