Forum: Mikrocontroller und Digitale Elektronik ATSAMD21G18 und Atmel Studio 7


von nixblicker (Gast)


Lesenswert?

Guten Tag,

ich hab mir ein adafruit Feather M0 zugelegt und versucht mehrere 
Ausgänge mit PWM zu nutzen.
Dazu gibt es die Funktion analogWrite(), die aber nicht mit allen Pins 
funktioniert!
Deswegen wollte ich den µC mit Atmel Studio 7 nutzen und muss aber 
feststellen dass ich da vor einer arg steilen Lernkurve stehe...

Ich scheitre bereits daran den USART korrekt zu konfigurieren.
Die ganzen ASF-Sachen kommen mir arg unübersichtlich und verzweigt vor.
Kurzum ich blicke nicht durch und brauche "Starthilfe"

Gibt es eine leicht verständliche Doku oder Tutoarials?

Viele Grüße,
Bob

von Marco H. (damarco)


Lesenswert?

Das liegt am Pinmux siehe Referenz. Nicht alle Pins können per MUX mit 
den Timer PWM ausgeben.

Die erste Hürde wird sein das linker Script zu besorgen. Denn die SAMs 
haben keinen ROM Bootloader mehr. Der liegt im Flash und damit muss das 
Programm oberhalb gespeichert werden. Hinzu kommt das Problem mit dem 
NVM Ram wenn du den Flash blank machst.

Sagen wir es mal so wenn du dich der Herausforderung nicht stellen 
willst, lass es. Hat das Teil überhaupt SWD Anschlüsse ?


Mit Atmel Studio bist du bis auf das Debuggen nicht weiter. Denn die SAM 
Libs sind auch im Arduino nutzbar und sogar enthalten. Es hindert dich 
nichts dran diese auch im Sketch zu benutzen.

Somit kann weniger schief gehen ;)

: Bearbeitet durch User
von nixblicker (Gast)


Lesenswert?

Guten Morgen und Danke für die Antwort!

Marco H. schrieb:
> Die erste Hürde wird sein das linker Script zu besorgen. ... Hinzu kommt
> das Problem mit dem NVM Ram wenn du den Flash blank machst.

Zugegeben, so tief bin ich noch nie in die µC-Geschichten eingestiegen.
Wäre sicherlich von Vorteil um besser zu verstehen was man da eigentlich 
macht, aber bisher ist das immer im Hintergrund abgelaufen und ich 
konnte in z.Bsp. AVR32Studio die Projekte mit den mitgelieferten 
Bibliotheken ganz gut bewältigen.

Marco H. schrieb:
> Sagen wir es mal so wenn du dich der Herausforderung nicht stellen
> willst, lass es. Hat das Teil überhaupt SWD Anschlüsse ?


Eigentlich wollte ich die Herausforderung annehmen, deswegen auch meine 
Frage hier ;-)
Ja, die SWD-Pins sind rausgeführt, zwar nur als Lötpads, aber 
immerhin...
Ich kann das Teil auch mit dem Atmel ICE programmieren und debuggen.

Konkret scheitere ich daran die ASF-Bibliotheken für USART so anzupassen 
dass sie mit meinem "user board" laufen.
Die Doku ist keine wirkliche Hilfe, das liest sich alles zwar schön, 
aber mehr wissen tut man nachher auch nicht.

Ich werde mir mal das Beispiel für das Atmel-Xplained board genauer 
anschauen, vielleicht kommt dadurch ja ein gewisser Erkenntnisgewinn.

Marco H. schrieb:
> Denn die SAM Libs sind auch im Arduino nutzbar und sogar enthalten. Es
> hindert dich nichts dran diese auch im Sketch zu benutzen.

Heißt das ich kann mit der Arduino IDE auch die HW-Timer selber 
konfigurieren und an die Pins schicken die ich möchte (falls nöglich)?

von chris_ (Gast)


Lesenswert?

Man kann was mit Atmel-Start probieren:
Beitrag "Arduino Zero mit ArduinoStart Konfigurieren"

Oder besser, richtig "bare metal" programmieren:
Beitrag "ATMEL ARM SAMD ohne Framework programmieren"

von Marco H. (damarco)


Lesenswert?

Ja na klar. Du kannst auch im Sketch z.bsp diesen Code ausführen.
1
/* Uart Modul*/
2
struct usart_module usart_instance;
3
4
void configure_usart(void)
5
{
6
struct usart_config config_usart;
7
usart_get_config_defaults(&config_usart);
8
config_usart.baudrate = 256000;
9
config_usart.generator_source=GCLK_GENERATOR_3;
10
config_usart.pinmux_pad0 = PINMUX_UNUSED;
11
config_usart.pinmux_pad1 = PINMUX_PA09C_SERCOM0_PAD1;
12
config_usart.pinmux_pad2 = PINMUX_PA10C_SERCOM0_PAD2;
13
config_usart.pinmux_pad3 = PINMUX_UNUSED;
14
while (usart_init(&usart_instance,SERCOM0, &config_usart) != STATUS_OK) {}
15
usart_enable(&usart_instance);
16
}

1
uint8_t string[] = "Hallo\n";
2
3
usart_write_buffer_wait(&usart_instance,string, sizeof(string));

von chris_ (Gast)


Lesenswert?

Hier noch der direkte Link auf die Uart:
Beitrag "Re: ATMEL ARM SAMD ohne Framework programmieren"

von Marco H. (damarco)


Lesenswert?

#include <usart.h>
#include <usart_interrupt.h>

muss natürlich eingebunden werden ;)

von nixblicker (Gast)


Lesenswert?

Marco H. schrieb:
> Ja na klar. Du kannst auch im Sketch z.bsp diesen Code ausführen.

Hmm... das hab ich im AS7 aber ganz ähnlich:
1
#include <usart.h>
2
#include <usart_interrupt.h>
3
#include <stdio.h>
4
5
void configure_usart(void);
6
struct usart_module usart_instance;
7
8
void configure_usart(void)
9
{
10
  struct usart_config config_usart;
11
  usart_get_config_defaults(&config_usart);
12
  
13
  config_usart.baudrate      = 115200;
14
  config_usart.generator_source  = GCLK_GENERATOR_3;
15
  config_usart.pinmux_pad0    = PINMUX_UNUSED;
16
  config_usart.pinmux_pad0    = PINMUX_UNUSED;
17
  config_usart.pinmux_pad2    = PINMUX_PB22D_SERCOM5_PAD2;
18
  config_usart.pinmux_pad3    = PINMUX_PB23D_SERCOM5_PAD3;
19
  
20
  while (usart_init(&usart_instance, SERCOM5, &config_usart) != STATUS_OK) {}
21
  usart_enable(&usart_instance);
22
}
23
24
int main(void)
25
{
26
  system_init();
27
28
  configure_usart();
29
  system_interrupt_enable_global();
30
31
  uint8_t string[] = "Hello World\r\n";
32
  usart_write_buffer_wait(&usart_instance, string, sizeof(string));
33
}


...trotzdem funktioniert es nicht. Keine Ausgabe an der seriellen 
Schnittstelle :(
Hardwaremässig ist aber alles ok, mit dem Arduino sketch kann ich an den 
Pins senden und empfangen...

Ich würde das schon gerne richtig lernen, auch wenn sketch einfacher 
ist.
Obwohl, deinen code krieg ich da auch nicht zum laufen. Scheitert schon 
an dem einbinden der .h Dateien :/

@chris: Danke für die Links, bin schon am Lesen :)

von chris_ (Gast)


Lesenswert?

>@chris: Danke für die Links, bin schon am Lesen :)

Gerne geschehen. Mein Leidensweg war:

1. Atmel ASF
2. Atmel Start
3. schließlich und endlich alles zu Fuß "Bare Metal"

Für das Verständnis ist "3" sicherlich der beste Weg, allerdings 
natürlich auch etwas mühsam. Dafür kann man sich aber sicher sein, dass 
sich alles damit machen lässt und man nicht durch die Eigenschaften der 
verwendeten Lib beschränkt wird.

Schöne wäre es, wenn es noch mehr "Bare Metal" Beispiele gibt. Mit 
größerer Code-Basis wird alles einfacher.

von nixblicker (Gast)


Lesenswert?

kommt mir bekannt vor!

weder mit ASF noch mit Start habe ich ein funktionierendes Beispiel für 
USART hinbekommen...

von nixblicker (Gast)


Lesenswert?

habe eben versucht den USART-Code aus

Beitrag "Re: ATMEL ARM SAMD ohne Framework programmieren"

bei mir zu verwenden, leider erfolglos :(

Das Debuggen will mir auch irgendwie nicht wirklich gelingen.
Sehr oft steht nur "could not evaluate" oder "optimized out" da. Was 
natürlich wenig Erkenntnisse bringt.

So langsam zweifele ich echt an mir selber...

von chris_ (Gast)


Lesenswert?

>Beitrag "Re: ATMEL ARM SAMD ohne Framework programmieren"

Das Beispiel dort ist für einen SAMD20. Du hast einen SAMD21. 
Wahrscheinlich muss man da noch was anpassen.

>Das Debuggen will mir auch irgendwie nicht wirklich gelingen.
>Sehr oft steht nur "could not evaluate" oder "optimized out"

Dort könntest Du die Compileroptionen auf -O0 stellen und eventuell die 
Variablen "static" deklarieren, die Du beobachten willst.

Kannst Du eine LED "bare metal" blinken lassen?

von Werner P. (Gast)


Lesenswert?

Probier mal das hier:
1
void configure_usart(void)
2
{
3
  
4
  struct usart_config config_usart;
5
  usart_get_config_defaults(&config_usart);
6
7
  config_usart.baudrate    = 115200;
8
  config_usart.mux_setting = USART_RX_3_TX_2_XCK_3;
9
  config_usart.pinmux_pad0 = PINMUX_UNUSED;
10
  config_usart.pinmux_pad1 = PINMUX_UNUSED;
11
  config_usart.pinmux_pad2 = PINMUX_PA10C_SERCOM0_PAD2;
12
  config_usart.pinmux_pad3 = PINMUX_PA11C_SERCOM0_PAD3;
13
  config_usart.generator_source = GCLK_GENERATOR_0;
14
  
15
  while (usart_init(&usart_instance,SERCOM0, &config_usart) != STATUS_OK) {
16
  }
17
18
  usart_enable(&usart_instance);
19
}

von nixblicker (Gast)


Lesenswert?

chris_ schrieb:
> Das Beispiel dort ist für einen SAMD20. Du hast einen SAMD21.
> Wahrscheinlich muss man da noch was anpassen.

oh, etwas weiter oben stand:

> Ich habe den Code für
> das senden mittels TX  für einen SAMD21 zusammengebaut.

deswegen dachte ich das sollte passen.
Die Pinbelegung passt ja auch...

chris_ schrieb:
> Kannst Du eine LED "bare metal" blinken lassen?

Ja, das funktioniert bereits

Werner P. schrieb:
> config_usart.pinmux_pad2 = PINMUX_PA10C_SERCOM0_PAD2;
>   config_usart.pinmux_pad3 = PINMUX_PA11C_SERCOM0_PAD3;

Ich glaub ich spinn, das geht!
Meine Güte, hab ich doch tatsächlich die ganze Zeit die Signale an die 
falschen Pins gesendet!
Ich geh mich mal kurz schämen :/

...
...

so, jetzt gehts wieder ;-)
Zu meiner Verteidigung, im adafruit Schaltplan sind PB22 und PB23 mit 
TXD und RXD bezeichnet, rausgeführt sind aber PA10 und PA11. Aber die 
sind D1 und D0 benannt.
auf der Platine sind die PIns aber mit TxD und RxD beschriftet.

Tausend Dank, Werner!

von chris_ (Gast)


Lesenswert?

>oh, etwas weiter oben stand:

>> Ich habe den Code für
>> das senden mittels TX  für einen SAMD21 zusammengebaut.

Äh, tschuldigung, Du hast recht. Die Version war doch für den SAMD21 ( 
steht ja auch im Filenamen ( 
http://www.mikrocontroller.net/attachment/286995/SAMD21_bareMetalUartTx.c 
)

Ich habe zwei verschieden Systeme: einen vom Boot-Fuses modifizierten 
Arduino Zero mit SAMD21 und ein anders mit SAMD20.

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.