Forum: Mikrocontroller und Digitale Elektronik Arduino Zero mit ArduinoStart Konfigurieren


von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

Atmel hat zur Konfiguration seiner ARM-Prozessoren das Online-Tool 
AtmelSTART enwickelt:

http://start.atmel.com/

Damit kann man kann man die Peripherie der ARM-Prozessoren konfigurieren 
und ein paar vorgefertigte Bibliotheksfunktionen einbinden.

Wenn man statt der Arduino Library lieber die Atmel-Funktionen benutzen 
will, kann man das am besten mit AtmelStart machen.

Ich stelle hier mal die Konfiguration des LED-Pins und der 
Delay-Funktionen für den Arduino-Zero zur Verfügung. Diese Konfiguration 
lässt sich wieder in die AtmelSTART Weboberfläche importieren und 
erweitern.

Der Code für das Blink-Programm würde dann so aussehen:
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
4
int main(void)
5
{
6
  system_init();
7
8
  while(1) 
9
  {
10
    gpio_set_pin_level(LED,  false);
11
    delay_ms(1000);
12
    gpio_set_pin_level(LED,  true);
13
    delay_ms(1000);
14
  }
15
}

von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Konfiguration für die Spannungsmessung am ADC-Pin0 und die 
Ausgabe auf die serielle Schnittstelle mit 9600 Baud.

von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Konfiguration.

von chris_ (Gast)


Lesenswert?

Hier habe ich mal den passenden Code dazu geschrieben.
Im Vergleich zu den Orginal Arduino kann der optisch aber keinen Preis 
gewinnen. Ich finde die Arduino funktionen im Vergleich dazu gar nicht 
so schlecht.
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
#include <stdlib.h>
4
5
struct io_descriptor *Io;
6
7
void init()
8
{
9
  adc_sync_enable(&ADC_0);
10
  usart_sync_get_io_descriptor(&USART_0, &Io);
11
  usart_sync_enable(&USART_0);
12
}
13
void toggleLed()
14
{
15
  static uint8_t flag=0;
16
  flag^=1;
17
  gpio_set_pin_level(LED,  flag);
18
}
19
#define NUMBEROFDIGITS 4
20
#define NUMBERBASE 10
21
22
int main(void)
23
{
24
  uint8_t   asciiBuffer[NUMBEROFDIGITS+1]={0};
25
  uint8_t    adcByteBuffer[2];
26
  uint16_t  wert;
27
  
28
  system_init();
29
  init();
30
  io_write(Io, (uint8_t *)"serial ADC example", 18);
31
  io_write(Io, (uint8_t *)"\n\r", 2);
32
33
  while(1) 
34
  {
35
    delay_ms(100);    
36
    adc_sync_read(&ADC_0, adcByteBuffer, 2);
37
    wert = adcByteBuffer[0]+((uint16_t)adcByteBuffer[1]<<8);
38
    itoa( wert, (char*)asciiBuffer, NUMBERBASE );
39
    io_write(Io, asciiBuffer, NUMBEROFDIGITS);  
40
    io_write(Io, (uint8_t *)"\n\r", 2);
41
    toggleLed();
42
  }
43
}

von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

Bei AtmelSTART gibt es sogennante "Middleware" Module.
Mit einem davon lässt sich printf auf die UART umleiten. Damit wird der 
Code etwas übersichtlicher.
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
#include "stdio_start.h"
4
5
void init()
6
{
7
  STDIO_REDIRECT_0_init();
8
  adc_sync_enable(&ADC_0);
9
}
10
11
uint16_t readAdc()
12
{
13
  uint8_t   adcByteBuffer[2];
14
  uint16_t  wert;
15
  adc_sync_read(&ADC_0, adcByteBuffer, 2);
16
  wert = adcByteBuffer[0]+((uint16_t)adcByteBuffer[1]<<8);
17
  return wert;
18
}
19
20
int main(void)
21
{
22
  system_init();
23
  init();
24
  
25
  printf("Arduino Zero Read ADC Example \n\r");
26
27
  while(1) 
28
  {
29
30
    printf("%d\n\r",readAdc());
31
    delay_ms(100);
32
  }
33
}

von chris_ (Gast)


Angehängte Dateien:

Lesenswert?

Bei den vorigen Konfigurationen war der CPU-Takt auf nur 8Mhz 
eingestellt.
Hier die Konfiguration für einen schnelleren Takt.

Der folgende Pin-Toggle Code ergibt damit
1
#include "atmel_start.h"
2
#include "atmel_start_pins.h"
3
#include "stdio_start.h"
4
5
int main(void)
6
{
7
  system_init();
8
9
  while(1)
10
  {
11
    gpio_set_pin_level(LED,  0);
12
    gpio_set_pin_level(LED,  1);
13
  }
14
}

ergibt

Tlow: 628us
Thigh: 832us

von Max M. (arrowmax)


Lesenswert?

Hi Chris,
I can't get the native USB to work, have you tried this in Atmel Start?

von Gert van Biljon (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Max!

Attaches an Atmel studio project that I set up for the Adafruit Feather 
M0 that uses the same AtSamD21 chip as in the Arduino Zero. With this I 
have managed to get the USB port running as a virtual com port. For the 
USB you have to set the speed to 48MHz

Plenty comments in the main.c file

Hope it helps

Gert van Biljon

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.