mikrocontroller.net

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


Autor: Bernhard Wächter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
...
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
if ( PINC & (1<<PINC1) ) {
  /* Aktion */
}
 
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */
if ( !(PINB & (1<<PINB2)) ) {
  /* Aktion */
}
...

Ich möchte nun eine ganz simple virtuelle Tasterabfrage realisieren und 
habe dazu folgendes programmiert:
#include <avr/io.h>

#include <util/delay.h>

#define MEINBIT1 1;
#define MEINBIT2 2;
#define MEINBIT3 3;
uint8_t AbfragePINB1 ;

int main(void) {

  DDRD  |=    1<<MEINBIT1;    //DDRD.1 als Ausgang!
  DDRB  &=    ~1<<MEINBIT1;    //DDRB.1 als Eingang!

  PORTD  = 0x00;            //PORTD LOW
  PINB  = 0xFF;            //Pullup on

  while(1) {

    AbfragePINB1 = PINB1;
  
    if ( !(AbfragePINB1 & (1<<MEINBIT1)) ) {

  

      PORTD = 0xFD;
    }

  
     

  } return(1);
} 

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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
DDRB &= ~(1<<MEINBIT1); 

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard Wächter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daaanke :) Jetzt hab ichs verstanden :) eigentlich ganz logisch!

Ok dann programmier ich mal weiter ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.