Forum: Mikrocontroller und Digitale Elektronik I/O-Pin Abfrage


von Crossworks Gast (Gast)


Lesenswert?

Hallo,
ich versuche mich mit ARM7 und Crossworks. Bin noch am Anfang.
LED an/aus geht schon :-)

Möchte jetzt einen Taster abfragen, ohne Interupt.
Wenn ich das Register FIO2PIN als gesamtes Register abfrage geht es, 
aber wie kann ich ein einzelner Pin abfragen?

Bei WinAVR ist das ja z.B.:
if (bit_is_clear(PIND,3))

Danke im Voraus.

von Sohn von Gosar (Gast)


Lesenswert?

hab noch keinen ARM7 programmiert aber versuch einfach mal FIO2PIN2

von Crossworks Gast (Gast)


Lesenswert?

Nee, leider nicht, FIO2PIN2 ist nur das 3.Byte von FIO2PIN.

Na, sind keine Crossworker da? :-)

von Karl H. (kbuchegg)


Lesenswert?

> Register FIO2PIN als gesamtes Register abfrage geht es

Was spricht gegen die Standard-C Lösung?

1
  if( FIO2PIN & ( 1 << FIO2PIN2) ) {
2
     .. pin ist auf 1
3
  }
4
5
  if( !( FIO2PIN & ( 1 << FIO2PIN2 ) ) ) {
6
     .. pin ist auf 0
7
  }

Schon mal auf deinem AVR nachgesehen, was bit_is_clear macht bzw. wie es 
implementiert ist. Genauso wie oben, nur als Makro verpackt.
1
#define bit_is_clear( port, pin )    ( ! ((port) & ( 1 << (pin) ) ) )
2
3
4
...
5
6
  if( bit_is_clear( FIO2PIN, FIO2PIN2 ) )
7
    ...

von Crossworks Gast (Gast)


Lesenswert?

Ja, danke!
Wieder ein Stück weiter :-)

Hat soweit geklappt.
Nur zur Richtigstellung für andere:

Mit FIO2PIN ist der gesamte Port gemeint.
FIO2PIN2 ist das 3.Byte diese Ports gemeint.
(wenn ich das richtig verstanden habe)

So funktioniert es jedenfalls:
1
#include <targets/LPC2478.h>
2
3
#define LED   (1<<18)
4
#define Taste (1<<19)
5
6
int main (void)
7
{
8
  IO1DIR |= LED;
9
  FIO2DIR &= 1<<19;
10
  IO1SET = LED;
11
  for(;;)
12
  {
13
     if( FIO2PIN & ( Taste) )
14
     {
15
       IO1SET = LED;
16
     }
17
18
    if( !( FIO2PIN & (Taste) ) )
19
    {
20
      IO1CLR = LED;
21
    }
22
  }
23
}

Ich benutze das Olimex LPC2478_STK

von Peter (Gast)


Lesenswert?

Crossworks Gast schrieb:
> Mit FIO2PIN ist der gesamte Port gemeint.
> FIO2PIN2 ist das 3.Byte diese Ports gemeint.
> (wenn ich das richtig verstanden habe)

Du meinst vermutlich "das 3.Bit" (nicht Byte).

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> Crossworks Gast schrieb:
>> Mit FIO2PIN ist der gesamte Port gemeint.
>> FIO2PIN2 ist das 3.Byte diese Ports gemeint.
>> (wenn ich das richtig verstanden habe)
>
> Du meinst vermutlich "das 3.Bit" (nicht Byte).

Bin nicht sicher. Ich kenn den µC und die zugehörige 
Entwicklungsumgebung  nicht.
Es könnte allerdings wirklich das 3. Byte sein. Sieh dir seine 
Pin-Nummern an: 18, 19
Die sind schon ziemlich hoch.

von Frank B. (f-baer)


Lesenswert?

Peter schrieb:
> Crossworks Gast schrieb:
>> Mit FIO2PIN ist der gesamte Port gemeint.
>> FIO2PIN2 ist das 3.Byte diese Ports gemeint.
>> (wenn ich das richtig verstanden habe)
>
> Du meinst vermutlich "das 3.Bit" (nicht Byte).


Nein, es handelt sich wirklich im das dritte Byte.

Die Ausgabe von FIOxPIN kann mit FIOxMASK maskiert werden, dadurch 
erhältst du nur genau die Pins, die du auch haben möchtest. Näheres dazu 
findest du im Datenblatt auf Seite 206.

Beispiel:

FIO2MASK = 0x0F0F0F0F
realer Pinzustand = 0xFFFFFFFF

Das FIO2PIN-Register bringt jetzt als Ausgabe F0F0F0F0.

von Karl H. (kbuchegg)


Lesenswert?

Frank Bär schrieb:
> Peter schrieb:
>> Crossworks Gast schrieb:
>>> Mit FIO2PIN ist der gesamte Port gemeint.
>>> FIO2PIN2 ist das 3.Byte diese Ports gemeint.
>>> (wenn ich das richtig verstanden habe)
>>
>> Du meinst vermutlich "das 3.Bit" (nicht Byte).
>
>
> Nein, es handelt sich wirklich im das dritte Byte.

Du musst verzeihen.
Wir sind hier nur 8-Bit Ports gewohnt :-)

von Crossworks Gast (Gast)


Lesenswert?

Hier ein kleiner Auszug aus dem Datenblatt

FIOxPIN2
Fast GPIO Port x Pin value
register 2. Bit 0 in FIOxPIN2
register corresponds to pin
Px.16 ... bit 7 to pin Px.23.


Und so gibt es für jedes Byte des 32bit-Ports
FIOxPIN0
FIOxPIN1
FIOxPIN2
FIOxPIN3

Und dann gibt es noch für 16Bit
FIOxPINL (Lower half-word register)
FIOxPINH (Upper half-word register)

Beim Debuggen kann man beim Tastendruck auch jeweils das entsprechene 
Bit in diesen Registern toggeln sehen.

von Crossworks Gast (Gast)


Lesenswert?

FIOxMASK

Sieht interessant aus, schaue ich mir gleich an!

von Frank B. (f-baer)


Lesenswert?

Karl heinz Buchegger schrieb:
> Frank Bär schrieb:
>> Peter schrieb:
>>> Crossworks Gast schrieb:
>>>> Mit FIO2PIN ist der gesamte Port gemeint.
>>>> FIO2PIN2 ist das 3.Byte diese Ports gemeint.
>>>> (wenn ich das richtig verstanden habe)
>>>
>>> Du meinst vermutlich "das 3.Bit" (nicht Byte).
>>
>>
>> Nein, es handelt sich wirklich im das dritte Byte.
>
> Du musst verzeihen.
> Wir sind hier nur 8-Bit Ports gewohnt :-)

Ich beisse mir derzeit die Zähne an einem 2468 aus, 8Bit-Ports wären mir 
da auch lieber :(

von Crossworks Gast (Gast)


Lesenswert?

Ja, der Umstieg von AVR auf ARM ist schon erstmal heftig.
Die 2 Millionen Register, die da mehr vorhanden sind, wollen erst einmal 
verstanden sein:-)

Aber wenn es soweit ist, hat mal vieeeeel mehr Möglichkeiten...

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.