Forum: Mikrocontroller und Digitale Elektronik Datainputlesen


von salamon (Gast)


Lesenswert?

Hallo,

mit dem folgenden Code möchte ich den PA0 auslesen, der an User 
Push-Button verbunden.Wenn der BUTTON gedruckt sollen LED3 und LED 4 mit 
Delay Funktion ein-ausgeschaltet werden.

Komischerweise werden die LEDs ein- ausgeschaltet, wenn das RESET-Button 
gedruckt, und nicht wenn Das User-Button betätigt.

Ich bin Anfänger, und ehrlichgesagt weiß nicht ob die Bitmaske richtig 
ist oder nicht.

Davon bin ich ausgegangen, dass der Register von PA 0x0 ist. Erst wenn 
irgenwelcher Pin an Port A Signal bekommt, dann ändert sich 
dementsprechnd der Register PA.

Da nur ein Pin betätigt wird, und zawr der nidrigste P0, dann könnte der 
Registr entweder 0x0 oder 0x1.

Ich habe versucht den Memorymap zu verwenden, aber leider nichts 
verstande.
Diesbezüglich hätte ich gerne eine Frage und zwar:

Im Datesheet und neben dem PORT A steht 0x4001 0800.
was heisst das genau?
Heist dass, das dieser PA einen Speicherplatz von 0x4001 bis 0800?

Kann jemand mir bitte helfen.

Vielen Dank

#include <stddef.h>
#include "stm32f10x.h"

void delayLoop()
{
  volatile uint32_t delayCount = 1000000;
  while (delayCount > 0)
  {
    delayCount--;
  }
}

void GPIO_Setup ()
{
  GPIO_InitTypeDef GPIO_Inity;

        // PortC als Ausgang configurieren
    GPIO_Inity.GPIO_Pin   = GPIO_Pin_8 | GPIO_Pin_9;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_Inity.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Inity.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_Inity);

       // PortA als Eingang configurieren
  GPIO_Inity.GPIO_Pin   = GPIO_Pin_0;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_Inity.GPIO_Mode  = GPIO_Mode_IPD;
  GPIO_Inity.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_Inity);

}

int main (void)
{

    SystemInit();
    GPIO_Setup();

          uint8_t reg  reg;


    reg = ((GPIO_ReadInputData(GPIOA))&(GPIO_Pin_0));
    reg |= 0x5;


    if (reg == 0x5 )
    {
    GPIOC->BSRR = GPIO_Pin_8; // LED On
            delayLoop();

    GPIOC->BRR = GPIO_Pin_8;  // LED Off
            delayLoop();

    GPIOC->BSRR = GPIO_Pin_9; // LED On
        delayLoop();

    GPIOC->BRR = GPIO_Pin_9;  // LED Off
            delayLoop();
    }
}

von Karl H. (kbuchegg)


Lesenswert?

salamon schrieb:

> Ich bin Anfänger, und ehrlichgesagt weiß nicht ob die Bitmaske richtig
> ist oder nicht.


Dann solltest du Papier und Bleistift nehmen, dir eine 8 Bit Zahl binär 
aufschreiben, darunter deine Maske und dann selber mal bitweise die Zahl 
mit der Maske verodern um mal zu sehen wie das eigentlich funktioniert.
Dann mal ein paar andere Zahlen binär aufschreiben und wieder händisch 
durch die Maske jagen.

Auch mal mit einer UND-Operation probieren.

So lernt es sich am schnellsten und am nachhaltigsten, wie die Sache auf 
Bitebene funktioniert und welche Operation man wofür nimmt.

Bitmanipulation

von salamon (Gast)


Lesenswert?

Sehr geehrter Moderator,

Ich verspreche Ihnen, Ihren Tipp zu befolgen.

Aber darf ich von Ihrem Tipp ausgehen, dass der Fehler wirklich an der 
Bitmaske Liegt? und nicht um anders?

LG.

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.