Forum: Mikrocontroller und Digitale Elektronik STM32 Eingang abfragen


von MB (Gast)


Lesenswert?

Morgen,

habe hier mal eine kleine Frage...

Habe folgenden Befehl in einem Programm auf einem STM32:
1
GPIOC->IDR & 0xF;

Damit soll abgefragt werden, ob einer der Eingänge 12-15 high ist. Aber 
warum 0xF? Heißt das nicht ich frage ab ob ALLE 1 sind? Wie kann man die 
Zeile verstehen? Das UND iretiert mich hier iregdnwie, ebenso das 0xF 
-.-

Danke euch

: Verschoben durch User
von Zeigl (Gast)


Lesenswert?

> GPIOC->IDR & 0xF;

Das ist kein Befehl. Es wird IDR UND-Verküpft mit 0x0F. Mehr nicht. Wie 
sieht das Umfeld aus?

von MB (Gast)


Lesenswert?

Wenn das aber UND-Verknüpft ist, prüf ich dann jedes einzelne Bit UND? 
Ist das eine Bitweise-Verknüpfung?

Was wäre wenn ich sage:
1
int row = GPIOC->IDR & 0xF;

Schreibt der hier dann die Anzahl der Treffer rein?

Wenn das eine Bitweise-Verknüpfung ist leuchtet mir das ein. Dann 
springt er nur in die Abfrage wenn eins der Bits HIGH ist. Stimmt das 
so?

von Zeigl (Gast)


Lesenswert?

MB schrieb:

> Wenn das aber UND-Verknüpft ist, prüf ich dann jedes einzelne Bit UND?
> Ist das eine Bitweise-Verknüpfung?

Ja.

>
1
> int row = GPIOC->IDR & 0xF;
2
>

Annahme:

row ist 16-Bit groß mit dem Inhalt 0000 0000 1000 0100
row wird UND-Verknüpft mit 0x0F    0000 0000 0000 1111

Ergebnis der Verknüpfung           0000 0000 0000 0100

Das Ergebnis wird row zugewiesen.

von MB (Gast)


Lesenswert?

Zeigl schrieb:
> Annahme:
>
> row ist 16-Bit groß mit dem Inhalt 0000 0000 1000 0100
row oder in IDR? row wird hier erst deklariert und initialisiert ist es 
mit 0
> row wird UND-Verknüpft mit 0x0F    0000 0000 0000 1111
>
> Ergebnis der Verknüpfung           0000 0000 0000 0100
>
> Das Ergebnis wird row zugewiesen.

Somit wäre meine Vermutung:

row:    0000 0000 0000 0000
IDR:    0000 0000 0000 0101
0xF:    0000 0000 0000 1111

row somit als Ergebnis: 0000 0000 0000 0101? Da aber row ein integer 
ist, steht da nun eine 5 drin oder?

von STMler (Gast)


Lesenswert?

MB schrieb:
> Morgen,
>
> habe hier mal eine kleine Frage...
>
> Habe folgenden Befehl in einem Programm auf einem STM32:
> GPIOC->IDR & 0xF;
>
> Damit soll abgefragt werden, ob einer der Eingänge 12-15 high ist. Aber
> warum 0xF? Heißt das nicht ich frage ab ob ALLE 1 sind? Wie kann man die
> Zeile verstehen? Das UND iretiert mich hier iregdnwie, ebenso das 0xF


Das ist dann falsch.
Bit 12-15 vom IDR stehen für die Port Pins 12-15.
Die Maske muss also 0xF000 lauten.
IDR ist übrigens ein 32-Bit-Register, dessen obere Hälfte nicht genutzt 
wird (bzw. reserviert ist).

von Thomas E. (picalic)


Lesenswert?

Zeigl schrieb:
>> int row = GPIOC->IDR & 0xF;
>>
> Annahme:
>
> row ist 16-Bit groß mit dem Inhalt 0000 0000 1000 0100
> row wird UND-Verknüpft mit 0x0F    0000 0000 0000 1111
>
> Ergebnis der Verknüpfung           0000 0000 0000 0100

Das ist falsch! Der Inhalt von row vor der Ausführung der gezeigten 
Codezeile ist völlig irrelevant. Es wird der Inhalt des IDR (= Pegel an 
den Pins) mit 0xF verknüpft, und das Ergebnis davon landet in row.

In diesem Sinne:

MB schrieb:
> Somit wäre meine Vermutung:
>
> row:    0000 0000 0000 0000  <== Egal! Zeile streichen!
> IDR:    0000 0000 0000 0101
> 0xF:    0000 0000 0000 1111

: Bearbeitet durch User
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.