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
hi ich benutze ein STK500 und verwenden den GNU-C-Compiler Rainer
in C würds i etwa so gehen ohne es hetzt probiert zu haben: port x = (variable << 4) | (pin x & 0x0F)
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...
>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)
@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...
> 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.
>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)
>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!
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.