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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.