Procédure d'utilisation du bus 1Wire. ------------------------------------- Pour utiliser le bus 1Wire, il faut tenir compte de l'identifiant des circuits. En effet, chaque circuit 1Wire contient un identifiant unique. L'identifiant unique est composé du code de famille du circuit, suivi d'un code à 48 bits (6 bytes) et d'une somme de contrôle. Pour stocker les identifiants de chaque élément, il faut donc définir pour chacun d'eux, une variable indicée de 8 Octets. Cette variable aura la structure suivante : Var(0) - 1 octet pour le code famille du circuit Var(1) - 6 octets .... - contenants l'identifiant Var(6) - unique du circuit Var(7) - CRC des 7 octets précédents L'utilisation du bus se fera de manière différente suivant qu'il y ai un seul ou plusieurs circuits sur le bus. En général, lorsqu'un seul circuit est présent, il suffira d'envoyer une commande "READ" ou "WRITE" sur le bus. Par contre, si plusieurs circuits sont présents, les commandes de lecture et d'écriture sur le bus devront-être suivie des 8 octets d'identifiant du circuit à adresser. Les commandes utilisées pour chaque circuit sont décrites dans les datasheets respectifs des circuits. De manière générale, le bus 1Wire sera utilisé selon la séquence suivante : (Les indications entre parenthèses correspondent aux commandes du BASCOM) A : Définition du Bus. ---------------------- 1 - Définition de la pin utilisée pour l'élément 1Wire. (CONFIG 1WIRE) B : Enumération. ---------------- 1 - Comptage du nombre d'éléments sur le bus. (1WIRECOUNT) 2 - Lecture de l'ID du premier élément. (1WSEARCHFIRST) 3 - Lecture des éléments suivants. (1WSEARCHNEXT) C : Utilisation. ---------------- 1 - Reset du Bus 1Wire. (1WRESET) 2a- Ecriture des valeurs sur le bus. (1WREAD) et/ou 2b- Lecture des valeurs sur le bus. (1WWRITE) D : Test de présence (facultative). ----------------------------------- - Test de la présence d'un élément du bus. Ce test est surtout utilisé avec les ibuttons. (1WVERIFY) Lors de l'écriture du programme en structurée, il faudra en général définir les variables suivantes : OW_Nombre - (Byte) - Nombre d'éléments sur le bus OW_ID(n,7) - (Byte) - Identifiants des circuits n représente le nombre de circuits 8 bytes pour l'identifiant unique OW_Erreur - (Bit) - Drapeau d'erreur pour les fonctions 1Wire Pour l'énumération, nous aurons alors la structure suivante : LET ow_nombre = IF ow_nombre > 1 THEN LET i = 1 DO WHILE i <= ow_nombre LET i = i + 1 ENDDO ENDIF Pour l'utilisation, il y aura des structures comme la suivante : (Ceci est un exemple pour la lecture de plusieurs DS18B20, les températures sont stockées dans les variables TempH(n) et TempL(n) qui reprennent les octets de poids fort et faible de chaque DS18B20) LET i = 0 DO WHILE i <= ow_nombre ' Code ROM d'adressage LET j = 0 DO WHILE j < 8 ' Adressage du circuit n°i LET j = j + 1 ENDDO ' A partir de maintenant et jusqu'au RESET suivant, les commandes ' concerneront uniquement le circuit adressé. ' Exécute une conversion PAUSE 750 ms ' Temps d'attente pour la conversion ' Lecture de la ram LET TempL(i) = ' Lecture de l'octet 'Low' de Temp LET Temph(i) = ' Lecture de l'octet 'High' de Temp LET j = 0 ' A tester, normalement le DS18B20 DO WHILE j < 7 ' envoie 9 octets, mais il est ' possible que l'arrêt de la LET j = J + 1 ' lecture après les 2 premiers octets ENDDO ' ne provoque pas d'erreur... LET i = i + 1 ENDDO