Keresés

Hirdetés

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

  • don_peter

    senior tag

    válasz fraba #5186 üzenetére

    Ezek olyan függvények amelyek nincsenek benne a fórosban.
    Gondolom egy külső fájlban írta meg és azt nem publikálta.
    Használd ezt a forrást: [link]
    Egyébként a DS1820-nak van adatlapja ott részletesen leírja miképpen kell vele kommunikálni.
    Honnan szereztél ilyen szenzort?
    Pont most akarok én is egy olyan projektet elkezdeni amihez ilyen szenzor fog kelleni.

    [ Szerkesztve ]

    ----== Neo Geo és Arcade Fórum : www.neo-geo.hu ==----

  • zka67

    őstag

    válasz fraba #5186 üzenetére

    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