Forum: Mikrocontroller und Digitale Elektronik Taster mit Pull up Widerstand


von Richard W. (richard00)


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)


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)


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)


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)


Lesenswert?

Richard W. schrieb:
> Wie gesagt, dass klappt.

Nicht wirklich.

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

von Richard W. (richard00)


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)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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

von Richard W. (richard00)


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.

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.