Forum: Mikrocontroller und Digitale Elektronik GPIO input am cortex m0+


von openocd (Gast)


Lesenswert?

Hallo,

Ich probiere gerade am SAMD21 Xplained herum und wollte die LED toggeln, 
wenn auf den Button gedrückt wird. Sicher übersehe ich etwas ..
Der Button hängt am PA15 und ist active low. Wenn ich am button messe, 
sehe ich das schonmal der Pull-Up gesetzt wurde, wenn ich den Button 
betätige liegt low an.
1
#include <samd21.h>
2
3
typedef uint8_t ui8;
4
typedef uint32_t ui32;
5
6
// USER LED: PB30; low-active
7
// USER BTN: PA15; low-active
8
9
static void delay(int n)
10
{
11
  int i;
12
13
  for (;n >0; n--)
14
  {
15
    for (i=0;i<100;i++)
16
      __asm("nop");
17
  }
18
}
19
20
21
int main(void)
22
{
23
  REG_PORT_DIR1 |= (1<<30);
24
25
  REG_PORT_DIR0 ^= (1<<15);
26
  REG_PORT_OUT0 |= (1<<15);
27
28
  while (1)
29
  {
30
    if(REG_PORT_IN0 & 1<<15) 
31
      REG_PORT_OUT1 |= (1<<30);
32
    else
33
      REG_PORT_OUT1 &= ~(1<<30);
34
  }

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Meinstens muss man erst den Takt fuer den Port einschalten...

von openocd (Gast)


Lesenswert?

>>Meinstens muss man erst den Takt fuer den Port einschalten...
Ok das habe ich nicht getan, weil der clock für PORT dürfte doch 
standardmäßig an sein.

Und die Output sachen funktionieren, also die LED an PA_30 leuchtet und 
ein io an PB_00 kann ich toggeln.

von openocd (Gast)


Lesenswert?

etwas übersichtlicher:
1
#include <samd21.h>
2
3
#define BTN PORT_PA15 
4
#define LED PORT_PB30
5
#define PB0 PORT_PB00
6
7
8
// USER BTN: PA15; low-active
9
// USER LED: PB30; low-active
10
// PB0: test output
11
12
static void delay(int n)
13
{
14
  int i;
15
16
  for (;n >0; n--)
17
  {
18
    for (i=0;i<100;i++)
19
      __asm("nop");
20
  }
21
}
22
23
int main(void)
24
{
25
  REG_PORT_DIRSET1 = LED;
26
  REG_PORT_DIRSET1 = PB0;
27
28
  REG_PORT_DIRCLR0 = BTN;
29
  REG_PORT_OUTSET0 |= BTN;
30
31
  while (1)
32
  {
33
    if(REG_PORT_IN0 & BTN) 
34
      REG_PORT_OUTSET1 = LED;
35
    else
36
      REG_PORT_OUTCLR1 = LED;
37
38
    REG_PORT_OUTTGL1 = PB0;
39
  }
40
}

von openocd (Gast)


Lesenswert?

Ich habe das Problem gefunden.
Der Input ist nicht aktiviert und es kann aktiviert werden durch:
1
  PORT->Group[0].PINCFG[15].reg = PORT_PINCFG_INEN | PORT_PINCFG_PULLEN;

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.