Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DS1820 i pic16f877a za zl2pic

razex 27 Maj 2010 18:22 1387 2
  • #1 27 Maj 2010 18:22
    razex
    Poziom 9  

    Mam problem z odczytem temperatury z czujnika.
    Wlasciwie to nie bardzo wiem jak to zrealizowac, teoretycznie rozumiem co ma byc zrobione ale nie wiem jak.
    Srodowisko MPlab kompilator hi-tech, zadne inne nie wchodzi w gre.
    czujnik + przekaznik mam na jednej linii podlaczony do portu C
    czujnik do RC7, przekaznik do RC5

    mam taki oto skrypt do ubslugi

    Cytat:

    void temp_init(void)
    {
    for (sensor=6; sensor<MAX_SENSORS; sensor++)
    {
    _1w_init(sensor);
    _1w_out_byte(0xcc, sensor); // skip ROM

    _1w_out_byte(0x44, sensor); // perform temperature conversion
    _1w_strong_pull_up(sensor);

    _1w_init(sensor);
    _1w_out_byte(0xcc, sensor); // skip ROM

    _1w_out_byte(0xbe, sensor); // read the result

    for (n=0; n<9; n++)
    {
    buff[n]=_1w_in_byte(sensor);
    }
    czas();
    }
    }

    // The following are standard 1-Wire routines.
    void _1w_init(int sensor)
    {
    _1w_pin_hi(sensor);
    _1w_pin_low(sensor);

    DELAY_US(50);

    _1w_pin_hi(sensor);
    DELAY_US(50);
    }

    int _1w_in_byte(int sensor)
    {
    int n, i_byte, temp, mask;
    mask = 0xff & (~(0x01<<sensor));
    for (n=0; n<8; n++)
    {
    PORTC=0x00;
    TRISC=mask;
    TRISC=0xff;
    #asm
    CLRWDT
    NOP
    NOP
    #endasm
    temp=PORTC;
    if (temp & ~mask)
    {
    i_byte=(i_byte>>1) | 0x80; // least sig bit first
    }
    else
    {
    i_byte=i_byte >> 1;
    }
    DELAY_US(6);
    }
    return(i_byte);
    }

    void _1w_out_byte(int d, int sensor)
    {
    int n, mask;
    mask = 0xff & (~(0x01<<sensor));
    for(n=0; n<8; n++)
    {
    if (d&0x01)
    {
    PORTC=0;
    TRISC=mask; // momentary low
    TRISC=0xff;
    DELAY_US(6);
    }

    else
    {
    PORTC=0;
    TRISC=mask;
    DELAY_US(6);
    TRISC=0xff;
    }
    d=d>>1;
    }
    }

    void _1w_pin_hi(int sensor)
    {
    TRISC = 0xff;
    }

    void _1w_pin_low(int sensor)
    {
    PORTC = 0x00;
    TRISC = 0xff & (~(0x01 << sensor));
    }

    void _1w_strong_pull_up(int sensor) // bring DQ to strong +5VDC
    {
    PORTC = 0x01 << sensor;
    TRISC = 0xff & (~(0x01 << sensor));
    DELAY_US(250);
    TRISC = 0xff;
    }


    zmienna buff niczego nie wyswietla na ekranie.

    byc moze problem jest z inicjacja portu bo ustawianie rc5=1 nie zalacza przekaznika :(





    ewentualnie mam ejszcze taki kod programu ale nie wiem w jaki sposob napisac funkcie ow_reset,read,write by dzialaly na hi-techu, wszystkie znalezione materialy nie sa kompatybilne

    Cytat:
    void odczyt_temepratury(unsigned int temp2write)
    {
    const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
    char temp_whole;
    unsigned int temp_fraction;


    // check if temperature is negative
    if (temp2write & 0x8000)
    {
    text[0] = '-';
    temp2write = ~temp2write + 1;
    }

    // extract temp_whole
    temp_whole = temp2write >> RES_SHIFT ;

    // convert temp_whole to characters
    if (temp_whole/100)
    text[0] = temp_whole/100 + 48;

    text[1] = (temp_whole/10)%10 + 48; // extract tens digit
    text[2] = temp_whole%10 + 48; // extract ones digit

    // extract temp_fraction and convert it to unsigned int
    temp_fraction = temp2write << (4-RES_SHIFT);
    temp_fraction &= 0x000F;
    temp_fraction *= 625;

    // convert temp_fraction to characters
    text[4] = temp_fraction/1000 + 48; // extract thousands digit
    text[5] = (temp_fraction/100)%10 + 48; // extract hundreds digit
    text[6] = (temp_fraction/10)%10 + 48; // extract tens digit
    text[7] = temp_fraction%10 + 48; // extract ones digit

    }

    void temp_init(void){

    Ow_Reset(&PORTC,7); // Onewire reset signal
    Ow_Write(&PORTC,7,0xCC); // Issue command SKIP_ROM
    Ow_Write(&PORTC,7,0x44); // Issue command CONVERT_T
    DELAY_MS(750);

    Ow_Reset(&PORTC,7);
    Ow_Write(&PORTC,7,0xCC); // Issue command SKIP_ROM
    Ow_Write(&PORTC,7,0xBE); // Issue command READ_SCRATCHPAD

    temp = Ow_Read(&PORTC,2);
    temp = (Ow_Read(&PORTC,2) << 8) + temp;


    }

    0 2
  • #2 27 Maj 2010 19:41
    utak3r
    Poziom 25  

    Po pierwsze - pokaż no inicjalizację kontrolera.
    A po drugie - po wysłaniu komendy "przelicz temperaturę", należy dać mu czas nas wykonanie tego - a Ty natychmiast odczytujesz wynik. To tak nie działa...

    0
  • #3 27 Maj 2010 19:52
    razex
    Poziom 9  

    daje tylko tak TRISC = 0b10000000;
    reszta ustawien jest od lcd klawiatury itd ale tamto dziala ok :)

    0