Le PIC 18F2620 dispose d’un bus I2C intégré (Inter-Integrated Circuit). I2C est un bus série synchrone à 2 fils.

Certains appareils, tels que des capteurs, communiquent avec des microcontrôleurs sur ce bus série 2 fils. Plusieurs périphériques, même différents types de dispositifs peuvent être connectés au même bus I2C 2 fils sans provoquer des collisions ou des erreurs.
Chaque dispositif contient une adresse unique qui permet à plusieurs unités connectées au même bus I2C.
Dans cet exemple, nous utiliserons l’horloge temps réel (RTC) DS1307 qui communique sur I2C à définir (écrire) l’heure et la date et aussi lire. Avant de continuer, assurez – vous de lire  le tutoriel I2C .

Le DS1307 est une horloge / un calendrier en temps réel de faible puissance de  Maxim Integrated  avec horloge/calendrier BCD (décimal codé binaire), plus de 56 octets de mémoire vive statique non volatile..

Les données et adresse sont transférées en série par l’ intermédiaire d’ un bidirectionnel  bus I2C . Le RTC fournit les informations de l’année, mois, date, heure, minute et seconde. La date de fin de mois est automatiquement ajustée pendant des mois moins de 31 jours , y compris la compensation de l’année bissextile jusqu’à l’année 2100. Il peut fonctionner soit au format 24 heures soit au format 12 heures avec indicateur AM / PM.
Le DS1307 est livré avec un circuit de détection de puissance intégré qui détecte les pannes de courant et commute automatiquement pour sauvegarder l’alimentation. L’opération de chronométrage continue pendant que la pièce fonctionne à partir de l’alimentation de secours. Le DS1307 RTC utilise un oscillateur à quartz externe de 32,768 kHz et ne nécessite aucune résistance ou condensateur externe pour fonctionner.

Connexion bus I2C

Comme indiqué sur le schéma de circuit ci-dessus,, relier la broche PIC SCK (broche 14 de la 18F2620) à la SCL DS1307 (broche 6) et connecter la broche PIC SDA (broche 15) à la SDA de DS1307 (broche 5).
Connectez deux résistances pull-up, un sur la ligne d’horloge série et l’autre sur la ligne de données série à l’alimentation positive.
La valeur plus élevée de la résistance de rappel est limitée par le temps de montée et la valeur inférieure de la résistance pull-up est limitée par la force d’entraînement (IOL max) des pilotes SDA et SCL. Si la résistance de pull-up est très faible, la ligne de bus peut ne pas fonctionner.
Connecter un cristal 32768Hz externe aux broches 1 et 2 de la DS1307.
Une batterie de secours 3V peut également être connecté à la broche VBAT (broche 3) du DS1307, si ce n’est pas nécessaire, cette broche peut être mise à la terre.
Sur notre circuit, nous utilisons l’oscillateur interne et le MCLR est désactivé. Si un oscillateur externe est nécessaire, il peut être connecté à des broches 9 et 10 et si le MCLR est nécessaire, il peut être connecté à une alimentation positive via resisistance de 10K.

MPLAB XC8 fournit des bibliothèques intégrées pour les dispositifs I2C. Le DS1307 fonctionne comme un dispositif esclave sur le bus I2C.
Registre d’ accès peut être obtenu en mettant en place un START et suivi d’adresse d’identification de l’ appareil. Ensuite , chaque registres sont accessibles de façon séquentielle en utilisant son adresse jusqu’à ce qu’une condition STOP est exécutée.
Dispositif d’ adresses du DS1307 est 0x68 = 1101000 (page 12 de  la fiche technique ).
Plus de détails sont disponibles à partir du  Fiche techniqu du DS1307 .

Configurer le bus I2C avec la bibliothèque périphérique PIC18F

La première chose à faire est de configurer le bus I2C sur le PIC. Selon le document d’aide la la Bibliothèque périphérique PIC18F  trouvé à l’ intérieur de votre répertoire d’installation du compilateur dans: ..Program Files (x86) Microchip \ XC8 \ 1.34 \ docs \ MPLAB_XC8_Peripheral_Libraries.pdf ( en supposant que vous installé votre compilateur dans le répertoire Program Files (x86) . 1.34 est la version de votre compilateur, il est peut – être différent si vous utilisez un autre compilateur).
Recherchez le PIC que vous allez utiliser, cliquez sur: « CLIQUEZ ICI pour la bibliothèque périphérique Détails des pour cet appareil » Pour une famille de 18F2620, les fonctions sont I²C de la page 1152 dans le pdf).

Le OpenI2C est la fonction à utiliser.
Si le microcontrôleur PIC a plus d’une des lignes I2C, spécifiez lequel vous ouvrez (OpenI2C, OpenI2C1 …))
La première chose à comprendre est la différence ici entre maître et esclave. Étant donné que le PIC contrôlera tous les appareils, le PIC doit être réglée comme Maître. Étant donné que la vitesse du bus n’est pas une préoccupation, le contrôle SLEW peut être désactivé en utilisant le paramètre SLEW_OFF:

  • SLEW_OFF  Slew rate désactivé pour le mode 100 kHz (mode standard).
  • SLEW_ON  Slew rate activé pour le mode 400 kHz (mode rapide)

La deuxième chose est de comprendre ce que le registre SSPADD (SSP Adresse) fait à l’intérieur du PIC. Le registre SSPADD contient l’adresse de dispositif esclave lorsque le SSP est configurée en mode esclave I2C. Lorsque le SSP est configuré en mode maître, les sept bits inférieurs de la SSPADD agissent comme générateur Vitesse de transmission.
Il peut être utilisé pour spécifier quelles communications de débit en bauds (vitesse) se produiront en fonction du cristal utilisé.
Pour notre exemple, nous utilisons un oscillateur interne à une fréquence de 8 MHz et la vitesse de transmission de 100 kHz, SSPADD = 45 que le DS1307 fonctionne en mode standard (100kHz) seulement.
De l’aide du document:  PICmicro MSSP Module for I2C Communications   à la page 3, la formule de calcul du SSPADD est:

Fosc est la fréquence de l’oscillateur et Bit Rate est la vitesse de communication (100KHz, 400KHz, …)

Pour plus de valeurs, vérifiez la  Fiche technique du PIC18F2620

A ce stade, l’initialisation du I2C est terminée et la communication peut maintenant commencer.

Il y a 2 fonctions couramment utilisées avec avec cette puce: définir des valeurs en mémoire et obtenir des valeurs de la mémoire.
Nous allons expliquer les deux fonctions en utilisant des exemples.
Les valeurs numériques dans cette puce sont stockées en utilisant décimal codé binaire de 4 bits (BCD). Une conversion de BCD en binaire et binaire en BCD sera nécessaire pour afficher et sauvegarder correctement les valeurs en utilisant un PIC.

L’ écriture et la lecture d’un esclave peut être  résumée comme suit:

Maître écrit à un esclave

  1. Envoyer un bit START (zéro logique)
  2. Envoie l’adresse I²C de l’esclave avec le bit R / W bas (adresse paire)
  3. Envoyez le registre de la puce que vous voulez écrire
  4. Envoyer l’octet de données
  5. Envoyez la séquence STOP. 

Maître lit d’un esclave

  1. Envoyer un START
  2. Envoyer l’adresse I²C de l’esclave avec le bit R / W bas (adresse paire)
  3. Envoie le registre de la puce que tu veux lire
  4. Envoyer à nouveau une séquence START (démarrage répété)
  5. Envoyer l’adresse I²C de l’esclave avec le bit R / W haut (adresse impaire)
  6. Lire l’octet de données de l’esclave
  7. Envoyez la séquence STOP.

Définir les valeurs d’horloge temps réel

La première chose est de programmer le circuit intégré avec les valeurs correctes pour le calendrier et les horloges. Dans notre exemple, nous allons régler les minutes. Une fois que c’est réglé, tous les autres registres (heure, jour …) peuvent être réglés en utilisant les mêmes procédures.

Minutes:

Le timing et la séquence de la communication I2C sont les suivants: Nous commençons par la commande StartI2C ().

C’est ce que nous avons fait:

1. La  première chose que nous faisons est de commencer la communication en utilisant  StartI2C () .
2.  IdleI2C () : Cette fonction vérifie l’état du périphérique et attend I2C pour le bus soit disponible. Le périphérique I2C doit être dans un état de repos avant une opération I2C peut être engagée ou une collision d’écriture sera générée.
3.  WriteI2C ():  Cette fonction permet d’ accéder au registre.
Étant donné que de nombreux périphériques peuvent être connectés à ce bus, cette adresse «réveille» le périphérique approprié. Les séquences de données suivantes ne seront ‘regardées’ que par cet appareil sur le bus. L’adresse de tout périphérique sur le bus I2C est généralement (mais pas toujours) composée de 2 parties. La première partie est un ensemble de bits d’adresse internes. La deuxième partie est composée de bits d’adresse câblés utilisant les broches de la puce. Cependant, le DS1307 a toute son adresse interne à la puce.
Selon la page 12 de  la fiche , l’adresse 7 bits est « 1101000 ». Alors , où est le 8ème bit? Après chaque octet d’adresse envoyée par le PIC en utilisant I2C, le 8ème bit détermine si l’octet suivant est écriture ou lecture par le PIC: 0 pour écrire et 1 pour lire. Le bit le moins significatif (8 bits) est 0, de sorte que les données complètes sur 8 bits pour l’ écriture sera 0xD0.
4. WriteI2C (0x01):  Selon le tableau 2 ci-dessus, chaque registre a une adresse hexadécimale qui lui est associée. Notez que le registre MINUTES est 01h (ou 0x01). Par conséquent, pour accéder au registre, le PIC écrit 0x01.
5. WriteI2C (0b00010010):  Selon le tableau 2, le registre MINUTES est composé de deux parties:
Le quartet inférieur (bit 0 à bit 3) et le quartet supérieur (bit 4 à bit 6). Les deux quartets sont utilisés ensemble pour représenter des nombres à deux chiffres. Par exemple, le nombre « 13 » est composé d’un « 1 » et d’un « 3 ». Chaque chiffre est stocké dans un quartet séparé. Le ‘1’ est stocké comme un numéro BCD dans le quartet supérieur tandis que le ‘3’ est stocké comme un numéro BCD dans le quartet inférieur.
Par exemple, pour enregistrer le nombre « 13« , le registre MINUTES doit être réglé sur « 001 0011 » en binaire.
Le ‘001’ est BCD pour ‘1’ et 0011 est BCD pour ‘3’. Comme il n’y a pas de minutes à deux chiffres supérieures à 59, seulement.
6. StopI2C ():  Après tout, nous pouvons fermer le bus I2C.

Nous avons écrit le nombre binaire 0010011 dans le registre MINUTES, on peut répéter la même procédure ou écrire une fonction que l’on peut appeler pour régler l’heure, le jour, le mois et ainsi de suite. Maintenant, l’horloge en temps réel gardera la trace des minutes et après 59min: 59sec, elle augmentera le registre des heures et passera à 00min: 00secs.

Apprenons maintenant à lire des registres.

Obtenir la valeur de l’horloge temps réel

L’étape suivante consiste à obtenir des données de la RTC en mémoire PIC. En supposant I2C a été préalablement configuré, tous les fichiers appropriés ont été inclus, et le CCF a des valeurs stockées, nous pouvons commencer. Dans l’exemple suivant, nous allons obtenir la valeur pour le jour de la semaine. Nous pouvons commencer par déclarer une variable char pour stocker la valeur de 8 bits (qui contient le numéro de BCD).

La routine de lecture I2C doit être ajoutée. Par conséquent, nous commençons comme d’habitude en utilisant la commande StartI2C () et adressons la puce en utilisant WriteI2C ().

Le reste des registres peut également être lu de la même manière pour afficher l’heure, minute, seconde et ainsi de suite.

Ce qui est important de noter ici encore, les données lues est la valeur BCD 8 bits, il doit être converti en binaire, décimal ou hexadécimal au besoin avant d’être utilisé par le microcontrôleur.