www.mikrocontroller.net

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


Autor: PSpice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: PSpice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Niemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
unsigned char temp;
temp = PINB;

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


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

Autor: Stefan Ernst (sternst)
Datum:

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.