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


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 openocd (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Meinstens muss man erst den Takt fuer den Port einschalten...

von openocd (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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;

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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.