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
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
> 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.
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;
is nich verlgeichsoperator auch == (2 gleichzeichen) und nicht nur = (1 gleichzeichen)
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 "==".
ok beim überfliegen übersehn hatte mich shcon gewundert das das niemand gemekrt hat
#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 } }
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
| 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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.