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
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ß
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.