Forum: Mikrocontroller und Digitale Elektronik Anfängerproblem mit if Schleife


von Bernhard Wächter (Gast)


Lesenswert?

Hallo Zusammen!

Ich habe heute mit C-Programmierung eines At90S2313 angefangen. Da mein 
Programmierboard noch in Arbeit ist mach ich zunächst alles virtuell im 
AvrStudio 4. Früher so vor 3 Jahren hatte ich mich schon einmal mit 
Assembler auseinandergesetzt, möchte aber eigentlich lieber C lernen.

So nun zum Problem. Im Tutorial habe ich folgende Codezeile gefunden:
1
#include <avr/io.h>
2
...
3
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
4
if ( PINC & (1<<PINC1) ) {
5
  /* Aktion */
6
}
7
 
8
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */
9
if ( !(PINB & (1<<PINB2)) ) {
10
  /* Aktion */
11
}
12
...

Ich möchte nun eine ganz simple virtuelle Tasterabfrage realisieren und 
habe dazu folgendes programmiert:
1
#include <avr/io.h>
2
3
#include <util/delay.h>
4
5
#define MEINBIT1 1;
6
#define MEINBIT2 2;
7
#define MEINBIT3 3;
8
uint8_t AbfragePINB1 ;
9
10
int main(void) {
11
12
  DDRD  |=    1<<MEINBIT1;    //DDRD.1 als Ausgang!
13
  DDRB  &=    ~1<<MEINBIT1;    //DDRB.1 als Eingang!
14
15
  PORTD  = 0x00;            //PORTD LOW
16
  PINB  = 0xFF;            //Pullup on
17
18
  while(1) {
19
20
    AbfragePINB1 = PINB1;
21
  
22
    if ( !(AbfragePINB1 & (1<<MEINBIT1)) ) {
23
24
  
25
26
      PORTD = 0xFD;
27
    }
28
29
  
30
     
31
32
  } return(1);
33
}

Aber jedes mal wenn ich diese if Abfrage mit dem ! verwende kommt beim 
builden folgende Fehlermeldung:

../Versuch1.c:22: error: expected ')' before ';' token

Ich verstehs nicht...

Achja und kann mir bitte jemand erklären für was diese zahlen in den 
Klammern nach dem while und return Befehl bedeuten...? bitte

von Johannes M. (johnny-m)


Lesenswert?

>   AbfragePINB1 = PINB1;
PINB1 gehört da nicht hin, sondern PINB ...

> DDRB  &=    ~1<<MEINBIT1;
...und das geht schief, weil der Bitkomplement-Operator "~" eine höhere 
Priorität hat als der Schiebeoperator "<<". Es muss heißen
1
DDRB &= ~(1<<MEINBIT1);

...und: if ist keine Schleife, sondern eine Verzweigung bzw. 
Abfrage...

von Karl H. (kbuchegg)


Lesenswert?

Bernhard Wächter wrote:
>
> #define MEINBIT1 1;

Ein #define definiert einfach nur eine Textersetzung.
Dieses #define hier bedeutet, dass überall dort wo der Text "MEINBIT1"
im Quellcode vorkommt, dieser Text durch "1;" ersetzt werden soll.

Wo kommt dieser Text vor?
Na hier

    if ( !(AbfragePINB1 & (1<<MEINBIT1)) ) {

und jetzt mach mal die Textersetzung. Ersetze "MEINBIT1" durch
"1;".   Du erhältst:

    if ( !(AbfragePINB1 & (1<< 1;)) ) {
                                ^
Und jetzt die Frage:            |
Was soll der ; hier ------------+

> Achja und kann mir bitte jemand erklären für was diese zahlen in den
> Klammern nach dem while und return Befehl bedeuten...? *bitte*

while .... ist ein Schleifenkonstrukt. Solange eine Bedingung wahr
ist, wird der Schleifenrumpf wiederholt.

   while( 1 )

Was ist in diesem Fall die Bedingung. Die Bedingung ist "1"
Jetzt kommt eine andere C-Regel zur Anwendung. Jeder arithmetische
Ausdruck kann auch als boolscher Wert verwendet werden. In diesem
Fall gilt: 0 repräsentiert den Wert 'logisch falsch', während
jeder nicht 0 Wert den logischen Wert 'logisch wahr' darstellt.
Die while Schleife hat also als Bedingung: immer wahr. Und da
die Bedingung immer wahr ist, kann diese Schleife nie abgebrochen
werden. Es handelt sich also um eine Endlosschleife, die ständig
wiederholt wird.

return(0)

Die Klammern sind bei return unnötig. return ist keine Funktion.
return 0 .... besagt ganz einfach, dass diese Funktion (auch main
ist nichts anderes als eine Funktion) bei ihrer Rückkehr den Wert
0 liefern soll. Eine Funktion liefert einen Wert. So wie zb die
Sinus Funktion einen Wert liefert, nämlich den Sinus des angegebenen
Winkels

   j = sin(winkel)

Innerhalb der sin-Funktion werden irgendwelche Berechnungen angestellt
bis der Sinus Wert feststeht und dann muss diese Funktion diesen Wert
zurückliefern, so dass er dem Aufrufer zur Verfügung steht. Genau das
macht 'return': Es legt fest welcher Wert zurückgeliefert wird.
Und da deine main - Funktion eine int Funktion ist

int main()

wurde hier festgelegt, dass main einen int, also eine ganze Zahl
zurückliefern wird. Daher sollte die Funktion das aber auch machen,
und tut sie auch. Sie liefert 0 zurück -   return 0;

von Pete K. (pete77)


Lesenswert?

while (1) bedeutet, dass die schleife immer durchlaufen wird (Bedingung 
der while-Schleife ist true).

1= true
0=false  (wenn nicht anders definiert)

Der Wert hinter return ist ein beliebiger Rückgabewert. I.a. verwendet 
man return(0) für Rückgabe ohne Fehler und return(1-n) für Rückgabe mit 
Fehlercode.

von Bernhard Wächter (Gast)


Lesenswert?

Daaanke :) Jetzt hab ichs verstanden :) eigentlich ganz logisch!

Ok dann programmier ich mal weiter ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.