Hallo, ich programmiere zur Zeit einen ATMEGA128 mit WinAVR in C. Dabei muss ich zwei Pins eines Ports miteinander vergleichen. Ich weiß allerdings nicht, wie ich einzelne Bits einlesen kann. Bis jetzt hab ich den kompletten Port abgefragt und dann das entsprechende Bit mit "UND" ausmaskiert und anschließend verglichen. Das sah wie folgt aus: __________________________________________ unsigned char input_a = PINE; unsigned char input_b = PINE; input_a = input_a & 0x80; input_b = input_b & 0x40; if (((input_a == 0x80) & (input_b ==0x40)) | ((input_a != 0x80) & (input_b !=0x40))) {// usw.} ___________________________________________ Aber das muss doch auch einfacher gehen, oder?
hi... bitweise nur, wenn du dir eigene header schreibst, indenen jedes io-register als union erscheint... aber das lohnt sich meist nicht... (gleicher code-overhead, oder sogar viel mehr) schreib es doch einfacher:
1 | unsigned char temp = PINE & 0x3f; |
2 | |
3 | temp ^= (temp << 1); |
4 | temp &= 0x7f; |
5 | |
6 | if(!temp) |
7 | {
|
8 | ...
|
9 | }
|
wichtig!!!! du hast geschrieben:
1 | if (((input_a == 0x80) & (input_b ==0x40)) | ((input_a != 0x80) & |
2 | (input_b !=0x40))) |
3 | [/] |
4 | |
5 | als logischen Operator muss das so aussehen: |
6 | [C] |
7 | if (((input_a == 0x80) && (input_b ==0x40)) || ((input_a != 0x80) && |
8 | (input_b !=0x40))) |
Gibt zwar in WINAVR keine Compiler-Fehlermeldung, wenn Du bei der Initialisierung von input_a einen nicht-konstanten Wert (PINE) zuweist, aber ich wär da sehr vorsichtig. Könnte was Undefiniertes oder einfach nur Schrott rauskommen. Normal muss das heißen unsigned char input_a, input_b; input_a = PINE; input_b = PINE; //... Bei Deiner Methode weiß ich nicht, ob der Compiler da überhaupt was sinnvolles draus macht!!! Andere Compiler (z.B. CodeVision) lassen so was gar nicht zu. Gibt ne dicke Fehlermeldung. Wenn da bei WINAVR tatsächlich was sinnvolles rauskommt, dann sagt's mir! Würde mich schon interessieren. Gruß Johnny
Wieso liest Du das Port zweimal? XOR vergleicht. input_a = PINE; if(!(((input_a>>1)^input_a)&0x40)) ..... Cheers Detlef
Erstmal Danke für eure Antworten. zu bone: Ach ja, && bzw. || sind diese intelligente UND- bzw. ODER-Funktionen. Die sind schneller als einfaches & und |, oder? Ich erinnere mich schwach; da war was. :-) Es wär aber nicht schlecht, wenn du mir trotsdem mal schreibst wie das mit den header funktioniert. Vielleicht brauch ich das mal für ein anderes Programm zu johnny.m: Also bei mir funktioniert Methode ohne Probleme. Aber du hast recht. Ich habs mal spaßhalber in CodeVision ausprobiert, da bringt der Compiler Fehler. Sollte ich vielleicht lieber ändern. Du musst wissen, ich bin etwas C# verwöhnt. Detlef A: Ja, das kann man auch mit einmal lesen programmieren. Ich hab die Methode ja auch nur mal schnell geschrieben um zu testen, ob das so funktioniert. Ich will es ja einfacher Schreiben, deshalb hab ich ja diesen Beitrag ins Forum gestellt.
> Ich habs mal spaßhalber in CodeVision ausprobiert, da bringt der > Compiler Fehler Welcher wäre? Aus C-Sicht ist da nichts Falsches dran. Initialisieren kannst du womit du auch immer willst. Das muss nicht konstant sein. > Ach ja, && bzw. || sind diese intelligente UND- bzw. ODER- > Funktionen. Da ist absolut nichts 'Intelligentes' dran. || und && sind die logischen Vergleiche; | und & sind die bitweisen Vergleiche. Logische Verknüpfung: Alles was 0 ist wird als false gewertet, alles andere als true. Das Ergebnis ist entweder 0(false) oder 1(true), je nach Ausgangswerten und Verknuepfung. Bitweise Verknüpfungen: Arbeiten, wie der Name schon sagt, auf Bitebene. Die einzelnen Bits der beteiligten Zahlen werden Bit für Bit miteinander verknüpft. > Die sind schneller als einfaches & und |, oder? Ganz im Gegenteil. Da die logischen Verknüpfungen alles was nicht 0 ist als logisch wahr werten müssen und trotzdem nur ein 0/1 Ergebnis rauskommen kann, muß dieser Fall behandelt werden. > Ich erinnere mich schwach; da war was. :-) Ich empfehle etwas Literatur.
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.