hi, ich hab mal ne frage zum PINx Register meine zeile mit DDRD Funktioniert mit dem Pin-Namen nun möchte ich gern im PIND dieselbe schreibweise anwenden wie in DDRD nur weiss ich gead nich wie //Ausgänge #define TX PORTD_1 #define TLED PORTD_2 #define K1LED PORTD_5 #define K2LED PORTD_6 //EINGÄNGE #define RX PORTD_0 #define SYNC PORTD_3 DDRD = ((1<<TX)|(1<<K1LED)|(1<<K2LED)|(1<<TLED))& ~((1<<SYNC)|(1<<RX)); PIND = 0b00000001; //alle ausgänge auf low PD0 auf eingang mfg
Neuling schrieb: > DDRD = ((1<<TX)|(1<<K1LED)|(1<<K2LED)|(1<<TLED))& ~((1<<SYNC)|(1<<RX)); > PIND = 0b00000001; //alle ausgänge auf low PD0 auf eingang Da scheint ein grundsätzliches Misverständnis vorzuliegen. Das hier > PIND = 0b00000001; //alle ausgänge auf low PD0 auf eingang schaltet NICHT den Pin auf Eingang! Die Richtung, ob Eingang oder Ausgang, wird mit dem DDR Register festgelegt. Mit dem PIN Register holst du dir den tatsächlich Zustand des physikalischen Pins, so wie er dem µC von aussen elektrisch aufgezwungen wird. (Und bei den neueren AVR-µC kann man durch Setzen eines Bit im Pin Register den zugehörigen Pin im PORT Register toggeln. Aber das ist wohl nicht das, was du hier vor hast) D.h. Lass das PIN-Register in Ruhe. Es gibt nichts was du damit sinnvoll machen könntest.
Neuling schrieb: > DDRD = ((1<<TX)|(1<<K1LED)|(1<<K2LED)|(1<<TLED))& ~((1<<SYNC)|(1<<RX)); Du magst es gern umständlich? Damit man überhaupt nachvollziehen kann, was bei diesem umständlichen Ausdruck wirklich passiert (und ob es auch das ist, was du wolltest), muss man sich schon die Bits einzeln auf Kästchenpapier zeichnen ... Schreib doch einfach
1 | DDRD = ((1<<TX)|(1<<K1LED)|(1<<K2LED)|(1<<TLED)); |
Alle nicht genannten Bits (das sind immerhin zwei mehr als die, die du überhaupt benutzt) bleiben dabei auf jeden Fall 0.
Vielen Dank da hab ich was Durcheinander gebracht > Jörg ich finde die schreibweise für mich einfach übersichtlicher >Schreib doch einfach >DDRD = ((1<<TX)|(1<<K1LED)|(1<<K2LED)|(1<<TLED)); so hab ich ja nur die Ausgänge auf dem Port. Trotzdem nochmals vielen dank
Neuling schrieb: > so hab ich ja nur die Ausgänge auf dem Port. Alles andere sind per definitionem aber Eingänge. Einen "nicht Ausgang noch Eingang"-Modus gibt es nicht. Daher ist es Augenaus- wischerei, die Eingänge gesondert definieren zu wollen (zumal es dich ja ohnehin nicht davor feit, dass du u. U. die Bitdefinitionen auf das falsche Portregister anwendest).
Neuling schrieb: >>Schreib doch einfach >>DDRD = ((1<<TX)|(1<<K1LED)|(1<<K2LED)|(1<<TLED)); > so hab ich ja nur die Ausgänge auf dem Port. Allenfalls ist immer noch
1 | DDRD = ((1<<TX) | (1<<K1LED) | (1<<K2LED) | (1<<TLED) | (0<<SYNC) | (0<<RX)); |
möglich. Das Problem daran: Es geht da ein wenig unter, dass bei SYNC und RX ein 'Trick' benutzt wird (0 kann man schieben so oft man will, es bleibt trotzdem 0) und dieser Trick in der Optik etwas untergeht. Mit ein wenig optischem Pimpen kann man das etwas entschärfen
1 | DDRD = ((1<<TX) | (1<<K1LED) | (1<<K2LED) | (1<<TLED) | // Output |
2 | (0<<SYNC) | (0<<RX)); // Input |
Aber es ist immer noch allemal leichter zu lesen als deine Variante, bei
der man erst mal mühsam die Klammern auseinander klamüsern muss um
a) festzustellen, ob du alles richtig gemacht hast
b) festzustellen, was du da eigentlich gemacht hast
> ich finde die schreibweise für mich einfach übersichtlicher
Tja. Jeder hat das Recht dazu, sich selbst die Schreibweise so zurecht
zu legen, dass er am Anfang möglichst oft in Fallen tappt.
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.