===== TD sur le Bus i2C===== Visionner tout d'abord la partie du cours sur le bus i2c (slides 108 à 125): (normalement vous devriez déjà l'avoir vue): {{https://bvdp.inetdoc.net/files/iut/tp_pic/warning.jpeg}} Vos réponses aux questions sur le composant PCF8574 devront être remises pour évaluation à l'enseignant lors de la prochaine séance de TP et participeront à votre note. Solution du TD sur [[tdethindus2distancielsoluce]] ==== 1 : Généralités sur le Bus I2C==== La plupart des réponses aux questions suivantes sont indiquées dans le cours, voyez si vous arrivez à y répondre. ===Question 1.1=== Quels sont les niveaux électriques possibles sur un bus i2c ? ===Question 1.2=== Dans quels états peut se trouver une broche (par exemple SDA) d'un composant i2c ? ===Question 1.3=== Quels composants discrets doivent être connectés au bus i2c pour assurer son fonctionnement ? ===Question 1.4=== Combien d'esclaves maximum peuvent être théoriquement connectés sur un bus I2c pour pouvoir les adresser tous individuellement? ===Question 1.5=== Le bus i2C est-il half-duplex ou full-duplex ? justifier votre réponse. ===Question 1.6=== La documentation de la librairie Arduino **Wire** permettant d'utiliser l'interface I2C est accessible à l'adresse: https://www.arduino.cc/en/reference/wire . Lire les descriptions et expliquer en une phrase en français le rôle de chacune des fonctions suivantes: **begin()**, **requestFrom()**, **beginTransmission()**, **endTransmission()**, **write()**, **available()**, **read()**, **SetClock()** ==== 2 : Composant PCF8574(A)==== Dans un premier temps, lire la documentation suivante: {{https://bvdp.inetdoc.net/files/comm/datasheet/PCF8574_TD.pdf}} Pour les questions suivantes, on considère les prototypes de fonctions suivants: char writePort8574(char addr, char value); // addr, l'adresse du PCF8574 sur 7 bits // value, la valeur à écrire sur le port // retourne -1 si échec 0 sinon char readPort8574(char addr, char * ptr_value); // addr, l'adresse du PCF8574 sur 7 bits // ptr_value, pointeur pour renvoyer la valeur lue sur le port // retourne -1 si échec 0 sinon ===Question 2.1=== Quel est le rôle de ce composant? ===Question 2.2=== Quel est le rôle des brôches A2, A1 et A0? ===Question 2.3=== Quelle différence existe-t-il entre les références PCF8574 et PCF8574A et pourquoi le constructeur a-t-il fait ces deux références? Quelle est la plage d'adresses I2C utilisables pour la référence de composant PCF8574A? Dans la suite, des composants PCF8574A seront considérés. ===Question 2.4=== Décrire l'algorithme de la fonction **readPort8574(...)** en indiquant ce qu'elle fait en français (phase d'adressage, d'échange des données etc...). ===Question 2.5=== Implémenter en C++ la fonction **readPort8574(...)** en utilisant les fonctions de la librairie **Wire**. ===Question 2.6=== Tracer le chronogramme des signaux SDA et SCL si l’on appelle **readPort8574(0x2,&val)**. Indiquer quelle est la valeur retournée par la fonction. ===Question 2.7=== Tracer le chronogramme des signaux SDA et SCL si l’on appelle **readPort8574(0x38,&val)** et que les valeurs de A2-0=000 et les entrées du 8574A sont à 0x27. Indiquer quelle est la valeur retournée par la fonction. ===Question 2.8=== Décrire la fonction **writePort8574(...)** en indiquant ce qu'elle fait en français (phase d'adressage, d'échange des données etc...). ===Question 2.9=== Implémenter en C++ la fonction **writePort8574(...)** en utilisant les fonctions de la librairie **Wire**. ===Question 2.10=== Tracer le chronogramme des signaux SDA et SCL si l’on appelle **writePort8574(0x39,0x82)** et que les valeurs de A2-0=001. Indiquer quelle est la valeur retournée par la fonction. ===Question 2.11=== Décrire un programme permettant de lire les entrées d'un PCF8574 dont les bits d'adresse sont reliés à 0 et de recopier cette valeur sur un PCF8574A dont les bits d'adresse forment la valeur 3. ==== 3 : Composant DS13072==== Dans un premier temps, lire la documentation suivante: {{https://bvdp.inetdoc.net/files/comm/datasheet/DS1307.pdf}} Pour les questions suivantes, on considère les prototypes de fonctions suivants: char writeRegRTC(char I2Caddr, char Regaddr, char value) // I2Caddr, l'adresse du DS13072 sur le bus sur 7 bits // Regaddr, l'adresse du registre du DS13072 à écrire // value,la valeur à écrire dans le registre // retourne -1 si échec 0 sinon char readRegRTC(char I2Caddr, char Regaddr, char * ptr_value) // I2Caddr, l'adresse du DS13072 sur le bus sur 7 bits // Regaddr, l'adresse du registre du DS13072 à lire // ptr_value, pointeur pour renvoyer la valeur lue dans le registre // retourne -1 si échec 0 sinon ===Question 3.1=== Quel est le rôle de ce composant? ===Question 3.2=== Du point de vue de la communication, qu'est ce qui le différencie du PCF8574(A)? ===Question 3.3=== Le composant se comporte comme une série de compteurs mis en cascade. Dessiner la mise en cascade des compteurs de l'unité de seconde jusqu'à la dizaine d'heure telle que réalisée dans le composant. Expliquer l'intérêt de l'utilisation de la base Binary Coded Decimal (Décimal Codé en Binaire) pour les valeurs de comptage. ===Question 3.4=== Décrire l'algorithme de la fonction **writeRegRTC(...)** en indiquant ce qu'elle fait en francais (phase d'adressage, d'échange des données etc...). ===Question 3.5=== Implémenter en C++ la fonction **writeRegRTC(...)** en utilisant les fonctions de la librairie **Wire**. ===Question 3.6=== Tracer le chronogramme des signaux SDA et SCL si l’on appelle **writeRegRTC(0x68,0x2,0x52)**. Indiquer quelle est la valeur retournée par la fonction. ===Question 3.7=== Décrire l'algorithme de la fonction **readRegRTC(...)** en indiquant ce qu'elle fait en francais (phase d'adressage, d'échange des données etc...). ===Question 3.8=== Implémenter en C++ la fonction **readRegRTC(...)** en utilisant les fonctions de la librairie **Wire**. ===Question 3.9=== Tracer le chronogramme des signaux SDA et SCL si l’on appelle **readRegRTC(0x68,0x1,&val)** et que la valeur lue est 0x21. Indiquer quelle est la valeur retournée par la fonction. ===Question 3.10=== Proposer un schéma de câblage pour un montage connectant la plateforme Arduino à une RTC DS13072 et deux expandeurs de ports I2C PCF8574. =====Solutions===== Les solutions du TD sont consultables sur: [[tdethindus2distancielsoluce]]