mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Pin einlesen funktioniert nicht


Autor: Hermann K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte gerade an einem STM32F103 einen Pin einlesen. Leider bekomme 
ich es nicht hin (Anfänger). Kann jemand mal kurz über den Code schauen?

Es handelt sich um einen Encoder mit Push Button. Ich wollte den zuerst 
mal testen (ohne Entpresslung nur ob überhaupt was geht).

Push Button ist an einer Seit an GND angeschlossen, an der anderen Seite 
mit Port A10. Messe ich mit dem Multimeter (GND, Port A10) messe ich 3,3 
Volt (scheint also richtig konfiguiert), drücke ich den Taster messe ich 
0 Volt -> Hardware scheint richtig zu sein. Es sind noch drei LED 
angeschlossen, welche auch funktionieren (auch per Software).

Mein Code:
(direkt in main.c ... nur die unwichtigen Parts entfernt)

In Inputtest steht immer eine Null.

Sieht jemand den Fehler? Ich finde ihn gerade nicht :-(
  // set up LED Pins A1, A2, A3

  #define LEDTestPin1     GPIO_Pin_1
  #define LEDTestPin2     GPIO_Pin_2
  #define LEDTestPin3     GPIO_Pin_3
  #define LEDTestRcc       RCC_APB2Periph_GPIOA
  #define LEDTestPort     GPIOA

  RCC_APB2PeriphClockCmd(LEDTestRcc, ENABLE);

    GPIO_InitTypeDef gpioStructure;
    gpioStructure.GPIO_Pin = LEDTestPin1|LEDTestPin2|LEDTestPin3;
    gpioStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    gpioStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(LEDTestPort, &gpioStructure);

    // set up encoder pins
    // A8 Push button input with pull up
    // A9 Encoder line A input with pull up
    // A10 Encoder line B input with pull up
  #define EncoderPushButton   GPIO_Pin_8
  #define EncoderA       GPIO_Pin_9
  #define EncoderB       GPIO_Pin_10
  #define EncoderRcc       RCC_APB2Periph_GPIOA
  #define EncoderPort     GPIOA

    RCC_APB2PeriphClockCmd(EncoderRcc, ENABLE);

    gpioStructure.GPIO_Pin = EncoderPushButton|EncoderA|EncoderB;
    gpioStructure.GPIO_Mode = GPIO_Mode_IPU;
    gpioStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(EncoderPort, &gpioStructure);

  for(;;)
  {
      volatile uint8_t Inputtest = 0;
      Inputtest = GPIO_ReadInputDataBit(EncoderPort, EncoderPushButton);
      if (Inputtest)
        GPIO_WriteBit(LEDTestPort, LEDTestPin1, SET);
      else
        GPIO_WriteBit(LEDTestPort, LEDTestPin1, RESET);
      GPIO_WriteBit(LEDTestPort, LEDTestPin2, SET);
      GPIO_WriteBit(LEDTestPort, LEDTestPin3, RESET);
      Delay(100);
  }
}


Autor: Hermann K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ziehe die frage zurück, sorry :-(

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hermann K. schrieb:
> ziehe die frage zurück, sorry :-(

Warum? Weil es mitten in der Nacht war, oder der Pull-Up Widerstand 
fehlte, oder warum sonst?

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hermann K. schrieb:
> Kann jemand mal kurz über den Code schauen?

Ja. Aber zuvor ne Frage: Möchtest du eine freundliche Antwort oder eine 
ehrliche Antwort?

Du hast in deinem Codeschnipsel so ziemlich nichts ausgelassen, was man 
besser nicht tun sollte.

Vielleicht hier mal ein paar weitere fragen:
- Wozu hast du eigentlich die vielen zusätzlichen Bezeichner per #define 
eingeführt? Damit sich das viel netter liest, egal ob die Zuordnung 
zwischen Pin und Port tatsächlich stimmt?

- wozu hast du
"volatile uint8_t Inputtest = 0;"
in die Schleife gesetzt? Ist dir der Zweck von volatile überhaupt 
bewußt? Immerhin lautet die nächste Zeile ja so:
"Inputtest = GPIO_ReadInputDataBit(EncoderPort, EncoderPushButton);"

- wozu hast du uint8_t hingeschrieben? Du willst doch garnicht damit 
wirklich etwas rechnen und weder die Bitanzahl noch das Vorzeichen ist 
für dich relevant. Eigentlich sollte das der lieben Lesbarkeit zuliebe 
eher ein bool sein, gelle?

- hast du eigentlich mal nachgeschaut, was sich hinter "GPIO_Pin_1" denn 
so verbirgt?

- ist dir der Unterschied zwischen
#define MyBit   6
und
#define MyBit   (1<<6)
verständlich? (eine beliebte Falle für Leute, die gerne mit Namen für 
Bits hantieren wollen)

- hast du hier im Forum eigentlich mal die bisherigen Diskussionen über 
diese "ST-Lib" mal gelesen? Was passiert denn dort, wenn man von all den 
Bezeichnern, die man dort so in die diversen ..initStruct's 
hineinschreibt, sich an irgend einer Stelle mal vertut?

So, das sollte erstmal genügen.

Es mag vielleicht ein wenig elitär anmuten, von den Leuten zu fordern, 
daß sie wissen was sie tun, BEVOR sie es tun, aber genau das ist der 
richtige Weg.

W.S.

Autor: Marc V. (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
W.S. schrieb:
> Es mag vielleicht ein wenig elitär anmuten, von den Leuten zu fordern,
> daß sie wissen was sie tun, BEVOR sie es tun, aber genau das ist der
> richtige Weg.

 Oder vielleicht mal nach stm32 example code for pin input
 googeln?

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marc V. schrieb:
> Oder vielleicht mal nach..

.. und dann blindlings irgendwelchen Quellcode herumkopieren, ohne 
überhaupt zu verstehen, was man da grad anrichtet?

Genau DIESE Denkungsart kann ich überhaupt nicht leiden.

***unanständiger, aber genau so gemeinter Fluch leicht eingekürzt***

W.S.

Autor: Stefanus F. (stefanus)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Was soll dieses Nachtreten bringen?

Jetzt wird der TO wohl kaum noch berichten, woran es gelegen hat. Somit 
können spätere Leser aus diesem Threads nichts lernen.

Autor: Marc V. (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> .. und dann blindlings irgendwelchen Quellcode herumkopieren, ohne
> überhaupt zu verstehen, was man da grad anrichtet?
>
> Genau DIESE Denkungsart kann ich überhaupt nicht leiden.

 Nein, um zu sehen wie das richtig oder zumindest funktionierend
 gemacht wird.

Autor: Toxic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> Genau DIESE Denkungsart kann ich überhaupt nicht leiden.

ich glaube von Dir heute mehrere Postings gelesen zu haben und in all 
denen gibst Du dich immer als Oberlehrer aus.Grundsaetzlich fertige 
Loesungen bietest du generell nicht an sondern versuchst die TOs 
blosszustellen wo auch immer es geht.Damit ist niemanden gedient.
Also "mein Freund" (ich denke Du weisst worauf ich anspiele...)versuche 
dein Wissen und Koennen so an den Mann/Frau zu bringen ohne sie dabei zu 
denunzieren....

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.