logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

DS18B20 1-Wire – czy poprawnie odczytuję dane z czujnika o konkretnym ID?

Fantomen 01 Lis 2007 20:04 2452 5
REKLAMA
  • #1 4437625
    Fantomen
    Poziom 20  
    Posty: 482
    Pomógł: 3
    Ocena: 19
    Chce odczytac dane z ds18b20 o danym ID. Czy to jest poprawna metoda?

    
    
             one_wire_reset();
             one_wire_send_command(SKIP_ROM,numer id); 
             one_wire_send_command(CONVERT_T,numer id); 
             
             one_wire_reset();
             one_wire_send_command(SKIP_ROM,numer id);
             one_wire_send_command(READ_SCRATCHPAD,numer id);
             tb1=one_wire_byte_read();
             tb2=one_wire_byte_read(); 
    
    
    


    one_wire_send_command wyglada tak:

    
    
    void one_wire_send_command(unsigned char command, unsigned char *ptr)
    {
       unsigned char byte_count = 8;
       one_wire_reset() ;
       if(ptr)
       {
          one_wire_byte_write(MATCH_ROM);
          do
          {
             one_wire_byte_write(*ptr) ;
             ptr++;
          } while(--byte_count);
       }
       else   
       one_wire_byte_write(SKIP_ROM);
       one_wire_byte_write(command);
       
    } 
    
    



    Szukalem na forum ale jest bardzo malo danych na ten temat w jezyku C. Chodzi mi tylko o poprawna kolejnosc funkcji dlatego nie podaje zawartosci wszystkich funkcji.
  • REKLAMA
  • Pomocny post
    #2 4438698
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Fantomen napisał:
    ...Chodzi mi tylko o poprawna kolejnosc funkcji dlatego nie podaje zawartosci wszystkich funkcji.

    Szkoda , że nie pokazałeś innych funkcji , bo ta którą pokazałeś(one_wire_send_command) jest do ... kitu :(
    Spójrz w dokumentację , a w dziale DS18B20 OPERATION EXAMPLE 1 i DS18B20 OPERATION EXAMPLE 2 masz tabelki , w których jasno stoi co i w jakiej kolejności wysyłać/odbierać do/z DS-a.

    Piotrek
  • REKLAMA
  • #3 4439653
    Fantomen
    Poziom 20  
    Posty: 482
    Pomógł: 3
    Ocena: 19
    Dzieki Zumek, znow sie spotykamy. Jakos przeoczylem ta tabelke. Smiga wszystko pieknie.
  • REKLAMA
  • #4 4562272
    czmi3l
    Poziom 14  
    Posty: 73
    Pomógł: 8
    Ocena: 4
    Witam, chciałem doczepić się do pytania :).
    Pierwszy raz w życiu pisze program do obsługi 1-wire.

    Komunikuje się z czujnikiem DS18B20, według schematu
    1. inicjalizacja
    2. skip rom
    3. mierz temp.

    Sprawdzałem i wiem, że czujnik przechodzi inicjalizacje. Tzn. dostałem od niego odpowiedz, że jest na linii (wystawił na linii stan niski).

    Do nóżki VCC podpiąłem zasilanie, wiem, że podczas pomiaru temperatury na nóżce danych czujnik powinien ustawić 0. I wlaśnie tutaj pojawia się problem... Po wysłaniu wszystkich komend sprawdzam, czy faktycznie czujnik wystawia 0, ale nic sie takiego nie dzieje :-(
    Oto kod mojego programu
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include "lcd.h"
    #define DS_0		 	DDRD|=1<<PD7;       //wyslij 0
    #define DS_1			DDRD&=~(1<<PD7);    //wyslij 1
    
    void DS_Write0(void){
    _delay_us(10);  	//czas pomiedzy danymi
    DS_0;			//sciagnij linie w dol
    _delay_us(110);  //zapisuje 0
    DS_1;			//koniec zapisu
    }
    
    void DS_Write1(void){
    _delay_us(10);	//czas pomiedzy danymi
    DS_0;			//uwaga nast. dana
    _delay_us(7);	//sciagniecie na 7us
    DS_1;			//zapisz 1
    _delay_us(70);
    }
    
    
    void DS_Reset(void){
    
    DS_0;
    _delay_ms(1);
    DS_1;
    _delay_ms(1);
    }
    
    void DS_SkipROM(void){  //11001100 CCh
    DS_Write0();
    DS_Write0();
    DS_Write1();
    DS_Write1();
    DS_Write0();
    DS_Write0();
    DS_Write1();
    DS_Write1();
    }
    
    void DS_ConvertT(void){  //44h 01000100
    DS_Write0();
    DS_Write0();
    DS_Write1();
    DS_Write0();
    DS_Write0();
    DS_Write0();
    DS_Write1();
    DS_Write0();
    while(PIND&0b10000000); //<- tutaj dochodzi prorgam i nigdy nie //wykrywa 0, czyli nigdy nie zaczyna przetwarzac.
    
    int main(){
    LCD_init();
    DS_Reset();
    DS_SkipROM;
    DS_ConvertT;
    LCD_WriteText("mierzy");
    
    for(;;);
    }
    

    Czy źle wysyłam rozkazy? W czym może być problem?
  • REKLAMA
  • #5 4563138
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    czmi3l napisał:
    ...Sprawdzałem i wiem, że czujnik przechodzi inicjalizacje...

    A gdzie to sprawdzasz , bo w załączonym kodzie nie widzę :?:
    czmi3l napisał:

    Do nóżki VCC podpiąłem zasilanie, wiem, że podczas pomiaru temperatury na nóżce danych czujnik powinien ustawić 0.

    No to musisz zweryfikować swoją wiedzę , bo czujnik tak sam z siebie , nie jest w stanie wystawić stanu niskiego(0) na magistrali.Zresztą w dokumentacji stoi , że jeśli czujnik jest w trakcie pomiaru , to Master Rx "0" , czyli master odczytuje bit o wartości 0.Może to wyglądać to mniej więcej tak:
    
    do {
    czekaj 1ms  //zeby nie "zmęczyć pytaniami" czujnika ;)
    //początek time slot-u
    1wire=0
    czekaj 2us
    1wire=1
    czekaj 10us
    zmienna=stan magistrali 1wire
    czekaj 52us
    //koniec time slot-u
    }while(!(zmienna))  //pozostań w pętli  doputy , dopuki zmienna==0 
    

    Co do Twojego kodu , to się nie wypowiadam - choć mnie język świerzbi ;)

    Piotrek
  • #6 4563240
    czmi3l
    Poziom 14  
    Posty: 73
    Pomógł: 8
    Ocena: 4
    Faktycznie nie zamieściłem jak sprawdziłem. Oto mój sposób

    
    void DS_Reset(void){
    DS_0;
    _delay_us(240);
    _delay_us(240);
    DS_1; 
    _delay_us(90);
    while(PIND&0b10000000);   //Jeżeli wyjdzie z pętli tzn był stan niski,
    _delay_us(240);
    _delay_us(240);
    }
    


    wiem, że kod nie jest wyszukany ;-P Chciałem za pierwszym razem rozpracować to łopatologicznie ;-).

    Ok, pale sie ze wstydu... :) Nie zrozumiałem co to znaczy Master czyta Rx=0
REKLAMA