Go Down

Topic: Aide pour Sonde Temp + Hum (AM2305) base DS18D20 onewire (Read 1 time) previous topic - next topic

skywodd

Salut,


ça c'est pour etre au plus proche des 10µs ?

Si ça fait 10µs en vrai c'est vraiment un sacré coup de chance ...
L'optimisation du compilateur devrait complétement rasé les "i++" pour faire un seul "i += 70;"


en dur c'est la meilleure méthode de prog  en C ?

Pas vraiment ... pour faire un delai de 10µs la seul vrai solution sur AVR c'est :
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gab20bfffeacc678cb960944f5519c0c4f

Sinon en pure C c'est impossible d'avoir 10µs exactement, ça dépend du cpu, de la fréquence d'horloge et de plein d'autre facteurs.


ça revient a l'equivalent multiple du NOP en ASM  ?

Non ici c'est un post-incrémentation, pas un nop.

A F_CPU = 16MHz pour faire un delai de 10us il faut 16E6 * 10E-6 = 160 cycles cpu soit :
Code: [Select]
inline void delay_10us(void) {
    asm volatile(
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
    ::);
}
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Artouste



Si ça fait 10µs en vrai c'est vraiment un sacré coup de chance ...
L'optimisation du compilateur devrait complétement rasé les "i++" pour faire un seul "i += 70;"


bonjour
ok skywodd
merci pour les explications, j'ai une facheuse tendance à "ignorer/occulter" le rôle d'optimisation du compilo.

gef13

bonjour,

suite de mes recherches...

j'ai trouver un librairie DTH11 qui fait aussi temp+hum qui me parait très compatible avec AM2305 !!

j'ai maintenant une reconnaissance (a 1er vu) mais j'ai erreur de checksum !

j'ai modifié quelque valeur de temps dans librairie mais suis pas sur !
et je crois aussi qu'il faut bien formater les données...

j'ai mis la librairie d'origine DTH11 avec les modifs en commentaires pour ceux que ça intéresse ici: http://cjoint.com/?CAlqQavZ7dX

pas encore trouver mais j'y travaille...

pour info ci dessous le cpp
Code: [Select]
#include "dht11.h"

// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht11::read(int pin)
{
// BUFFER TO RECEIVE
uint8_t bits[5];
uint8_t cnt = 7; //*************ici j'ai un doute 7?? 16!
uint8_t idx = 0;

// EMPTY BUFFER
for (int i=0; i< 5; i++) bits[i] = 0;

// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(1); // pour am2305
//  ORIGINAL delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(30);// pour am2305
// ORIGINAL delayMicroseconds(40);
pinMode(pin, INPUT);

// ACKNOWLEDGE or TIMEOUT
unsigned int loopCnt = 10000;   // ***************************la je crois pas que soit bon !!
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

// READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
for (int i=0; i<40; i++)
{
loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

unsigned long t = micros();

loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
if (cnt == 0)   // next byte?
{
cnt = 7;    // restart at MSB
idx++;      // next byte!
}
else cnt--;
}

// WRITE TO RIGHT VARS
        // as bits[1] and bits[3] are allways zero they are omitted in formulas.
humidity    = bits[0];
temperature = bits[2];
//******************************************* ici je crois qui qui faut 5 bits!!
uint8_t sum = bits[0] + bits[2]; 

if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
return DHTLIB_OK;
}
//
// END OF FILE
//


voila pour l'instant...

suis preneurs de confirmation ou de conseils ....

a+
gf


Arduino leonard

Go Up