Hirdetés

Új hozzászólás Aktív témák

  • zka67
    őstag

    Sziasztok!

    MPLAB X IDE v2.30-ben fejlesztek egy programot pic16f688-ra. DS1820-al szeretnék hőmérsékletet mérni. A program C-ben íródik. Találtam egy ilyen, már más által megvalósított kapcsolást és programot [link], de olyan parancsot használ (Ow_Reset, Ow_Read, Ow_Write), amit a fejlesztőkörnyezet nem ismer. Gondolom includeolni kéne egy header file-t, de itt elakadtam... Tudna valaki segíteni? Maga az includeolás az menne, azzal semmi probléma nincs, csak hogy mit honnan kell letölteni, hova kellene bemásolni, meg ilyenek.

    Előre is köszönöm!

    Szia, itt az általam használt modul. A gpio.h-t cseréld le a PIC io moduljára, és a gpio funkciókat is írd át a megfelelőkre, értelemszerűen (Ez a program a 2.5-ös portot használja, természetesen ez szabadon választható). A temp_delay értékeket át kell számolnod, hogy a megfelelő időzítéseket megkapd.

    Először olvasd ki az értket a chip-ből a temp_get()-tel, utána indítsd el a következő konverziót a temp_start_conv()-val, és a következő kiolvasásig várj 1mp-et. A program az alapértelmezett felbontást használja (12 bit), a konverzió ideje 750ms. Ezalatt csinálhatsz mást, sűrűbben kiolvasni nincs értelme és egyébként is hibás adatot kapnál.

    Remélem így már boldogulni fogsz :)

    #include "core/gpio/gpio.h"

    void temp_delay(int delay) {
    do { ; } while(--delay);
    }

    void DQ_LOW(void) {
    gpioSetDir(2, 5, gpioDirection_Output);
    gpioSetValue(2, 5, 0);
    }

    void DQ_HIGH(void) {
    gpioSetValue(2, 5, 1);
    gpioSetDir(2, 5, gpioDirection_Input);
    }

    uint32_t DQ(void) {
    return gpioGetValue(2, 5);
    }

    void temp_reset(void) {
    char presence = 1;
    while (presence) {
    DQ_LOW() ;
    temp_delay(9055); // 503us
    DQ_HIGH();
    temp_delay(1260); // 70us
    presence = DQ();
    temp_delay(7740); // 430us
    }
    }

    void temp_write_byte(uint8_t val) {
    uint32_t i;
    uint8_t temp;
    for (i=8; i>0; i--) {
    temp = val & 0x01;
    DQ_LOW();
    temp_delay(90); // 5us
    if (temp) DQ_HIGH();
    temp_delay(1134); // 63us
    DQ_HIGH();
    temp_delay(36); // 2us
    val = val >> 1;
    }
    }

    uint8_t temp_read_byte(void) {
    uint32_t i;
    uint8_t value = 0;
    for (i=8; i>0; i--) {
    value >>= 1;
    DQ_LOW();
    temp_delay(108); // 6us
    DQ_HIGH();
    temp_delay(72); // 4us
    if (DQ()) value |= 0x80;
    temp_delay(1134); // 63us
    }
    return(value);
    }

    void temp_start_conv(void) {
    DQ_HIGH();
    temp_reset();
    temp_write_byte(0XCC); // skip rom
    temp_write_byte(0X44); // start conversion
    }

    uint32_t temp_get(void) {
    uint32_t tlv, thv;
    temp_reset();
    temp_write_byte(0XCC); // skip rom
    temp_write_byte(0XBE); // read scratchpad
    tlv = temp_read_byte();
    thv = temp_read_byte();
    DQ_HIGH();
    return tlv | (thv << 8);
    }

Új hozzászólás Aktív témák