Forum: Mikrocontroller und Digitale Elektronik WinAVR, ATMEGA128: Eingangspins miteinander vergleichen


von Bernd (Gast)


Lesenswert?

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?

von bone (Gast)


Lesenswert?

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
}

von bone (Gast)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

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

von Detlef A (Gast)


Lesenswert?

Wieso liest Du das Port zweimal? XOR vergleicht.
input_a = PINE;
if(!(((input_a>>1)^input_a)&0x40)) .....

Cheers
Detlef

von Bernd (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.