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

Pic16f876A[c] -> Pic16f886 problemy z DS18B20 po przesiad

24 Sie 2010 23:15 1663 2
  • Poziom 9  
    Program odczytujący temperaturę z ds18b20 został napisany pod mikroprocka pic16f876a, następnie program ten został przeniesiony na pic16f886.
    Procki te są pod względem obudowy i ustawień nóżek takie same.
    Wyprowadzenia więc zostały te same i nie działa komunikacja z ds18b20.
    Program pisany w MPLABie, poza zmianą pliku od procka, został również zmieniony rejestr odpowiadający za wyjścia portu A jako wyjścia cyfrowe ponieważ był on inny.
    Kwarc zewnętrzny 16MHz config ustawiony na 20F2, procek startuje i inna część kodu działa..
    init:

    Code:

    T0IE = 1;
    PSA=0;PS0=1;PS1=0;PS2=0;
    TMR1IF = 0;
    TMR1CS = 0;
    PEIE   = 1;
    TMR1IE = 1;
    T1CKPS1 = 0;
    T1CKPS0 = 0;
    T1OSCEN = 0;
    TMR1L = 0x19;
    TMR1H = 0x00;
    TMR1ON = 1;
    GIE = 1;
    TRISB = 0b00100000;
    TRISA = 0b00111100;
    TRISC = 0b00000000;
    ANSEL = 0b00000000;
    WPUB  = 0b00000000;


    co do komunikacji z DS'em to jakby w ogóle nie reagował na na wysyłane mu komunikaty, wcześniej z innym prockiem działało to.
    Sprawdzałem czasówki są dokładnie takie same jak przy picku-876a, według MPLAB sim są one idealne (robione na NOPach co prawda), ale 1us pokazuje 1us, nawet przy 480us jest to dokładnie 480us.
    Na oscyloskopie również przebiegi czasowe są zgodne i wysyłane zapytania o temperaturę jest..

    Czy są jeszcze jakieś rejestry które trzeba pozmieniać przy takiej przesiadce, bo już przewertowałem wszystkie rejestry specjalne picka 886 i nie znalazłem więcej zmian..

    Dlaczego coś takiego się dzieje, że program na jednym działa, a na drugim nie, mimo że zapytanie jest wysyłane, i to dokładnie to samo co na pierwszym procku na które odpowiada.

    Proszę o pomoc, bo utknąłem w czarnej ...

    Program zatrzymuje się w pętli na dole kodu czekając, aż ds odpowie, a on nie odpowiada.. :/

    kod odczytu temperatury wygląda następująco:
    Code:


    #define DQ       PORTB.5
    #define dirCpuDs    TRISB.5 = 0
    #define dirDsCpu    TRISB.5 = 1


    //Inicjalizacja 1-Wire
    #pragma codepage 1
    void Init_Ds()
    {
       jestDS18B20 = 0;                  //czy ds odpowiada czy nie
       dirCpuDs;                  
       DQ = 0;
       Delay600us;
       dirDsCpu;                  
       Delay70us;
       if(DQ == 0) jestDS18B20 = 1;         // Jeżeli urządzenie jest na linii zmienia stan zmiennej
       Delay480us;
    }   
    //------------------------
    //Zapis 1 na linię 1-Wire
    void Write0_Ds()
    {
       DQ = 0;
       Delay70us;Delay10us;Delay10us;
       DQ = 1;
    }

    //------------------------
    //Zapis 0 na linię 1-Wire
    void Write1_Ds()
    {
       DQ = 0;
       Delay3us;
       DQ = 1;
       Delay70us;
    }

    //------------------------
    //Wysłanie komendy do urządzenia 1-Wire
    void CommandDs(char Cm)
    {
       char c2c = 8;
       DQ = 1;
       dirCpuDs;
       
       do
          {
             if(Cm.0 == 1) Write1_Ds();
             if(Cm.0 == 0) Write0_Ds();
             Cm >>= 1;    
          }
       while(--c2c>0);
       
       dirDsCpu;   
    }   

    //------------------------
    //Odczyt bitu na linii 1-Wire
    void ReadBitDs()
    {
       fReadDS18B20 =1;
       dirCpuDs;
       DQ = 0;
       Delay5us;         
       dirDsCpu;
       if(DQ == 0) fReadDS18B20 = 0;
       Delay60us;
    }


    //------------------------
    //Odczyt bajtu z linii 1-Wire
    char ReadByteDs()
    {
       char c1c = 8;
       Result8 = 0;
       do
          {
             Result8 >>= 1;
             ReadBitDs();
             if(fReadDS18B20) Result8.7 = 1;   
          }
       while(--c1c>0);   
       
       return Result8;
    }   

    //------------------------
    //Inicjalizacja pomiaru temperatury z DS18b20
    void StartPomTemper()
    {
       Init_Ds();
       CommandDs(0xCC);
       CommandDs(0x44);
    }   


    //------------------------
    //Odczyt temperatury z DS18b20
    char Read2BytesRAM()
    {
       for(c1=0;c1<2;c1++) bufDs[c1] = 0;   
       Init_Ds();
       CommandDs(0xCC);
       CommandDs(0xBE);

       for(c1=0;c1<2;c1++)
       {
          ReadByteDs();
          bufDs[c1] = Result8;
       }
       Temperatura.high8 = bufDs[1];
       Temperatura.low8  = bufDs[0];
       Temperatura >>= 4;            // Usuwa części ułamkowe z odczytu temperatury
       Temperatura = Temperatura - 1;
       Temperatura = Temperatura - Offset;      // Uwzglednienie offsetu
       if(bufDs[0].3==1) {            // Korekcja temperatury, jeżeli 0.5 stopnia to zaokrągla w górę
       Temperatura = Temperatura + 1;
       }

       return 1;
    }
    //------------------------
    //Pomiar Temperatury
    void PomiarTemp()
    {
       StartPomTemper();
       Delay10us;
       if(jestDS18B20==0); //{LED = 0;}
       else
          {

                //------------------------
                // program zatrzymuje się w tej petli while
                //------------------------
             while(DQ == 0);
             Read2BytesRAM();
          }
    }
  • AM TechnologiesAM Technologies
  • Pomocny post
    Poziom 36  
    AVE...

    Załaduj poniższy plik do swojego PICa 16F886...
    Podłącz DS18B20 do pinu PORTB.5
    Podłącz pin PORTB.0 przez rezystor 470Ω do pinu 2 portu szeregowego, oraz masę układu do pinu 5 portu szeregowego. Odpal jakiś program terminalowy i skonfiguruj go do odbioru danych z portu szeregowego z baudrate=2400.
    Po włączeniu PICa najpierw otrzymasz numer seryjny czujnika, a potem wartość temperatury(bez konwersji na normalne jednostki) co jakieś półtorej sekundy...
  • Poziom 9  
    Dopiero teraz znalazłem czas, żeby dalej to ogarnąć.
    Układ już ruszył, błąd nie tkwił w DS'ie tylko picku, nie wiem co z nim było nie tak, ale wymieniłem na inny i działa.