SPI & Arduino
Isis peut simuler le fonctionnement de la plateforme Arduino.
Le langage Arduino propose la bibliothèque SPI dont les fonctions permettent de gérer le bus SPI en mode maître.
On se propose dans cette partie de piloter le MAX6902 avec un Arduino et d'afficher l'heure courante dans un terminal série.
Fonctions de la bibliothèque Arduino SPI.h
La bibliothèque
beginTransaction()
SPI.beginTransaction(mySettings)
Initialise le bus SPI avec des réglages précisés dans mySettings, à savoir :
la vitesse maximale de transmission ;
l'ordre des bits transmis ;
le mode SPI (mode 0 à 3).
Exemple :
SPISettings mySettings(1000000UL,MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);
begin ()
SPI.begin()
Configure les broches SCK, MOSI et /CS en sortie.
transfer()
SPI.transfer(val)
SPI.transfer(buffer, val);
Permet d'envoyer ou de recevoir un ou plusieurs octets sur le bus SPI.
byte receivedByte;
receivedByte = SPI.transfer(0x00);
Attention :
Pour transférer un ou plusieurs octets la ligne /CS n'est pas pilotée automatiquement. Il faudra donc penser à abaisser /CS avant l'envoi d'un ou plusieurs octets puis à relever /CS à la fin de l'échange :
// la ligne /CS est raccordée à la broche 10
digitalWrite(10, LOW);
receivedByte = SPI.transfer(0x00);
digitalWrite(10, HIGH);
endTransaction()
SPI.endTransaction()
Permet de libérer les broches SCK, MOSI et /CS de leur utilisation par le bus SPI.
Programmation du MAX6809
L'objectif est de programmer une carte Arduino Uno avec la bibliothèque SPI afin de lire l'heure et la date délivrée par la MAX6902.
Initialisation du MAX6902 à la date et heure courantes
Simulation :
Enregistrer, dézipper puis ouvrir les fichiers Isis et Arduino suivants : Max6902-Arduino [zip].
Analysez le programme Arduino MAX6902_INIT puis simulez-le avec Isis.
Vérifier avec Isis que le MAX6902 est bien initialisé à l'heure et date courantes.
Remarque :
Il y aura un décalage de quelques secondes car la date est obtenue au moment de la compilation du fichier.
Lecture par Arduino de la date et heure courantes
Simulation :
On lira la date et l'heure courantes avec une commande burst. On utilisera la fonction SPI.tranfer(buffer, val)
en lui passant en paramètre un tableau d'octets représentant la séquence :
byte burst_cmd[9] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // modifier les valeurs du tableau pour qu'elles correspondent à la commande burst
digitalWrite(CS, LOW);
SPI.transfer(burst_cmd, 9);
digitalWrite(CS, HIGH);
Complétez le programme précédent afin de lire la date et heure courantes.
Le programme sera vérifié par simulation en vérifiant que les octets sont bien envoyés par l'esclave grâce au debugger SPI.
Fondamental :
Les valeurs lues par la commande précédente se trouvent dans le tableau burst_cmd
.
Pour accéder à un élément du tableau il suffit d'écrire le nom du tableau en indiquant entre crochets le numéro de l'élément. Attention le premier élément a le numéro 0.
byte month, minute;
month = burst_cmd[5]; // month contient le numéro du mois
minute = burst_cmd[2]; // minute contient les minutes
Envoi de la date et heure courantes dans le terminal série
Simulation :
Le code utilisé par le MAX6902 est le BCD (Binary Coded Decimal). Exemple : lorsque le MAX6902 envoie la valeur 12 pour le mois de décembre, cela correspond au nombre %00010010. Si vous envoyer ce nombre vers le moniteur série il vous affichera 18 car %00010010 = 18 = $12. Il faut donc modifier Serial.print()
pour qu'il envoie la valeur hexadécimale, exemple :
byte value = 0x18;
Serial.println(value); // affiche 24 car 0x18 = 24
Serial.println(value, HEX); // affiche 18
Complétez le programme précédent afin d'envoyer vers le moniteur série la date et heure courantes sous la forme :
Date: JJ-MM-YY
Time: HH-MM-SS