User Tools

Site Tools


onewire:searchrom
L'exemple pratique utilisé dans cette démonstration provient de cette page.

SearchRom OneWire

Cette fonction utilise un algorithme de type arbre binaire de recherche. Elle permet de trouver tous les devices connectés, ainsi que leur SID respectif.

Partie de la fonction

owWriteByte(OW_SEARCH_ROM,os,iop);
 
/* Search if there is another device ID to find*/
for(IDBit=0; IDBit<2;IDBit++){
	owReadBit(&Bit_A,os,iop[DDR],iop[PORT],iop[PIN],p); // double lecture de l'Ètat du bus
	owReadBit(&Bit_B,os,iop[DDR],iop[PORT],iop[PIN],p);
 
	if(Bit_A | Bit_B){ // Si les deux sont opposés, cas 1
		ID[IDBit] = Bit_A; // On garde le premier reÁu
	}
	else
	if(IDBit+1 == *id){// Si l'index est égal à la dernière déviation, cas 2
		ID[IDBit] = 1; // on garde le 1
	}
	else
	if(IDBit+1 > *id){// Si l'index est plus grand que la dernière déviation, cas 3
		running_id = IDBit+1; // on met a jour la déviation
		ID[IDBit] = 0; // on garde le 0
	}
	else
	if(ID[IDBit] == 0){// on garde le 0, cas 4
		running_id = IDBit+1; // on met a jour la déviation
	}
	else{
		// on garde le 1, cas 5
	}
 
	/*May not work if in Overdrive Speed (Timing issues)*/
	OUT_HIGH(*iop[DDR],*iop[PORT],p);
	owWriteBit(ID[IDBit],os,iop[PORT],p);
	PIN_Z(*iop[DDR],*iop[PORT],p);
}

Dans cette boucle allant de 0 à 1, dans un premier temps nous allons lire les réponses des devices sur la ligne (L'explication quant à la signification des valeurs de Bit_A et Bit_B voir la table 1 dans le document cité plus haut). Ensuite plusieurs cas sont possibles, ils dépendent de plusieurs paramètres. Pour finir nous envoyons sur la ligne la valeur du bit choisi.

Exemple de fonctionnement

Pour l'exemple nous allons prendre 3 devices de 2 bits, A(01), B(00) et C(11). La recherche se fait toujours du bit le moins significatif jusqu'au bit le plus significatif.

Par rapport au document cité plus haut:
ID_Bit ⇔ id_bit_number (l'indice du bit cherché)
Bit_A ⇔ id_bit (premier bit reçu des devices après le OW_SEARCH_ROM)
Bit_B ⇔ cmp_id_bit (bit de complément reçu des devices après le OW_SEARCH_ROM)
ID ⇔ ROM_NO (tableau où est stocké la SID du device)
running_id ⇔ LastDiscrepancy (indice du bit à partir duquel commencera la prochaine recherche)
en fin de fonction: *id=running_id

Loop 1

condition initiale *id=0

IDBit 1 0
*id 0
Bit_A 0 0
Bit_B 1 0
ID[IDBit] 0 0
running_id 1 1

Quand IDBit = 0, nous sommes dans le cas 3.
Quand IDBit = 1, nous sommes dans le cas 1.

ID={0,0} ce qui correspond au device B(00).

Loop 2

condition initiale *id=1

IDBit 1 0
*id 1
Bit_A 0 0
Bit_B 0 0
ID[IDBit] 0 1
running_id 2 0

Quand IDBit = 0, nous sommes dans le cas 2.
Quand IDBit = 1, nous sommes dans le cas 3.

ID={1,0} ce qui correspond au device A(01).

Loop 3

condition initiale *id=2

IDBit 1 0
*id 2
Bit_A 0 0
Bit_B 0 0
ID[IDBit] 1 1
running_id 0 0

Quand IDBit = 0, nous sommes dans le cas 5.
Quand IDBit = 1, nous sommes dans le cas 2.

ID={1,1} ce qui correspond au device C(11).

onewire/searchrom.txt · Last modified: 2014/11/21 14:53 by fdacruz