Forum: Mikrocontroller und Digitale Elektronik Taster mit Pull up Widerstand


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Richard W. (richard00)


Bewertung
0 lesenswert
nicht lesenswert
Moin Leute,

ich brauch mal eure Hilfe bitte.

Ich nutze das Board STM32F091. Ich hab ein LED 2 und ein Taster an PC13 
mit einem Pull-Up Widerstand (laut Datenblatt).

Ich möchte nun, dass die LED 2 leuchtet und wenn ich den Taster drücke, 
dass die LED 2 nicht mehr leuchtet.

Den Versuch, dass die LED 2 leuchtet wenn ich des Taster drücke klappt 
wunderbar. Hier ist mein Code.
1
#include "stm32f0xx.h"      // Device Header
2
3
4
int main(void)
5
{
6
   RCC->AHBENR |= 0x80000;  // enable GPIOC clock Bit 19 GPIOC
7
   RCC->AHBENR |= 0x20000;  // enable GPIOA clock Bit 17 GPIOA
8
  
9
  GPIOA->MODER |= 0x400;  // 0b 0000 0000 0000 0000 0000 0100 0000 0000 = Pin 5
10
11
   while(1)
12
   {
13
     if(GPIOC->IDR & 0x2000) // if PC13 is high
14
     {
15
       GPIOA->BSRR = 0x0020000;  // set PA5 low, LED OFF
16
     }
17
     else
18
     {
19
       GPIOA->BSRR = 0x20; // Set PA5 high, 0b 0010 0000, high, LED ON 
20
21
      }
22
    
23
    }
24
}
Wie gesagt, dass klappt. Nun möchte ich es einfach umgekehrt haben also 
das die LED ausgeht, wenn ich den Taster drücke. Ich hab die GPIO->BSRR 
= 0x0020000 und GPIOA->BSRR = 0x20 vertauscht. Eigentliche müsste das 
doch funktionieren. Also der Pin PC13 ist auf high wenn ich den Taster 
nicht drücke (Pull-Up-Widerstand) wenn das der Fall ist, dann LED->ON 
und wenn ich den Taster drücke, dann ziehe ich den Pin PC13 auf GND und 
die LED-> OFF.

Aber das passiert nicht. Die LED ist zwar ON aber wenn ich den Taster 
drücke dann passiert da nichts. Kann mir da jemand bitte helfen?

: Bearbeitet durch Moderator
von Johannes O. (jojo_2)


Bewertung
0 lesenswert
nicht lesenswert
Richard W. schrieb:
> GPIOA->BSRR = 0x0020000;  // set PA5 low, LED OFF
>        GPIOA->BSRR = 0x20; // Set PA5 high, 0b 0010 0000, high, LED ON

Hier stimmt was nicht. Oben hast du nur 0x0020000 anstatt vermutlich 
0x00200000. (7 nibbles anstatt 8)
Kann das sein?

von Richard W. (richard00)


Bewertung
0 lesenswert
nicht lesenswert
Johannes O. schrieb:
> Richard W. schrieb:
>> GPIOA->BSRR = 0x0020000;  // set PA5 low, LED OFF
>>        GPIOA->BSRR = 0x20; // Set PA5 high, 0b 0010 0000, high, LED ON
>
> Hier stimmt was nicht. Oben hast du nur 0x0020000 anstatt vermutlich
> 0x00200000. (7 nibbles anstatt 8)
> Kann das sein?

Ja, dass stimmt. Ich meine natürlich 0x00200000.

von Richard W. (richard00)


Bewertung
0 lesenswert
nicht lesenswert
Richard W. schrieb:
> Johannes O. schrieb:
>> Richard W. schrieb:
>>> GPIOA->BSRR = 0x0020000;  // set PA5 low, LED OFF
>>>        GPIOA->BSRR = 0x20; // Set PA5 high, 0b 0010 0000, high, LED ON
>>
>> Hier stimmt was nicht. Oben hast du nur 0x0020000 anstatt vermutlich
>> 0x00200000. (7 nibbles anstatt 8)
>> Kann das sein?
>
> Ja, dass stimmt. Ich meine natürlich 0x00200000.

Ach misst. Hab im Code eine Null weggelassen. Es klappt jetzt. Danke für 
die Hilfe.

von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Richard W. schrieb:
> Wie gesagt, dass klappt.

Nicht wirklich.

0x20 << 16 ist nicht 0x0020000 sondern 0x00200000.

von Richard W. (richard00)


Bewertung
0 lesenswert
nicht lesenswert
MaWin schrieb:
> Richard W. schrieb:
>> Wie gesagt, dass klappt.
>
> Nicht wirklich.
>
> 0x20 << 16 ist nicht 0x0020000 sondern 0x00200000.

Doch es klappt. Ich verwende den Bit-Set-Reset-Register.
Da ist für:

LED->ON = 0x20 (Pin 5) und LED->OFF = 0x00200000 (Pin 21)

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Besser man nimmt wahlweise BSRR und BRR. Dann spart man sich das 
Schieben und damit den Fehler.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Benutze lieber die Namen der Bits, anstatt magische Zahlen. In der CMSIS 
Bibliothek gibt es für jedes Bit einen Namen.

: Bearbeitet durch User
von Richard W. (richard00)


Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> Besser man nimmt wahlweise BSRR und BRR. Dann spart man sich das
> Schieben und damit den Fehler.

Yes, genau den BSRR verwende ich. Aber dennoch ist mir so ein blöder 
Fehler unterlaufen. Danke für die Hilfe.

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]
  • [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.