Forum: Compiler & IDEs PORT-PIN Config


von Neuling (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Neuling (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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).

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.