wie bits maskieren, bevor mit PINx eingelesen wird?

Gast #1362759
Hallo,

ich habe folgendes Problem, ich habe ein Atmega8 wo PB0-PB3 belegt ist.
An diesen Portpinnen lese ich die Stati ein.
Nun benötige ich den PB3 für einen Timer. Wenn ich nun den belegten PB3 
auf PB4 lege, kann ich nicht mehr so schön die 4bit mit den richtigen 
wertigkeiten einlesen. Ist es möglich auch diese 4Bits bereits beim 
einlesen zu maskieren, damit ich den PB3 "ausblenden" kann?
Würde das so klappen, wenn ich die 4bits an PB0, PB1, PB2, PB4 maskiere?

if (PINB & 0b00010111) ....


danke und gruß
spice
Hi
Kurz gesagt "Why not?" aber einen Hinweis hab ich trotzdem...
Ich hab die Pinstreuung damit zwar nicht behoben, aber im Programm liest 
es sich besser. Einfach ein Byte als Variable benutzen (z.B. In_Bits_A) 
und in einer Leseroutine dieses mit den verfügbaren Eingangsbits 
beschreiben. Damit kann im laufenden Programm jederzeit auf die Bits 
zugegriffen werden.
Es ist eh sinnvoll, anfangs die IO zu lesen, die Bearbeitung 
durchzuführen und anschließend die IO zu schreiben. Dazu benutze ich 
immer Variablen, die entsprechend in der Programmschleife ausgewertet 
werden. Muß nun die IO angepaßt werden, ist es nur in der Leseroutine 
notwendig. Ausgabe ist im Prinzip dasselbe. Eine Variable Out_Bits_A 
kann die bearbeiteten Bits an die Schreibroutine übergeben, die dann die 
Bits den Portbits zuordnet. Auch hier ist nur eine Stelle zur Änderung 
oder Zuordnung der Portbits vorhanden und man braucht nicht das ganze 
Programm mühsam durchsuchen.
Gruß oldmax
Hallo,

bei mir würden die Sachen ohnehin per define Namen bekommen.

if (PINB & 0b00010111) ....

#define CTRL_PIN PINB
#define BITNAME1 PB0
#define BITNAME2 PB1
usw.

#define CTRL_MASK ((1<<BITNAME1) | (1<<BITNAME2) | ...)

BITNAME1 sollte natürlich auch ein sprechender Name sein.

Würde dann eben

 if(CTRL_PIN & CTRL_MASK) heißen.

Die Maske kann man dann schön aus den Definitionen der Bit(Pin)namen 
zusammendefinieren.
Das ganze dann ins headerfile und es gibt nur eine Stelle, die verändert 
werden muß.

PS zum Betreff:
>wie bits maskieren, bevor mit PINx eingelesen wird?
Das geht letztlich ohnehin nicht, das kann ein AVR nicht.
Es wird letztlich immer erst gelsen, dann maskiert, auch wenn Du da in C 
letztlich nicht viel von mitbekommst.

Gruß aus Berlin
Michael
Gast
Besten Dank,
werde das mit den defines sicher auch machen, da es schon 
übersichtlicher und einfacher zu warten ist, aber so vom Prinzip her 
funktioniert das so
also?!
Danke und Gruß
Gast
>aber so vom Prinzip her funktioniert das so also?!
Nein.

Soweit ich verstanden habe, ist der Kernpunkt, das sich durch die neue 
Belegung des Bits mit der höchsten Wertigkeit, diese von 2^3 auf 2^4 
verändert.
Die Bitmaske 0b00010111 sorgt erstmal nur dafür das keine weiteren 
Bits in nachfolgenden Berechnungen einbezogen werden. Die Wertigkeit ist 
aber immer noch nicht so wie vorher, als Du Bit 3 benutzt hast. Dazu 
musst Du das Bit auch verschieben.
1
unsigned char temp;
2
temp = PINB;
3

4
((temp & 0b00010000) >> 1) & (temp & 0b00000111)

Dafür gäbe es auch alternative Ausdrucksmöglichkeiten.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.