PORT-PIN Config

Gast #2466574
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
#2466619
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.
Moderator Persönliche Seite #2466623
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.
Gast #2466645
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
Moderator Persönliche Seite #2466656
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).
#2466746
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.