Tout d'abord, comme je débarque sur le forum, brève présentation : jeune ingénieur en électronique, je suis aussi passionné par tout ce qui touche à l'embarqué. A côté de cela, ma principale passion est l'astronomie, et plus particulièrement l'astrophoto. Depuis quelques temps je cherche à mettre à profit mes compétences en électronique pour apporter de nouvelles idées pour améliorer le quotidien de l'astronome amateur.
Actuellement, je travaille principalement sur un projet dont le but est de centraliser un maximum de fonctionnalités afin de rendre l'installation de l'astronome la plus autonome possible, et ainsi réduire au maximum le nombre de câbles allant jusqu'au PC (en astrophoto, le PC portable devient quasiment un outil incontournable permettant le contrôle simultané de la monture, le focuser, la caméra CCD, la régulation de température de la CCD, la webcam, la longue pose de la webcam, etc...).
Ce projet est structuré autour d'un ARM7 de chez NXP (LPC2148). Depuis quelques jours, je travaille sur une partie communication en 1-wire permettant le contrôle de différentes températures à l'aide de sondes DS18S20. Seulement voilà... ça ne veut pas vraiment, et c'est là que j'aurais besoin de votre aide.
Pour l'instant, le DS18S20 répond bien au reset... mais rien de plus, quand je veux relire, j'ai 0xFF dans chaque registre. Comme c'est la première fois que je fais du 1-wire, je suis un peu bloqué.
Quelqu'un saurait-il m'aider?
Voici les différentes fonction :
Fonction Reset :
Code : Tout sélectionner
int reset1wire(void)
{
int status;
// configurer P0.28 en sortie
IODIR0 |= 0x10000000;
// P0.28 = 0
IOCLR0 = 0x10000000;
// tempo 480us
delay(480);
// configurer P0.28 en entrée
IODIR0 &= 0xEFFFFFFF;
// tempo 70us
delay(70);
// lecture
if(!(IOPIN0 & 0x10000000))status = 1;
else status = 0;
IODIR0 |= 0x10000000;
delay(410);
return status;
}
Code : Tout sélectionner
void send1wirebit(char bit)
{
if(bit)
{
// configurer P0.28 en sortie
IODIR0 |= 0x10000000;
// P0.28 = 1
IOSET0 = 0x10000000;
// attente 6us
delay(6);
// configurer P0.28 en entrée
IODIR0 &= 0xEFFFFFFF;
// attente 64us
delay(64);
}
else
{
// configurer P0.28 en sortie
IODIR0 |= 0x10000000;
// P0.28 = 0
IOCLR0 = 0x10000000;
// attente 60us
delay(60);
// configurer P0.28 en entrée
IODIR0 &= 0xEFFFFFFF;
// attente 10us
delay(10);
}
}
Code : Tout sélectionner
void send1wire(char data)
{
char i;
// boucle envoi
for(i=0;i<8;i++)
{
// envoi bit
send1wirebit(data & 0x01);
// décalage de 1 à droite
data >>= 1;
}
}
Code : Tout sélectionner
char read1wirebit(void)
{
char result = 0x00;
// configurer P0.28 en sortie
IODIR0 |= 0x10000000;
// P0.28 = 0
IOCLR0 = 0x10000000;
// attente 6us
delay(6);
// configurer P0.28 en entrée
IODIR0 &= 0xEFFFFFFF;
// attente 9us
delay(9);
// lecture
result = ((IOPIN0 & 0x10000000)>>28);
// attente 55us (pour compléter le time slot)
delay(55);
// renvoi résultat lecture
return result;
}
Code : Tout sélectionner
char read1wire(void)
{
int i;
char result = 0x00;
for(i=0;i<8;i++)
{
result >>= 1;
if(read1wirebit())result |= 0x80;
}
return result;
}
Code : Tout sélectionner
int readtemperature(void)
{
char templow, temphigh, th, tl, res1, res2, countremain, countperc, crc;
if(!reset1wire())return 0;
else
{
// Skip ROM
send1wire(0xCC);
// Convert T
send1wire(0x44);
// attente conversion (750ms!)
while(read1wire()!=0xFF);
// reset
if(!reset1wire())return 0;
else
{
// Skip ROM
send1wire(0xCC);
// Read Scratchpad
send1wire(0xBE);
// Read byte 1
templow = read1wire();
// Read byte 2
temphigh = read1wire();
// Read byte 3
th = read1wire();
// Read byte 4
tl = read1wire();
// Read byte 5
res1 = read1wire();
// Read byte 6
res2 = read1wire();
// Read byte 7
countremain = read1wire();
// Read byte 8
countperc = read1wire();
// Read byte 9
crc = read1wire();
// Write results
putstr("templow = ");puthex(templow);putstr("\n");
putstr("temphigh = ");puthex(temphigh);putstr("\n");
putstr("th = ");puthex(th);putstr("\n");
putstr("tl = ");puthex(tl);putstr("\n");
putstr("res1 = ");puthex(res1);putstr("\n");
putstr("res2 = ");puthex(res2);putstr("\n");
putstr("countremain = ");puthex(countremain);putstr("\n");
putstr("countperc = ");puthex(countperc);putstr("\n");
putstr("crc = ");puthex(crc);putstr("\n");
return 1;
}
}
}
Merci d'avance pour vos réponses

A+
Gilles