Forum: Mikrocontroller und Digitale Elektronik einfacher C-Code funzt nicht


von raoul4 (Gast)


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

von Peter D. (peda)


Lesenswert?

Mit PORTC=0b00000000; ist auch PINC0 = 0 und damit kann keine Deiner
Bedingungen war werden.

Wenn man nur bestimmte Pins testen will, maskiert man die anderen
heraus, z.B.:

if( PINC & (1<<PC1) )
  PORTC = 1;
else
  PORTC = 0;


Peter

von Schmittchen (Gast)


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.

von Joerg Wunsch (Gast)


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;

von ape (Gast)


Lesenswert?

is nich verlgeichsoperator auch == (2 gleichzeichen) und nicht nur = (1
gleichzeichen)

von Schmittchen (Gast)


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

von ape (Gast)


Lesenswert?

ok beim überfliegen übersehn hatte mich shcon gewundert das das niemand
gemekrt hat

von Josef (Gast)


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

           }

}

von raoul4 (Gast)


Lesenswert?

danke!!!!!!!!!!!!!!!!!!!

mfg raoul4

von raoul4 (Gast)


Lesenswert?

dazu nochmal eine frage:
was bedeutet |=, &= und ~1 ? und außerdem: wenn ich jetzt mit meinem
finger an irgendein masseteil komme wird die LED entweder heller oder
geht aus. wieso?

mfg raoul4

von Josef (Gast)


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

von Joerg Wunsch (Gast)


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.

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.