Différences entre versions de « FEATHER-M0-Adapter-Croquis »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 83 : Ligne 83 :
  
 
== L'accès mémoire (Aligned Memory Access) ==
 
== L'accès mémoire (Aligned Memory Access) ==
This is a little less likely to happen to you but it happened to me! If you're used to 8-bit platforms, you can do this nice thing where you can typecast variables around. e.g.
+
Cela ne risque pas forcément de vous arriver mais nous avons rencontré ce problème!  
 +
 
 +
Si vous avez l'habitude des plateformes 8-bits, vous pouvez utiliser des techniques de typecasting de variable comme celle-ci dessous:
  
 
  <nowiki>uint8_t mybuffer[4];
 
  <nowiki>uint8_t mybuffer[4];
 
float f = (float)mybuffer;</nowiki>
 
float f = (float)mybuffer;</nowiki>
  
You can't be guaranteed that this will work on a 32-bit platform because '''mybuffer''' might not be aligned to a 2 or 4-byte boundary. The ARM Cortex-M0 can only directly access data on 16-bit boundaries (every 2 or 4 bytes). Trying to access an odd-boundary byte (on a 1 or 3 byte location) will cause a Hard Fault and stop the MCU. Thankfully, there's an easy work around ... just use memcpy!
+
Vous ne pouvez pas avoir la garantie qu'une telle méthode fonctionnera sur une plateforme 32-bits parce que '''mybuffer''' pourrait ne pas être aligné sur 2 ou 4-octets. The ARM Cortex-M0 can only directly access data on 16-bit boundaries (every 2 or 4 bytes). Trying to access an odd-boundary byte (on a 1 or 3 byte location) will cause a Hard Fault and stop the MCU. Thankfully, there's an easy work around ... just use memcpy!
  
 
  <nowiki>uint8_t mybuffer[4];
 
  <nowiki>uint8_t mybuffer[4];

Version du 1 mai 2016 à 12:05


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Préambules

L' ATSAMD21 est une puce vraiment très intéressant... mais encore assez récent au coeur des Arduino-compatible. La plupart des croquis/sketch fonctionne mais nous avons noté quelques points!

Référence analogique

Si vous avez l'habitude d'utiliser la broche ARef pour les références analogique différentes de 3.3V alors le code doit utiliser analogReference(AR_EXTERNAL) (c'est AR_EXTERNAL et non EXTERNAL)

Pullup et broche en sortie

L'ancienne façon d'activer la résistance pull-up (qui ramène le potentiel à +3.3v) sur une broche entrée était codé comme suit:

pinMode(pin, INPUT)
digitalWrite(pin, HIGH)

Il en était ainsi parce que le registre de sélection pull-up était le même que le registre de sélection des sorties.

Vous ne pouvez plus faire cela sur un M0! A la place, vous devez utiliser

pinMode(pin, INPUT_PULLUP)

Option qui à l'avantage d'être rétro-compatible avec AVR.

Sérial vs SerialUSB

99.9% de nos croquis Arduino utilisent Serial.print pour faire du débogage et produire des sorties d'information. Sur l'Arduino SAMD/M0 officiel, les instructions sont dirigés vers le port série Serial5 qui n'est pas "exposé"/accessible sur le Feather. Le port USB sur l'Arduino M0 officiel est appelé SerialUSB.

Sur les plateformes Adafruit M0, le port série à été redirigé le port USB. Par conséquent tout fonctionne parfaitement sur un Feather M0 (et de façon totalement automatique).

Cependant, si vous comptez aussi utiliser un Arduino Arduino SAMD officiel et si vous désirez afficher des messages via le port série ALORS utilisez SerialUSB à la place de Serial

Si vous avez des croquis existant et que vous désirez utiliser ces derniers sur un M0 sans devoir faire une volée de rechercher-remplacer alors optez pour:

#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
  // Required for Serial on Zero based boards
  #define Serial SERIAL_PORT_USBVIRTUAL
#endif

juste avant la première définition de fonction de votre code. Par exemple:

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

PWM / AnalogWrite

Adafruit a eu l'occasion de constater que certaines sorties PWM ne fonctionne pas sur les coeur SAMD. Adafruit se penche sur le problème!

Fichier d'entête manquant

Si votre compilateur se plaint qu'il lui manque un fichier d'entête (Header, .h), c'est qu'il se pourrait que le code utilise une bibliothèque non supportée pas le M0.

Par exemple, si vous avez la ligne:

#include <util/delay.h>

Vous obtiendrez une erreur comme celle-ci

fatal error: util/delay.h: No such file or directory
  #include <util/delay.h>
                         ^
compilation terminated.
Error compiling.

Qui vous permet de localiser (avec précision) la ligne produisant l'erreur (le message d'erreur mentionne le nom de fichier et le numéro de ligne).

Si l'inclusion se fait depuis un bibliothèque que vous utilisez, vous pouvez désactiver l'inclusion de la sous bibliothèque litigieuse pour le M0 en l'entourant l'inclusion d'une définition #ifdef comme celle ci-dessous:

#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) && !defined(ESP8266) && !defined(ARDUINO_ARCH_STM32F2)
 #include <util/delay.h>
#endif

Le #if s'assure que le fichier d'entête n'est pas inclus pour d'autres architectures.

Si l' #include est directement dans le croquis Arduino, vous pouvez juste essayer de retirer la ligne.

Démarrage de booloader

Sur la plupart des autres AVRs, cliquer sur reset, lorsque celui-ci est branché sur USB, permet de lancer manuellement le bootloader.

Le bootloader reste actif pendant quelques secondes (time-out) puis passe la main au croquis présent sur la carte.

Sur un M0, vous aurez besoin de double cliquer sur le bouton Reset. Vous verrez la LED rouge pulser et vous saurez que le mode bootloader est actif.

Il n'y a pas de time-out dans le mode Bootloader. Une fois le mode Bootloader activé, la carte reste dans ce mode. Cliquez sur le bouton Reset à nouveau pour redémarre la carte (et exécuter votre Croquis).

L'accès mémoire (Aligned Memory Access)

Cela ne risque pas forcément de vous arriver mais nous avons rencontré ce problème!

Si vous avez l'habitude des plateformes 8-bits, vous pouvez utiliser des techniques de typecasting de variable comme celle-ci dessous:

uint8_t mybuffer[4];
float f = (float)mybuffer;

Vous ne pouvez pas avoir la garantie qu'une telle méthode fonctionnera sur une plateforme 32-bits parce que mybuffer pourrait ne pas être aligné sur 2 ou 4-octets. The ARM Cortex-M0 can only directly access data on 16-bit boundaries (every 2 or 4 bytes). Trying to access an odd-boundary byte (on a 1 or 3 byte location) will cause a Hard Fault and stop the MCU. Thankfully, there's an easy work around ... just use memcpy!

uint8_t mybuffer[4];
float f;
memcpy(f, mybuffer, 4)

Conversion en virgule flottante

Like the AVR Arduinos, the M0 library does not have full support for converting floating point numbers to ASCII strings. Functions like sprintf will not convert floating point. Fortunately, the standard AVR-LIBC library includes the dtostrf function which can handle the conversion for you.

Unfortunately, the M0 run-time library does not have dtostrf. You may see some references to using #include <avr/dtostrf.h> to get dtostrf in your code. And while it will compile, it does not work.

Instead, check out this thread to find a working dtostrf function you can include in your code:

http://forum.arduino.cc/index.php?topic=368720.0

Combien de RAM disponible

The ATSAMD21G18 has 32K of RAM, but you still might need to track it for some reason. You can do so with this handy function:

extern "C" char *sbrk(int i);

int FreeRam () {
  char stack_dummy = 0;
  return &stack_dummy - sbrk(0);
}

Thx to http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879 for the tip!

Stocker des données en Flash

If you're used to AVR, you've probably used PROGMEM to let the compiler know you'd like to put a variable or string in flash memory to save on RAM. On the ARM, its a little easier, simply add const before the variable name:

const char str[] = "My very long string";

That string is now in FLASH. You can manipulate the string just like RAM data, the compiler will automatically read from FLASH so you dont need special progmem-knowledgeable functions.

You can verify where data is stored by printing out the address:

Serial.print("Address of str $"); Serial.println((int)&str, HEX);

If the address is $2000000 or larger, its in SRAM. If the address is between $0000 and $3FFFF Then it is in FLASH


Source: Adafruit Feather M0 Basic Proto créé par LadyAda pour AdaFruit Industries. Crédit [www.adafruit.com AdaFruit Industries]

Traduit par Meurisse D. pour MCHobby.be

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.