Forum: Mikrocontroller und Digitale Elektronik STM32 Pin einlesen funktioniert nicht


von Hermann K. (Gast)


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 :-(
1
  // set up LED Pins A1, A2, A3
2
3
  #define LEDTestPin1     GPIO_Pin_1
4
  #define LEDTestPin2     GPIO_Pin_2
5
  #define LEDTestPin3     GPIO_Pin_3
6
  #define LEDTestRcc       RCC_APB2Periph_GPIOA
7
  #define LEDTestPort     GPIOA
8
9
  RCC_APB2PeriphClockCmd(LEDTestRcc, ENABLE);
10
11
    GPIO_InitTypeDef gpioStructure;
12
    gpioStructure.GPIO_Pin = LEDTestPin1|LEDTestPin2|LEDTestPin3;
13
    gpioStructure.GPIO_Mode = GPIO_Mode_Out_PP;
14
    gpioStructure.GPIO_Speed = GPIO_Speed_2MHz;
15
    GPIO_Init(LEDTestPort, &gpioStructure);
16
17
    // set up encoder pins
18
    // A8 Push button input with pull up
19
    // A9 Encoder line A input with pull up
20
    // A10 Encoder line B input with pull up
21
  #define EncoderPushButton   GPIO_Pin_8
22
  #define EncoderA       GPIO_Pin_9
23
  #define EncoderB       GPIO_Pin_10
24
  #define EncoderRcc       RCC_APB2Periph_GPIOA
25
  #define EncoderPort     GPIOA
26
27
    RCC_APB2PeriphClockCmd(EncoderRcc, ENABLE);
28
29
    gpioStructure.GPIO_Pin = EncoderPushButton|EncoderA|EncoderB;
30
    gpioStructure.GPIO_Mode = GPIO_Mode_IPU;
31
    gpioStructure.GPIO_Speed = GPIO_Speed_2MHz;
32
    GPIO_Init(EncoderPort, &gpioStructure);
33
34
  for(;;)
35
  {
36
      volatile uint8_t Inputtest = 0;
37
      Inputtest = GPIO_ReadInputDataBit(EncoderPort, EncoderPushButton);
38
      if (Inputtest)
39
        GPIO_WriteBit(LEDTestPort, LEDTestPin1, SET);
40
      else
41
        GPIO_WriteBit(LEDTestPort, LEDTestPin1, RESET);
42
      GPIO_WriteBit(LEDTestPort, LEDTestPin2, SET);
43
      GPIO_WriteBit(LEDTestPort, LEDTestPin3, RESET);
44
      Delay(100);
45
  }
46
}

von Hermann K. (Gast)


Lesenswert?

ziehe die frage zurück, sorry :-(

von Stefan F. (Gast)


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?

von W.S. (Gast)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


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?

von W.S. (Gast)


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.

von Stefan F. (Gast)


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.

von Marc V. (Firma: Vescomp) (logarithmus)


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.

von Toxic (Gast)


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....

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.