einfacher C-Code funzt nicht

Gast #59088
Lesenswert?

hallo,
hab eben versucht ein total einfaches programm, das ich in C
(Codevision) geschrieben habe, zum laufen zu bringen.(auf meinem
at90s8535) geht aber wie üblich nicht. eine LED (zwischen GND und PC0)
soll leuchten, wenn der schalter (zwischen GND und PC1) auf on steht.
der schalter funktioniert und die LED auch. hier der code:

#include <90s8535.h>

main()
{
DDRC=0b00000001;
PORTC=0b00000000;
t:
if (PINC=0b00000011);
PORTC=0b00000001;
if (PINC=0b00000001);
PORTC=0b00000000;
goto t;
}

anstatt das die LED nur leuchtet, wenn die verbindung zwischen GND und
PC1 ist, leuchtet sie immer, auch wen der schalter auf on ist.
es liegt wohl am code.
helft mir!

mfg raoul4
Gast #59090
Lesenswert?

> if (PINC=0b00000011);
Den Strichpunkt am Zeilenende entfernen. (in beiden Ifs)
Sonst wird, wenn die Abfrage TRUE ist, nur ein "Leerkommando" (kann
man so sagen?) ausgeführt. Das PortC=1; danach kommt immer. Genau wie
das nachfolgende PortC=0; immer ausgeführt wird.

Eigentlich müßte die LED gedimmt leuchten, da die Zeit nach PortC=0;
länger ist als wie nach PortC=1;
Noch genauer betrachtet müsste sich sogar die Helligkeit ändern, je
nachdem ob der Taster gedrückt ist oder nicht (vielleicht nur mit Oszi
erkennbar).

Du willst, daß die LED leuchtet, wenn der Taster gedrückt ist. Momentan
wäre dies aber genau umgekehrt (wenn man sich die beschriebenen Fehler
schon rausdenkt).

> goto t;
Bitte? ;)  while(1) {    if-abfragen usw.;    }

Schmittchen.
Gast #59091
Lesenswert?

Nun, Du solltest wohl mal C lernen. ;-)

t:
...
goto t;

ist schon recht lustig.  In C schreibt man das eher so:

for (;;) {
 ...
}

Außerdem hast Du den Unterschied zwischen einer Zuweisung (=) und
einem Test auf Gleichheit (==) nicht verstanden; das ist hier Dein
eigentliches Problem.

Sinnvoller als ein Test auf Gleichheit ist aber ohnehin eher ein Test
auf einen bestimmten Bit-Wert sowie das Setzen/Löschen nur eines Bits:

if (PINC & 2)
  PORTC |= 1;
else
  PORTC &= ~1;
Gast #59093
Lesenswert?

Drei verschiedene (zeitgleiche) Posts - 3x verschiedene Fehler
gefunden. Wie viele Fehler in den 8 Zeilen stecken können :)

@ape: Doch, (wie von Jörg schon gesagt): Der Vergleichsoperator besteht
aus den 2 Gleichheitszeichen "==".
Gast #59095
Lesenswert?

#include <90s8535.h>

main()
{
DDRC=0b00000001;
PORTC=0b00000000;
t:
if (PINC=0b00000011);
PORTC=0b00000001;
if (PINC=0b00000001);
PORTC=0b00000000;
goto t;
}

 Leider nicht wirklich gut. Ich machs so:

#include <90s8535.h>

#define Led      PORTC.0     // Led
#define Schalter                PINC.1     //Schalter



main()
{
DDRC  =  0b00000001;
PORTC =  0b00000000;

      while (1)            //Endlosschleife
          {

          Led  =  !Key     //Schalterzustand an die Led, Rufez.negiert

           }

}
Gast #59098
Lesenswert?

|               Bitweise Oder-Verknüpfung
 &               Bitweise Und-Verknüpfung
 ~1              Bitweises Komplement
 ^               Bitweises Exclusive ODER

 Byte |= (1<<4)   ist gleich Kurzform von  Byte =  Byte | (1<< 4)  //ein
Bit setzen in einer Char-Variable

Gutes C-Buch: C für Mikrocontroller  (Schwerpunkt AVR- Controller)
von Burkhard Mann und "Jetzt lerne Ich C" von Peter Monadjemi


Schöne Grüße Josef
Gast #59099
Lesenswert?

> wenn ich jetzt mit meinem finger an irgendein masseteil komme wird
> die LED entweder heller oder geht aus. wieso?

Weil Du keine definierten Pegel hast.  Wahrscheinlich schwingt der
Eingang gelegentlich sogar fröhlich vor sich hin (daher wird die LED
heller oder dunkler).  Du solltest mindestens die Pullups aktivieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren