Fórum témák

» Több friss téma
Fórum » DS18B20 hőmérő-szenzor
 
Témaindító: Korben, idő: Nov 16, 2005
Témakörök:
Lapozás: OK   6 / 39
(#) doup válasza bbalazs_ hozzászólására (») Okt 30, 2011 /
 
Itt a kódrészletem
  1. /*Header******************************************************/
  2.  
  3. // LCD module connections
  4. sbit LCD_RS at RD4_bit;
  5. sbit LCD_EN at RD5_bit;
  6. sbit LCD_D4 at RD0_bit;
  7. sbit LCD_D5 at RD1_bit;
  8. sbit LCD_D6 at RD2_bit;
  9. sbit LCD_D7 at RD3_bit;
  10. sbit LCD_RS_Direction at TRISD4_bit;
  11. sbit LCD_EN_Direction at TRISD5_bit;
  12. sbit LCD_D4_Direction at TRISD0_bit;
  13. sbit LCD_D5_Direction at TRISD1_bit;
  14. sbit LCD_D6_Direction at TRISD2_bit;
  15. sbit LCD_D7_Direction at TRISD3_bit;
  16. // End LCD module connections
  17.  
  18. const unsigned short TEMP_RESOLUTION = 9;
  19. char *text = " 00.0";
  20. unsigned temp;
  21. int homerseklet = 0, i = 0;
  22. char felirat[]={' ','H','o','m','e','r','s','e','k','l','e','t'};
  23.  
  24. const char character[] = {7,5,7,0,0,0,0,0};
  25.  
  26. void CustomChar(char pos_row, char pos_char) {
  27.   char i;
  28.     Lcd_Cmd(64);
  29.     for (i = 0; i<=7; i++) Lcd_Chr_CP(character[i]);
  30.     Lcd_Cmd(_LCD_RETURN_HOME);
  31.     Lcd_Chr(pos_row, pos_char, 0);
  32. }
  33.  
  34. void Display_Temperature(unsigned int temp2write) {
  35.     const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  36.     char temp_whole;
  37.     unsigned int temp_fraction;
  38.  
  39.     // check if temperature is negative
  40.     if (temp2write & 0x8000) {
  41.         text[0] = '-';
  42.         temp2write = ~temp2write + 1;
  43.     }
  44.     // extract temp_whole
  45.     temp_whole = temp2write >> RES_SHIFT ;
  46.  
  47.     // convert temp_whole to characters
  48.     if (temp_whole/100)
  49.         text[0] = temp_whole/100 + 48;
  50.  
  51.     text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
  52.     text[2] = temp_whole%10 + 48;      // Extract ones digit
  53.  
  54.     // extract temp_fraction and convert it to unsigned int
  55.     temp_fraction = temp2write << (4-RES_SHIFT);
  56.     temp_fraction &= 0x000F;
  57.     temp_fraction *= 625;
  58.  
  59.     // convert temp_fraction to characters
  60.     text[4] = temp_fraction/1000 + 48;     // Extract thousands digit
  61.     // Display temperature on LCD
  62.     Lcd_Out(2, 5, text);
  63.     homerseklet = atoi(text);
  64.     if(homerseklet > 35)
  65.     {
  66.        PORTB.B6 = 1;
  67.     }
  68.     else
  69.        PORTB.B6 = 0;
  70. }
  71.  
  72. void InitMain() {
  73.   OSCCON = 0x71; // set int-osc 8 Mhz
  74.   while ((OSCCON & 0x4)!=0x4); // wait for clock stable
  75.   delay_ms (500);
  76. }
  77. void Move_Delay() {                  // Function used for text moving
  78.   Delay_ms(10);                     // You can change the moving speed here
  79. }
  80.  
  81. void main() {
  82.     InitMain();
  83.     INTCON = 0x00;
  84.     INTCON2 = 0x00;
  85.     INTCON3 = 0x00;
  86.     RCON = 0x00;
  87.     PIE1 = 0x00;
  88.     PIE2 = 0x00;
  89.     PIR1 = 0x00;
  90.     PIR2 = 0x00;
  91.     ADCON1 = 0x06;  //all to digital inputs
  92.     TRISA = 0x00;
  93.     TRISB = 0x00;
  94.     TRISC = 0x00;
  95.     TRISD = 0x00;
  96.     TRISE = 0x00;
  97.     PORTA = 0xFF;
  98.     PORTB = 0x00;
  99.     PORTC = 0x00;
  100.     PORTD = 0xFF;
  101.     PORTE = 0x00;
  102.     Lcd_Init();   // Initialize LCD
  103.     Lcd_Cmd(_LCD_CLEAR);      // Clear LCD
  104.     Lcd_Cmd(_LCD_CURSOR_OFF); // Turn the cursor off
  105.     //--- main loop
  106.     do {
  107.         //--- perform temperature reading
  108.               Ow_Reset(&PORTD, 7);       // Onewire reset signal
  109.               Ow_Write(&PORTD, 7, 0xCC); // Issue command SKIP_ROM
  110.               Ow_Write(&PORTD, 7, 0x44); // Issue command CONVERT_T
  111.               Delay_ms(750);
  112.               Ow_Reset(&PORTD, 7);
  113.               Ow_Write(&PORTD, 7, 0xCC); // Issue command SKIP_ROM
  114.               Ow_Write(&PORTD, 7, 0xBE); // Issue command READ_SCRATCHPAD
  115.               temp = Ow_Read(&PORTD, 7);
  116.               temp = (Ow_Read(&PORTD, 7) << 8) + temp;
  117.               Lcd_Chr(2,11, 'C');
  118.               CustomChar(2,10);
  119.               Display_Temperature(temp);
  120.               Delay_ms(200);
  121.     } while (1);
  122. }
(#) doup válasza bbalazs_ hozzászólására (») Okt 30, 2011 /
 
Találtam egy ilyet és nekem a -0.5 jelenik meg.

ds1820.png
    
(#) doup válasza doup hozzászólására (») Okt 30, 2011 /
 
Kivettem a szenzort működés közben és akkor is -0.5 fokot ír ki. A kapcsolási rajzon pedig a következő a ds1820 első lábát a földre húztam, a második lábát az rd7 re és ezt az adat lábat pedig plusz még felhúztam egy 1k ellenállással 5V-ra a harmadik lábát pedig 5v-ra. Tehát olyan mint ha nem is lenne hőszenzor.
(#) doup válasza doup hozzászólására (») Okt 30, 2011 /
 
Mondjuk a ds1820 adatlapjában 4,7k ellenállással van a tápra húzva az adatláb. Viszont van egy link amiben 1k ellenállást használnak. Lehet ez a baj?
http://www.mikroe.com/eng/chapters/view/17/chapter-4-examples/#c4v14
(#) vicsys válasza doup hozzászólására (») Okt 30, 2011 /
 
1K-ig akkor szoktak lemenni, ha nagyon hosszú a vezeték és zajos. 2k2...4k7 -ig szoktam használni a felhúzót.
Az adatvonal írása után iktass be 2...6us-nyi szünetet, próbaképpen.
(#) bbalazs_ válasza doup hozzászólására (») Okt 30, 2011 /
 
Az az ow_write nevu rutin hol van?
Szoval en pont az idozito reszt nem talalom ebben, ami szerintem a kulcsa.

Abban idoziteni ugyis hulyeseg, hogyha nem tudod, mit fordit a fordito. Az ASM-hez nem ertesz?
Itt nem ms-os kesleltetesek vannak am...

Az, hogy a tobbi dologgal eltertel, csak fokozza a hibak valoszinuseget.
(#) doup válasza bbalazs_ hozzászólására (») Okt 30, 2011 /
 
De ez a forráskód működik 16f818-al. Az asm-hez nem értek csak a C-hez valamennyire.
(#) doup hozzászólása Okt 30, 2011 /
 
Egyébként nem lehet hogy a configurációs biteknél rontok el valamiit?
(#) bbalazs_ válasza doup hozzászólására (») Okt 30, 2011 /
 
Akkor csak az idozites lesz a gond.
Probald ezt is 4MHz-en futtatni.
Az is belso oszcis volt? Mert ha kvarcos, akkor itt is pont annyi kell.

De ha nem tudod, mit is csinalsz, akkor kinszenvedes lesz a tovabbi modositas.

Abbol, hogy a szenzort kiveve sem ad ertelmes jelet, lathatod, hogy a kommunikacioval lesz valami.
A masiknal minden ugyanaz volt, mint itt?

Persze, a config bit is lehet. Ellenorizd az azonos funkcioju biteket a ket adatlap alapjan. Nncs sok...
(#) doup válasza bbalazs_ hozzászólására (») Okt 30, 2011 /
 
Az is belső oszcis volt. Minden ugyan az volt mint itt.
(#) bbalazs_ válasza doup hozzászólására (») Okt 30, 2011 /
 
Jo, akkor felezd meg a frekit, hogy itt is 4 legyen.
(#) doup válasza bbalazs_ hozzászólására (») Okt 30, 2011 /
 
void InitMain() {
OSCCON = 0x60; // set int-osc 4 Mhz
while ((OSCCON & 0x4)!=0x4); // wait for clock stable
delay_ms (500);
}

Így megfeleztem. De sajna így sem megy. Egyre jobban nem értem pedig minden ugyan az. A config bitekkel lesz valami. Vagy most már fogalmam sincs.
(#) bbalazs_ válasza doup hozzászólására (») Okt 31, 2011 /
 
Van-e esetleg megszakitas benne? Mert az oda tud csapni az idoziteseknek a foprogramban.

Egyaltalan eljut a programod a beolvasasig? (pontosabban a masodik beolvasasig)?

De meg egyszer mondom, ha nem erted, mit csinalsz, akkor csak sotetben tapogatozol. Nem netes kodreszleteket kellene bemasolnod, hanem megerteni, hogy melyik bit miert all ugy, ahogy.

Esetleg prbald meg attenni valamelyik portB bitre, mondjuk B2-re...
(#) bbalazs_ válasza doup hozzászólására (») Okt 31, 2011 /
 
Az osccon regiszternel pl szerintem az utolso elotti bit 1 legyen. Nem tudom, az elozoleg hasznalt pic-nel ott lehetett-e allitani valamit.

nalam, ami mukodik, ott B'11100010'-ra van allitva az OSCCON.

Aztan nem tudom a a watchdog timert bekapcsolva hagytad-e pl.
(#) doup válasza bbalazs_ hozzászólására (») Okt 31, 2011 /
 
Kikapcsoltam a watchdog timert.
(#) bbalazs_ válasza doup hozzászólására (») Okt 31, 2011 /
 
Es a tobbi felvetesre esetleg valami?
Igy kicsit nehez lesz beszelgetni.
Szandekosan csinalod?
(#) doup válasza bbalazs_ hozzászólására (») Okt 31, 2011 /
 
Én hexában adom meg az előzőnél OSCCON = 0x60; ez volt beállítva. Megszakítás a programomban abszolút nincs szerintem. De ugyan azt a programot raktam bele a 18f4550-be csak a portokat állítottam át mint a 16f818-ba. A configurációs biteket pedig a csatolt fájlban látod.
(#) bbalazs_ válasza doup hozzászólására (») Okt 31, 2011 /
 
Mondd, tenyleg nem akarod megerteni?
AZ EGY MASIK PIC VOLT!!!!!!!!! Regebbi sorozat, masik szamu is.
Ha elozoleg automata, benzines kocsid volt. akkor nem fogod erteni, hogy ennek a dizelesnek meg valtoja van es a benzin tonkreteszi???
Hanem hajtogatod, de az elozot igy kellett vezetni es ezzel tankoltam???

Probald ki, amiket irtam.
Szamold at a binarist hexaba.

Assembly betetet tudsz hasznalni a programodban?
(#) doup válasza af27 hozzászólására (») Nov 1, 2011 /
 
Szia, én is ezzel a pic és szenzor kombinációval bírkózok de sajna nekem sem megy. Te jutottál már valamire vele?
(#) doup válasza bbalazs_ hozzászólására (») Nov 1, 2011 /
 
Köszönöm fáradalmadat sikerült megoldani a problémát.
(#) bbalazs_ válasza doup hozzászólására (») Nov 1, 2011 /
 
De leirhatnad - ha mar ennyit kuzdottunk vele -, hogy hogyan, mi volt a gond.
(#) doup válasza bbalazs_ hozzászólására (») Nov 1, 2011 /
 
A configurációs bitek beállításával volt a gond. Mellékletben csatoltam hogy mivel működik.
(#) Pepebá válasza doup hozzászólására (») Nov 1, 2011 /
 
Hali
A C nyelvű forráskódot is megosztanád velünk? én is küzdöttem már vele, csak sikerélmény hiányában félretettem. Vagy a fenti az változatlan?
Üdv.
(#) doup válasza Pepebá hozzászólására (») Nov 1, 2011 /
 
C forráskód a következő!

  1. // LCD module connections
  2. sbit LCD_RS at LATB0_bit;  // for writing to output pin always use latch (PIC18 family)
  3. sbit LCD_EN at LATB1_bit;  // for writing to output pin always use latch (PIC18 family)
  4. sbit LCD_D4 at LATB2_bit;  // for writing to output pin always use latch (PIC18 family)
  5. sbit LCD_D5 at LATB3_bit;  // for writing to output pin always use latch (PIC18 family)
  6. sbit LCD_D6 at LATB4_bit;  // for writing to output pin always use latch (PIC18 family)
  7. sbit LCD_D7 at LATB5_bit;  // for writing to output pin always use latch (PIC18 family)
  8.  
  9. sbit LCD_RS_Direction at TRISB0_bit;
  10. sbit LCD_EN_Direction at TRISB1_bit;
  11. sbit LCD_D4_Direction at TRISB2_bit;
  12. sbit LCD_D5_Direction at TRISB3_bit;
  13. sbit LCD_D6_Direction at TRISB4_bit;
  14. sbit LCD_D7_Direction at TRISB5_bit;
  15. // End LCD module connections
  16.  
  17. //  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
  18. //  18S20: 9  (default setting; can be 9,10,11,or 12)
  19. //  18B20: 12
  20. const unsigned short TEMP_RESOLUTION = 9;
  21.  
  22. char *text = "000.0000";
  23. unsigned temp;
  24.  
  25. void Display_Temperature(unsigned int temp2write) {
  26.   const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  27.   char temp_whole;
  28.   unsigned int temp_fraction;
  29.  
  30.   // check if temperature is negative
  31.   if (temp2write & 0x8000) {
  32.      text[0] = '-';
  33.      temp2write = ~temp2write + 1;
  34.      }
  35.  
  36.   // extract temp_whole
  37.   temp_whole = temp2write >> RES_SHIFT ;
  38.  
  39.   // convert temp_whole to characters
  40.   if (temp_whole/100)
  41.      text[0] = temp_whole/100  + 48;
  42.   else
  43.      text[0] = '0';
  44.  
  45.   text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  46.   text[2] =  temp_whole%10     + 48;             // Extract ones digit
  47.  
  48.   // extract temp_fraction and convert it to unsigned int
  49.   temp_fraction  = temp2write << (4-RES_SHIFT);
  50.   temp_fraction &= 0x000F;
  51.   temp_fraction *= 625;
  52.  
  53.   // convert temp_fraction to characters
  54.   text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  55.   text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  56.   text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  57.   text[7] =  temp_fraction%10      + 48;         // Extract ones digit
  58.  
  59.   // print temperature on LCD
  60.   Lcd_Out(2, 5, text);
  61. }
  62.  
  63. void main() {
  64.   ADCON1 |= 0x0F;                    // Configure AN pins as digital
  65.   CMCON  |= 7;                       // Disable comparators
  66.  
  67.   Lcd_Init();                        // Initialize LCD
  68.   Lcd_Cmd(_LCD_CLEAR);               // Clear LCD
  69.   Lcd_Cmd(_LCD_CURSOR_OFF);          // Turn cursor off
  70.   Lcd_Out(1, 1, " Temperature:   ");
  71.   // Print degree character, 'C' for Centigrades
  72.   Lcd_Chr(2,13,178);  // different LCD displays have different char code for degree
  73.                       // if you see greek alpha letter try typing 178 instead of 223
  74.  
  75.   Lcd_Chr(2,14,'C');
  76.  
  77.   //--- main loop
  78.   do {
  79.     //--- perform temperature reading
  80.     Ow_Reset(&PORTD, 0);                         // Onewire reset signal
  81.     Ow_Write(&PORTD, 0, 0xCC);                   // Issue command SKIP_ROM
  82.     Ow_Write(&PORTD, 0, 0x44);                   // Issue command CONVERT_T
  83.     Delay_ms(450);
  84.  
  85.     Ow_Reset(&PORTD, 0);
  86.     Ow_Write(&PORTD, 0, 0xCC);                   // Issue command SKIP_ROM
  87.     Ow_Write(&PORTD, 0, 0xBE);                   // Issue command READ_SCRATCHPAD
  88.  
  89.     temp =  Ow_Read(&PORTD, 0);
  90.     temp = (Ow_Read(&PORTD, 0) << 8) + temp;
  91.  
  92.     //--- Format and display result on Lcd
  93.     Display_Temperature(temp);
  94.  
  95.     Delay_ms(500);
  96.   } while (1);
  97. }


Ez 18f4550 és ds1820 szenzorral működik.
(#) doup válasza doup hozzászólására (») Nov 1, 2011 /
 
Bocsi ez a forrás a helyes!

  1. // LCD module connections
  2. sbit LCD_RS at LATB0_bit;  // for writing to output pin always use latch (PIC18 family)
  3. sbit LCD_EN at LATB1_bit;  // for writing to output pin always use latch (PIC18 family)
  4. sbit LCD_D4 at LATB2_bit;  // for writing to output pin always use latch (PIC18 family)
  5. sbit LCD_D5 at LATB3_bit;  // for writing to output pin always use latch (PIC18 family)
  6. sbit LCD_D6 at LATB4_bit;  // for writing to output pin always use latch (PIC18 family)
  7. sbit LCD_D7 at LATB5_bit;  // for writing to output pin always use latch (PIC18 family)
  8.  
  9. sbit LCD_RS_Direction at TRISB0_bit;
  10. sbit LCD_EN_Direction at TRISB1_bit;
  11. sbit LCD_D4_Direction at TRISB2_bit;
  12. sbit LCD_D5_Direction at TRISB3_bit;
  13. sbit LCD_D6_Direction at TRISB4_bit;
  14. sbit LCD_D7_Direction at TRISB5_bit;
  15. // End LCD module connections
  16.  
  17. //  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
  18. //  18S20: 9  (default setting; can be 9,10,11,or 12)
  19. //  18B20: 12
  20. const unsigned short TEMP_RESOLUTION = 9;
  21.  
  22. char *text = "000.0000";
  23. unsigned temp;
  24.  
  25. void Display_Temperature(unsigned int temp2write) {
  26.   const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  27.   char temp_whole;
  28.   unsigned int temp_fraction;
  29.  
  30.   // check if temperature is negative
  31.   if (temp2write & 0x8000) {
  32.      text[0] = '-';
  33.      temp2write = ~temp2write + 1;
  34.      }
  35.  
  36.   // extract temp_whole
  37.   temp_whole = temp2write >> RES_SHIFT ;
  38.  
  39.   // convert temp_whole to characters
  40.   if (temp_whole/100)
  41.      text[0] = temp_whole/100  + 48;
  42.   else
  43.      text[0] = '0';
  44.  
  45.   text[1] = (temp_whole/10)%10 + 48;             // Extract tens digit
  46.   text[2] =  temp_whole%10     + 48;             // Extract ones digit
  47.  
  48.   // extract temp_fraction and convert it to unsigned int
  49.   temp_fraction  = temp2write << (4-RES_SHIFT);
  50.   temp_fraction &= 0x000F;
  51.   temp_fraction *= 625;
  52.  
  53.   // convert temp_fraction to characters
  54.   text[4] =  temp_fraction/1000    + 48;         // Extract thousands digit
  55.   text[5] = (temp_fraction/100)%10 + 48;         // Extract hundreds digit
  56.   text[6] = (temp_fraction/10)%10  + 48;         // Extract tens digit
  57.   text[7] =  temp_fraction%10      + 48;         // Extract ones digit
  58.  
  59.   // print temperature on LCD
  60.   Lcd_Out(2, 5, text);
  61. }
  62.  
  63. void InitMain() {
  64.   OSCCON = 0x71; // set int-osc 4 Mhz
  65.   while ((OSCCON & 0x4)!=0x4); // wait for clock stable
  66.   delay_ms (500);
  67. }
  68.  
  69. void main() {
  70.   InitMain();
  71.   ADCON1 |= 0x0F;                    // Configure AN pins as digital
  72.   CMCON  |= 7;                       // Disable comparators
  73.  
  74.   Lcd_Init();                        // Initialize LCD
  75.   Lcd_Cmd(_LCD_CLEAR);               // Clear LCD
  76.   Lcd_Cmd(_LCD_CURSOR_OFF);          // Turn cursor off
  77.   Lcd_Out(1, 1, " Temperature:   ");
  78.   // Print degree character, 'C' for Centigrades
  79.   Lcd_Chr(2,13,178);  // different LCD displays have different char code for degree
  80.                       // if you see greek alpha letter try typing 178 instead of 223
  81.  
  82.   Lcd_Chr(2,14,'C');
  83.  
  84.   //--- main loop
  85.   do {
  86.     //--- perform temperature reading
  87.     Ow_Reset(&PORTD, 0);                         // Onewire reset signal
  88.     Ow_Write(&PORTD, 0, 0xCC);                   // Issue command SKIP_ROM
  89.     Ow_Write(&PORTD, 0, 0x44);                   // Issue command CONVERT_T
  90.     Delay_ms(900);
  91.  
  92.     Ow_Reset(&PORTD, 0);
  93.     Ow_Write(&PORTD, 0, 0xCC);                   // Issue command SKIP_ROM
  94.     Ow_Write(&PORTD, 0, 0xBE);                   // Issue command READ_SCRATCHPAD
  95.  
  96.     temp =  Ow_Read(&PORTD, 0);
  97.     temp = (Ow_Read(&PORTD, 0) << 8) + temp;
  98.  
  99.     //--- Format and display result on Lcd
  100.     Display_Temperature(temp);
  101.  
  102.     Delay_ms(500);
  103.   } while (1);
  104. }
(#) Pepebá válasza doup hozzászólására (») Nov 1, 2011 /
 
Hali!
Kösz, ez MicroC nem Mlab. Jó látom?
Üdv.
(#) doup válasza Pepebá hozzászólására (») Nov 1, 2011 /
 
Jól látod ez mikroc pro.
(#) zsoltee0001 hozzászólása Jan 5, 2012 /
 
Sziasztok

Csináltam egy gk-ba való külső hőmérőt ds18s20-al.
Most ki akarom egészíteni egy belső hőméréssel.
Ha egy adatvonalra teszem a két szenzort akkor csak úgy tudok rájuk hivatkozni, hogy először kiolvasom az azonosítójukat és ez alapján?
Ha jól tudom a "search rom" parancsal lehet egyszerre több eszköz azonosítóját is keresni, de akkor viszont a master eszköz honnan fogja tudni, hogy melyik melyik?
Üdv
(#) gthomas hozzászólása Jan 14, 2012 /
 
Sziasztok!

Én ds1821-el "high res" próbálkozok hetek óta. Tizedes pontossággal szeretnék hőmérsékletet mérni. Látszólag minden rendben van. De. Ha ha pl hűl a hőmérő, a következőket mutatja: 21,1 21,0 20,9 20,4 20,3 ... Tehát ,9 után mindig ,4 érték következik.

A kódot mikropascalban készítettem. Beillesztem ide. A kódban hőmérséklet*10 értéket állítom elő, mert majd rádión küldöm tovább. Arra gondolok, hogy a count_per_c és a count_remain kiolvasásánál lehet a gond, mert ezek az adatok 9 bitesek. A mikropascalos ow_read pedig csak 8 bitet olvas egyszerre. Ezért kétszer olvasok és a 2 byteból állítom össze az adatot. Szerintetek jó ez így, vagy mi lehet a baj?

  1. procedure meassure;
  2. var
  3.     tmp: word;
  4.     count_remain : word;
  5.     count_per_c :  word;
  6.     tiz: word;
  7.     temp:word;
  8.     elojel: integer;
  9. begin
  10.  
  11.      //--- perform temperature reading
  12.       Ow_Reset(PORTC, 1);                         // Onewire reset signal
  13.       Ow_Write(PORTC, 1, 0xEE);                   // Issue command CONVERT_T start
  14.  
  15.       tmp:=0;
  16.  
  17.       while tmp shr 7 <>1 do
  18.       begin
  19.       delay_us(100);
  20.       Ow_Reset(PORTC, 1);                         // Onewire reset signal
  21.       Ow_Write(PORTC, 1, 0xAC);                   // várakozás a konverzióra
  22.       tmp :=  Ow_Read(PORTC, 1);
  23.       end;
  24.  
  25.  
  26.       //Delay_us(520);          //750 volt
  27.  
  28.       Ow_Reset(PORTC, 1);
  29.       Ow_Write(PORTC, 1, 0x22);                   // Issue command CONVERT_T stop
  30.      
  31.       delay_us(100);
  32.       Ow_Reset(PORTC, 1);
  33.       Ow_Write(PORTC, 1, 0xAA);                   // Issue command READ_SCRATCHPAD
  34.       delay_us(100);
  35.      
  36.       temp :=  Ow_Read(PORTC, 1);
  37.       temp := (Ow_Read(PORTC, 1) shl 8) + temp;
  38.  
  39.       //temp:= 231;
  40.  
  41.       elojel:=1;
  42.       if temp shr 7 = 1 then
  43.       begin
  44.            elojel:=-1;
  45.            temp:=temp or 65280;
  46.            temp:=(not temp) + 1;
  47.       end;
  48.  
  49. //-> tizedesek
  50.  
  51.       count_remain:=0;
  52.       count_per_c:=0;
  53.  
  54.       Ow_Reset(PORTC, 1);
  55.       delay_us(100);
  56.       Ow_Write(PORTC, 1, 0xA0);
  57.  
  58.  
  59.       count_remain :=Ow_Read(PORTC, 1);
  60.       count_remain := (count_remain shl 8) + Ow_Read(PORTC, 1);
  61.  
  62.       Ow_Reset(PORTC, 1);
  63.       delay_us(100);
  64.       Ow_Write(PORTC, 1, 0x41);
  65.       delay_us(300);
  66.       Ow_Write(PORTC, 1, 0xA0);
  67.       delay_us(100);
  68.  
  69.       count_per_c := Ow_Read(PORTC, 1);
  70.       delay_us(100);
  71.       //tmp:=Ow_Read(PORTC, 1);
  72.       count_per_c := Ow_Read(PORTC, 1);
  73.  
  74. //-> tizedesek
  75.  
  76.       ho:=(elojel*temp*10);
  77.  
  78.       ho:=ho+floor(((count_per_c-count_remain)*10)/count_per_c)-5;
  79.  
  80. end;
(#) Atielektro hozzászólása Jan 22, 2012 /
 
Sziasztok!

A minap egy DS18B20 beüzemelésével próbálkoztam és érdekes dologba futottam. A szenzort külső tápról járattam, felhúzásnak a gyári 4.7 kohm-ot használtam. A gond az az volt, hogy nem akart hőmérséklet konverziót végrehajtani. A skip rom és a read scratchpad működött, tehát a progi, amit írtam, az jó. Elkezdtem neten olvasgatni és valaki másnak is ilyesmi problémája volt, csak ő parazita tápos módban használta. Neki azt tanácsolták, hogy a felhúzó ellenállás túl nagy és emiatt nem kap elég áramot a szenzor, így nem tud konverziót végrehajtani. Gondoltam egy próbát megér és kicseréltem a 4.7 kohm-ot egy 1 kohm-ra és láss csodát, működött. A kérdésem az az lenne, hogy mi lehetett a gond? A kábeleim nem hosszabbak 2-3 cm-nél. A táp direktbe van bekötve, terhelhetősége 1 A, szóval elvileg van elég energia a rendes tápvonalon is. Nem érzékelhette a rendes tápvonalat? Bár ahogy az adatlapban néztem a táp felépítését eléggé faék jellegű. Összességében most működik, csak érdekel, hogy miért nem volt jó a gyári ajánlás.
Következő: »»   6 / 39
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem