DS18B20 detekce presence pulzu

Michal Grunt michal.grunt na vynet.cz
Čtvrtek Září 18 12:59:43 CEST 2014


Díky, už asi vím kde jsem dělal chybu. Hned mezi 2. a 3. řádkem. Na začátku reset pulzu by měla být kratší časová prodleva. Po otestování je 50us minumum, když nastavím méně už to nefunguje resp. funguje, ale mám tu inicializaci ve smyčce (s 1s pauzou), abych mohl různě testovat odpojování drátů od čidla a koukat co to bude dělat a první inicializace proběhne v pořádku (vrátí se 0), ale další už ne (vrátí 1). Pokud tam dám 50us prodlevu reaguje to v pořádku nejen na první spuštění inicializace, ale i na ty další.

Po otestování je i těch 50us také v některých případech málo (když jsem různě připojoval/odpojoval piny čidla), 100us už je jistota.

uint8_t init_1820()
{
       uint8_t i1, i2;

       DS18B20_PortOut();
       GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
       delay_us(100);             // nutne !!! min. 50us spis vice
       GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
       delay_us(500);             //min. 480us
       DS18B20_PortIn();
       delay_us(70);
       i1 = GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN);
       delay_us(400);
       i2 = GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN);
       DS18B20_PortOut();
       //xprintf("%d,%d\n", i1,i2);
       if ((i1 == 0) && (i2 == 1)) return 1; else return 0;
}

MG


From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Cizek Milan
Sent: Thursday, September 18, 2014 12:08 PM
To: HW-news
Subject: Re: DS18B20 detekce presence pulzu


Ahoj,



nevím jestli ti to k něčemu bude, ale funguje mi



DS_INIT  BANK1
   bcf  TRISB,0    ; DSWIRE jako výstup

   BANK0
   bsf  LED2    ; rozsvítit LED2
   clrf TMR0
   bsf  INTCON,T0IE   ; aktivovat TMR0

   bcf  DSWIRE    ; nastavíme Lo úroveň
   WAIT .500    ; >480us (reset pulse)
   bsf  DSWIRE    ; nastavíme Hi úroveň

   BANK1
   bsf  TRISB,0    ; DSWIRE jako vstup
   WAIT .70     ; zpoždění (15-60us)

   BANK0
   btfsc DSWIRE    ; zjistíme úroveň
   goto DS_MISSED

   ; máme Lo úroveň - něco nám odpovídá
   WAIT .400    ; >400us stále odpověď
   return

DS_MISSED ; máme Hi úroveň - sběrnice je mrtvá
   WAIT .400    ; >400us stále odpověď
   call SEND_NODS   ; odpověď: žádná čidla
   return

--
Milan Čížek

---------- Původní zpráva ----------
Od: Michal Grunt <michal.grunt na vynet.cz<mailto:michal.grunt na vynet.cz>>
Komu: HW-news (hw-list na list.hw.cz<mailto:hw-list na list.hw.cz>) <hw-list na list.hw.cz<mailto:hw-list na list.hw.cz>>
Datum: 18. 9. 2014 12:00:58
Předmět: DS18B20 detekce presence pulzu

Už jsem trochu bezradný. Nějak se mi nedaří detekovat presence pulz DS18B20... Když inicializaci DS18B20 nastavím natvrdo tak je to OK a čidlo funguje, ale potřebuji zdetekovat presence pulz jestli je čidlo připojeno, aby mi funkce pro čtení teploty nevyhazovala nějaký hausnumera.

uint8_t i1;

DS18B20_PortOut();
GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
delay_us(500); //min. 480us
DS18B20_PortIn();
while(GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN) != 1);
delay_us(150); //15us - 60us by měla být 1 a pro dalších 60us-240us 0 takže těch 150us by mělo zasahovat někam mezi 60-240...
i1 = GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN);
xprintf("%d\n", i1);

Pořád mi to vyhazuje 1, ale měla by se mi vrátit 0 i to while jsem si rozepsal... Kde dělám chybu?

MG

-----
void DS18B20_PortOut(void) {
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}

void DS18B20_PortIn(void) {
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
}
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz<http://www.HW.cz>
Hw-list na list.hw.cz<mailto:Hw-list na list.hw.cz>
http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20140918/ec4345cc/attachment.html>


Další informace o konferenci Hw-list