Modifications

Sauter à la navigation Sauter à la recherche
7 554 octets ajoutés ,  1 mai 2016 à 13:28
aucun résumé de modification
Ligne 1 : Ligne 1 :  
{{FEATHER-M0-NAV}}
 
{{FEATHER-M0-NAV}}
   −
{{traduction}}
+
== 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 {{fname|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:
 +
 
 +
<nowiki>pinMode(pin, INPUT)
 +
digitalWrite(pin, HIGH)</nowiki>
 +
 
 +
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
 +
 
 +
<nowiki>pinMode(pin, INPUT_PULLUP)</nowiki>
 +
 
 +
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. {{fname|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:
 +
 
 +
<nowiki>#if defined(ARDUINO_SAMD_ZERO) && defined(SERIAL_PORT_USBVIRTUAL)
 +
  // Required for Serial on Zero based boards
 +
  #define Serial SERIAL_PORT_USBVIRTUAL
 +
#endif</nowiki>
 +
 
 +
'''juste avant la première''' définition de fonction de votre code. Par exemple:
 +
 
 +
{{ADFImage|FEATHER-M0-Adapter-Croquis-00.png}}
 +
 
 +
== 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:
 +
 
 +
<nowiki>#include <util/delay.h></nowiki>
 +
 
 +
Vous obtiendrez une erreur comme celle-ci
 +
 
 +
<nowiki>fatal error: util/delay.h: No such file or directory
 +
  #include <util/delay.h>
 +
                        ^
 +
compilation terminated.
 +
Error compiling.</nowiki>
 +
 
 +
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:
 +
 
 +
<nowiki>#if !defined(ARDUINO_ARCH_SAM) && !defined(ARDUINO_ARCH_SAMD) && !defined(ESP8266) && !defined(ARDUINO_ARCH_STM32F2)
 +
#include <util/delay.h>
 +
#endif</nowiki>
 +
 
 +
Le {{fname|#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:
 +
 
 +
<nowiki>uint8_t mybuffer[4];
 +
float f = (float)mybuffer;</nowiki>
 +
 
 +
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. Voyez l'article "[https://fr.wikipedia.org/wiki/Alignement_en_m%C3%A9moire Alignement en mémoire]" (Wikipedia)
 +
 
 +
L'ARM Cortex-M0 peut uniquement accéder directement à des données bornées en 16-bit (tous les 2 ou 4 octets). Essayer d'accéder à un octet impaire (l'octet en position 1 ou 3) causera une faute matérielle (''Hard Fault'') et stoppera le MCU. Heureusement, il y a un moyen simple pour contourner ce problème... faire un simple {{fname|memcpy}}!
   −
== Préambules ==
+
<nowiki>uint8_t mybuffer[4];
The ATSAMD21 is a very nice little chip but its fairly new as Arduino-compatible cores go. Most sketches & libraries will work but here's a few things we noticed!
+
float f;
 +
memcpy(f, mybuffer, 4)</nowiki>
 +
 
 +
== Conversion en virgule flottante ==
 +
Comme pour les AVR Arduino, la bibliothèque M0 n'a pas un support complet pour pour la conversion des nombres en virgule flottante en chaine ASCII. Les fonctions comme sprintf ne convertira pas les nombres en virgule flottante. Par chance, la bibliothèque standard AVR-LIBC inclus la fonction {{fname|dtostrf}} peut prendre en charge cette conversion.
 +
 
 +
Malheureusement, la bibliothèque run-time du M0 ne dispose pas de {{fname|dtostrf}}.  Vous pourriez rencontrer quelques références utilisant '''#include <avr/dtostrf.h>''' pour inclure dtostrf dans votre code... mais même si cela compile, dtostrf ne fonctionnera pas!
 +
 
 +
Nous vous proposons de prendre connaissance du fil de discussion suivant pour trouver une fonction dtostrf que vous pourriez inclure dans votre code:
 +
 
 +
[http://forum.arduino.cc/index.php?topic=368720.0 http://forum.arduino.cc/index.php?topic=368720.0]
 +
 
 +
== Combien de RAM disponible ==
 +
 
 +
 
 +
L'ATSAMD21G18 dispose de 32K de RAM mais si vous avez besoin de surveiller votre consommation mémoire, vous pouvez le faire avec la fonction suivante:
 +
 
 +
<nowiki>extern "C" char *sbrk(int i);
 +
 
 +
int FreeRam () {
 +
  char stack_dummy = 0;
 +
  return &stack_dummy - sbrk(0);
 +
}</nowiki>
 +
 
 +
Trouvé grâce à ce message [http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879 http://forum.arduino.cc/index.php?topic=365830.msg2542879#msg2542879] sur le forum Arduino!
 +
 
 +
== Stocker des données en Flash ==
 +
Si vous êtes un habitué des AVR, vous avez probablement déjà utilisé PROGMEM qui vous permet de compiler une chaîne de caractère dans la mémoire Flash et permet d'économiser de la RAM.
 +
 
 +
Sur un ARM, c'est même encore plus simple, il suffit d'ajouter un {{fname|const}} devant le nom de la variable:
 +
 
 +
<nowiki>const char str[] = "My very long string";</nowiki>
 +
 
 +
Cette chaine est maintenant en FLASH. Vous pouvez manipuler la string (chaîne de caractère) comme s'il s'agissait d'une donnée en RAM, le compilateur fera le nécessaire pour effectuer les lectures en FLASH (vous n'avez donc pas besoin de connaître et utiliser les fonctions ''progmem'').
 +
 
 +
Vous pouvez vérifier où sont stockées les données en affichant leur adresse:
 +
 
 +
<nowiki>Serial.print("Address of str $"); Serial.println((int)&str, HEX);</nowiki>
    +
Si l'adresse est $2000000 ou supérieur, c'est stocké en SRAM. Si l'adresse est entre $0000 et $3FFFF alors c'est stocké en FLASH
    
{{FEATHER-M0-TRAILER}}
 
{{FEATHER-M0-TRAILER}}
29 917

modifications

Menu de navigation