Forum: Mikrocontroller und Digitale Elektronik wie bits maskieren, bevor mit PINx eingelesen wird?


von PSpice (Gast)


Lesenswert?

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

von Martin V. (oldmax)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von PSpice (Gast)


Lesenswert?

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ß

von Niemand (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

Niemand schrieb:
1
((temp & 0b00010000) >> 1) & (temp & 0b00000111)

Das Ergebnis hiervon ist immer 0.
Ein '|' in der Mitte wäre besser. ;-)

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.