mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

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

Autor: bone (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char temp = PINE & 0x3f;

temp ^= (temp << 1);
temp &= 0x7f;

if(!temp)
{
...
}


Autor: bone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wichtig!!!!

du hast geschrieben:
if (((input_a == 0x80) & (input_b ==0x40)) | ((input_a != 0x80) &
(input_b !=0x40)))
[/]

als logischen Operator muss das so aussehen:
[C]
if (((input_a == 0x80) && (input_b ==0x40)) || ((input_a != 0x80) &&
(input_b !=0x40)))

Autor: johnny.m (Gast)
Datum:

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

Autor: Detlef A (Gast)
Datum:

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

Cheers
Detlef

Autor: Bernd (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

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.