I/O-Pin Abfrage

Gast #1726397
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.
#1726649
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
    ...
Gast #1726729
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
#1726738
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.
#1726761
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.
Gast #1726768
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.
#1726775
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 :(

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