WinAVR, ATMEGA128: Eingangspins miteinander vergleichen

Gast #307669
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?
Gast #307670
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
}
Gast #307671
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)))
Gast #307672
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
Gast #307674
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.
#307675
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren