www.mikrocontroller.net

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


Autor: raoul4 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

Autor: ape (Gast)
Datum:

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

Autor: Schmittchen (Gast)
Datum:

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

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok beim überfliegen übersehn hatte mich shcon gewundert das das niemand
gemekrt hat

Autor: Josef (Gast)
Datum:

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

           }

}

Autor: raoul4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke!!!!!!!!!!!!!!!!!!!

mfg raoul4

Autor: raoul4 (Gast)
Datum:

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

Autor: Josef (Gast)
Datum:

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

Autor: Joerg Wunsch (Gast)
Datum:

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

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.