Forum: Mikrocontroller und Digitale Elektronik return Befehl - Werterückgabe nutzen aber wie?


von Jens (Gast)


Lesenswert?

Hallo,
bisher habe ich um "return" einen großen Bogen gemacht ... aber ein 
Kollege hat mich auf den Geschmak gebracht, allerdings habe ich nicht 
wirklich etwas gefunden, was das Ganze ausführlich erklärt.

meine Funktion lautet:

void lkey(void)
{
  if ((PINC & 0b00000100) == 0b00000011) return 1; // Taste links
  return 0;
}

jetzt will ich im Programm etwas solange ausführen bis jemand die Taste 
links gedrückt gedrückt hat, also solange return 0. Aber wie mache ich 
das?

while ( rkey() == 1 )    //
  {
                 // Anweisung
        }

../setup.c:239: error: void value not ignored as it ought to be

beschwert sich das AVR-Studio, aber für euch ist das doch ein leichtes 
oder?
Danke

: Gesperrt durch User
von holgef (Gast)


Lesenswert?

Eine void Funktion gibt nichts per return zurück.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

1
void lkey(void)
Fast. Du musst dem Compiler sagen, von welchem Datentyp der Wert ist, 
den du zurückgeben willst. "void" bedeutet "nichts", also dass du nichts 
zurück geben willst. Wenn du also einen integer zurückgeben willst, 
schreibst du:
1
int lkey (void) {
Die while-Schleife sieht so schonmal ganz gut aus.
Edit: Wenn du jedoch nur 1 oder 0 zurückgeben willst, solltest du 
vielleicht char statt int nehmen, dann sparst du ein byte.

von Jens (Gast)


Lesenswert?

also mit:

unsigned char mkey(void)
{}

läßt es sich compailieren, aber es funzt ned :(

if (mkey() == 1) PORTE |= (1<<PE5);

sprich wenn ich den Knopf für mkey() drücke sollte die LED angehen, tut 
se aber nicht, aber eine andere LED zeigt mir an, daß ich diesen 
Programmteil auf jeden Fall erreiche.

if ( mkey() ) ändert auch nix, kommt mir so vor, wie wenn das mit dem 
return irgendwie nicht gehen würde ...

von John S. (linux_80)


Lesenswert?

Hallo,

ich glaub die Abfrage innerhalb dieser Funktion haut noch nicht so ganz 
hin !
1
(PINC & 0b00000100)
2
     == 0b00000011

damit werden die falschen Bits maskiert und abgefragt.

von Malte (Gast)


Lesenswert?

Dein Tasten einlesen ist nicht richtig.

(PINC & 0b00000100) == 0b00000011

Das in Klammern liefert die eine 1 wenn du die Taste an PC2 drückst. 
Aber eine 1 ist immer ungleich 3 (0b00000011).

von Ste N. (steno)


Lesenswert?

Hallo Jens,

ich weiß nicht was in deiner mkey() Funktion steht, wenn es aber das 
gleiche wie in lkey() ist, wundert es mich nicht das es nicht 
funktioniert.

// if ((PINC & 0b00000100) == 0b00000011) return 1; // Taste links

Schau dir mal die Bits an, diese if() Abfrage wird wohl nie TRUE 
ergeben...

Viele Grüße,
Steffen

von Ste N. (steno)


Lesenswert?

Hallo Malte,

ich kenn mich jetzt nicht so mit dem GNU Compiler aus, aber ich hätte 
gedacht das

(PINC & 0b00000100)

eine 0 oder 4 als Ergebnis liefert?

Gruß, Steffen

von Jens (Gast)


Lesenswert?

als bin ich echt de Held - hab die Funktion bei meinem Kollegen 
abgeschrieben, allerdings wollte er bei SICH verhindern, daß mehrere 
Knöpfe gleichzeitig gedrückt sind und ich hab das bei der Portierung zu 
meinem Projekt ned bedacht und daher stand da Käse drin ... und dann als 
das Problem beim retrun-Befehl gesucht ...

danke :)

von holger (Gast)


Lesenswert?

>hab die Funktion bei meinem Kollegen
>abgeschrieben

Abschreiben war noch nie eine gute Idee.
Zwischen deinen Ohren befindet sich eine Masse
mit der einige Menschen scheinbar dazu
in der Lage sind selbstständig zu denken.
Einfache logische Verknüpfungen sollen selbst
Affen schaffen: Feuer = Aua, kein Feuer kein Aua.

von Tobias D. (tobias92)


Lesenswert?

kann mir jemand noch mal bitte die returnfunktion erklären?^^
ich versteh das noch nicht ganz, was sie zurück gibt & an wen.

tobias

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es ist keine Funktion. Zurückgegeben wird das, was hinter "return" steht 
- und zwar an den Aufrufer.

Literaturhinweis: "Programmieren in C"

Im übrigen ist das Ausbuddeln alter Threads hier nicht erwünscht, wenn 
Du Fragen hast, dann mach doch bitte dafür einen neuen, eigenen Thread 
auf.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.