Forum: Mikrocontroller und Digitale Elektronik 4 Bit auf einem "halben" Port eines AVRs ausgeben?


von Rainer (Gast)


Lesenswert?

hi

Ich hab grad ein Durchhänger :-( Ich will jeweils vier Bits eines 
Atmega16-Ports getrennt verwenden.  Bitweises setzen funktioniert schon.

Aber jetzt will eine Binärzahl ( 0 .. 16 ) auf den vier höherwertigen 
Bits ausgeben ohne das die vier niederwertigen Bits beeinflusst werden.

wie geht das?

Rainer

von Franz-Rainer (Gast)


Lesenswert?

In welcher Programmiersprache?

von Rainer (Gast)


Lesenswert?

hi

ich benutze ein STK500 und verwenden den GNU-C-Compiler

Rainer

von Johannes S. (Gast)


Lesenswert?

in C würds i etwa so gehen ohne es hetzt probiert zu haben:

port x = (variable << 4) | (pin x & 0x0F)

von johnny.m (Gast)


Lesenswert?

Wenn die Zustände der 4 restlichen Pins nicht verändert werden sollen, 
dann
1
PORTx = (var << 4) | (PORTx & 0x0F);

Und bitte hinten nicht PINx sondern PORTx nehmen. Sonst kann es zu 
unerwünschten Nebeneffekten kommen...

von Johannes S. (Gast)


Lesenswert?

>Und bitte hinten nicht PINx sondern PORTx nehmen
Aber Pin ist doch immer gleich demn Port wenn die DDR auf Ausgang gesetz 
ist.
Ist dies nicht der Fall, macht das schreiben auf den Port doch ohnehin 
keinen Sinn (abgesehen von der aktivierung der Pull Ups, aber das ist 
hier nicht der Fall)

von johnny.m (Gast)


Lesenswert?

@Johannes S.:
Rainer schreibt explizit, dass die 4 LSB nicht beeinflusst werden 
sollen, aber kein Wort darüber, ob die als Ein- oder Ausgänge 
konfiguriert sind. Und wenn sie als Eingänge konfiguriert sind, dann 
kann die Variante mit PINx tödlich sein (zumindest funktionell). Ich 
weiß nicht, wo Du die Weisheit herhast, die in Deinem letzten Satz 
steht...

von Tom (Gast)


Lesenswert?

> Aber Pin ist doch immer gleich demn Port wenn die DDR auf Ausgang gesetz
> ist.

Ne ist es nicht. Beispiel: Der Port ist Ausgang und logisch eins, aber 
nach Masse kurzgeschlossen. PIN liefert Null, aber PORT liefert Eins.

Klar ist Kurzschluss nicht erlaubt, aber es kann sich ja auch um 
transiente Vorgänge handeln wie kapazitive Last.

von Johannes S. (Gast)


Lesenswert?

>Ich weiß nicht, wo Du die Weisheit herhast, die in Deinem letzten Satz
> steht...

Solche Weisheiten stammen, wie die meisten meiner Weisheiten, aus dem 
Datenblatt. 
(http://www.atmel.com/dyn/resources/prod_documents/doc2467.pdf Seite 66 
ist das Symbolschaltbild des Ports und auch der PullUp zu sehen)

von Johannes S. (Gast)


Lesenswert?

>Ne ist es nicht. Beispiel: Der Port ist Ausgang und logisch eins, aber
>nach Masse kurzgeschlossen. PIN liefert Null, aber PORT liefert Eins.

Stimmt, an das habe ich nicht gedachte. Danke für die Info!

von johnny.m (Gast)


Lesenswert?

@Johannes S.:
Mit der "Weisheit" meinte ich eigentlich die Aussage, dass das mit der 
Aktivierung der Pull-Ups hier nicht der Fall sei...

PINx ist nur dann zu benutzen, wenn man tatsächlich von außen 
vorgegebene Zustände einlesen will. Zum Ausmaskieren von Pins beim 
Schreibzugriff immer PORTx lesen, sonst gehts aus o.g. Gründen schief.

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.