Hi Leute, Bin noch ein anfänger und habe ein kleines Problem in meinem Testprogramm. Ich kann einen Taster and PORTD0 anschließen und der Tastendruck wird wahrgenommen. Aber wenn ich PORTD0 mit irgendeinem Pin von PORTB verbinde (wo alle pins 1 ausgeben) dann wird dies nicht mehr registriert. Hier ist mein code: #include <avr/io.h> #define true 1 #define false 0 #define bool unsigned char int main(void) { DDRB = 0xFF; DDRL = 0xFF; DDRD = 0x00; PORTD = 0xFF; PORTL = 0x00; PORTB = 0xFF; bool isDown = false; char outputVar = 0; while (true) { if (!(PIND & 1 << PIND0) && !isDown) { outputVar++; isDown = true; } else if ((PIND & 1 << PIND0) && isDown) isDown = false; PORTL = outputVar; } return 0; } Zwar prellt der Taster noch, aber das ist mir im Moment egal. Ich möchte eigentlich nur verstehen warum das nicht mit einer Verbindung zwischen PORTB und PORTD funktioniert wie bei der Verbindung von Taster zu PORTD. Was mache ich falsch? Gruß, Shibby
Auf den ersten Blick hängt dein Problem mit der Thematik hier zusammen: http://www.fh-wedel.de/~si/vorlesungen/c/ausdruecke/operatoren.html
Danke für die Antwort, aber ich sehe nicht wie die Operatorenabfolge das Problem verursacht. Könntest du vielleicht erläutern wo genau du das Problem siehst? Oder liegt es vielleicht doch an was anderem? Gruß, Shibby
>Könntest du vielleicht erläutern wo genau du das >Problem siehst? Kleiner Tip: Lieber mal ein paar Klammern mehr setzen. Auch wenn man denkt sie wären nicht nötig.
Ich glaube mir leuchtets ein. So richtig? if (!(PIND & (1 << PIND0)) && !isDown) Ich schreibe normalerweise nur Windows apps mit C++ und C# und benutze daher nie << (jajaja overloaded << operators für Objekte schon aber auch kaum). Ich wusste garnicht dass es ne höhere Precedence als & hat (sofern ich jetzt richgig liege).
Shibby schrieb: > Danke für die Antwort, aber ich sehe nicht wie die Operatorenabfolge das > Problem verursacht. Könntest du vielleicht erläutern wo genau du das > Problem siehst? Oder liegt es vielleicht doch an was anderem? > > Gruß, > Shibby Da das Shifting mit 0 arbeitet funktioniert es zufällig Für alle anderen Werte baust du mist, weil du erst alles ausser bit0 herausmaskierst und das Ergebnis dann shiftest. Du willst aber alle ausser bitN herausmaskieren. !(PIND & Bitmaske) ist dann wahr, wenn KEIN high signal anliegt. Dein Button zieht den Pin nach GND herunter (deswegen sind dort ja auch die Pullups eingeschaltet), sonst würdest du gar nichts bemerken (was du bei dem Verbinden mit High ja auch feststellst).
Super! Danke habs geschnallt. Müsste ja funktionieren wenn ich die pull-ups deaktiviere und stattdessen auf: if (PIND & (1 << PIND0) && !isDown) teste. Dann kann ich auch über das Verbinden der Pins inkrementieren.
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.