www.mikrocontroller.net

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


Autor: Crossworks Gast (Gast)
Datum:

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

Autor: Sohn von Gosar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab noch keinen ARM7 programmiert aber versuch einfach mal FIO2PIN2

Autor: Crossworks Gast (Gast)
Datum:

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

Na, sind keine Crossworker da? :-)

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

Bewertung
0 lesenswert
nicht lesenswert
> Register FIO2PIN als gesamtes Register abfrage geht es

Was spricht gegen die Standard-C Lösung?

  if( FIO2PIN & ( 1 << FIO2PIN2) ) {
     .. pin ist auf 1
  }

  if( !( FIO2PIN & ( 1 << FIO2PIN2 ) ) ) {
     .. pin ist auf 0
  }

Schon mal auf deinem AVR nachgesehen, was bit_is_clear macht bzw. wie es 
implementiert ist. Genauso wie oben, nur als Makro verpackt.
#define bit_is_clear( port, pin )    ( ! ((port) & ( 1 << (pin) ) ) )


...

  if( bit_is_clear( FIO2PIN, FIO2PIN2 ) )
    ...

Autor: Crossworks Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <targets/LPC2478.h>

#define LED   (1<<18)
#define Taste (1<<19)

int main (void)
{
  IO1DIR |= LED;
  FIO2DIR &= 1<<19;
  IO1SET = LED;
  for(;;)
  {
     if( FIO2PIN & ( Taste) )
     {
       IO1SET = LED;
     }

    if( !( FIO2PIN & (Taste) ) )
    {
      IO1CLR = LED;
    }
  }
}

Ich benutze das Olimex LPC2478_STK

Autor: Peter (Gast)
Datum:

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

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

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

Autor: Frank Bär (f-baer)
Datum:

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

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

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

Autor: Crossworks Gast (Gast)
Datum:

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

Autor: Crossworks Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
FIOxMASK

Sieht interessant aus, schaue ich mir gleich an!

Autor: Frank Bär (f-baer)
Datum:

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

Autor: Crossworks Gast (Gast)
Datum:

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

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.