Bonjour à tous,
Je développe une carte à base de pic18f2455 qui sert à gérer des iButton
Voila dix jours que je me prends la tête avec ce protocole OneWire , j'ai du me remettre au C et que je n'arrive toujours pas communiquer avec.
J'ai trouvé différents bouts de code sur internet et voici donc mes 5 fonctions qui devraient me permettre normalement d'intéragir avec ce ibutton, :
Quand je lance mon main :Code:#define DQ_P PORTBbits.RB0 #define DQ_T TRISBbits.TRISB0 #include <delays.h> #include "onewire.h" void ecrire_bit(char bitval); void ecrire_octet(char val); unsigned char ow_reset_g(void) { unsigned char presence; DQ_T = 0; //le maître met le bus bas DQ_P = 0; Delay100TCYx(58); // on temporise 480µsec DQ_T = 1; // on relache le bus Delay10TCYx(72); // on attend le reveil du capteur 60µs presence = DQ_P; // on regarde si on a une présence Delay100TCYx(28); // on attend la fin du temps possible 230µs return(presence); // on retourne le signal de présence } // 0=presence, 1 = pas de capteur unsigned char lire_bit(void) { // Lecture d'un bit DQ_T = 0; // On met DQ bas pour démarrer la séquence DQ_P = 0; DQ_T = 1; // retour niveau haut Delay10TCYx(18); // delai de 15us depuis le début de la séquence return(DQ_P); // On renvoie la valeur de DQ } unsigned char lire_octet(void) { unsigned char i; unsigned char value; for (i=0;i<8;i++) { if(lire_bit()) { value|=0x01<<i;// On lit un bit à la fois puis on shifte le tout à gauche } else { value |=0x00<<i; } Delay10TCYx(168); // on attend pour le reste de la séquence } return(value); } void ecrire_bit(char bitval) { //Ecriture d'un bit DQ_T = 0; //On met DQ bas pour démarrer la séquence DQ_P = 0; Delay10TCYx(12); //On attend 10µs if(bitval==1) { DQ_T = 1; //On met DQ au niveau Haut si la valeur à écrire est 1 } //On ne fais rien si la valeur à écrire est 0 Delay10TCYx(60); // On garde la valeur pendant 50µs } void ecrire_octet(char val) { unsigned char i; unsigned char temp; for (i=0; i<8; i++) // Ecrit un octet, un bit à la fois { temp = val>>i; // on shifte val i fois vers la droite temp &= 0x01; // on copie le bit lsb dans temp ecrire_bit(temp); // on envoie ce bit sur le bus } Delay10TCYx(144);//on attend pour le reste de la séquence }
Je pense avoir un problème avec mes unsigned char.Code:void main(void) { if(!ow-reset_g()) { unsigned octet; ecrire_octet(51); // $33 valeur permettant de lire les 64bits de la clé. octet = lire_octet(); }
Mes Delays sont corrects je les ai vérifié à l'oscilloscope.
Je code sur MPLAB et compile avec C18.
Merci.
Bonne journée
-----