P

PIC16F877 VE DS 18B20 ile Termometre - Çözemiyorum Sorunu

Başlatan phil, 20 Şubat 2014, 14:00:17

phil

Arkadaşlar merhaba.

Ete hocama özel mesaj attım az önce konuyu. Sorun olmazsa buraya da yazmak istiyorum. Eğer çözebilirsek diye. Teşekkür ederim. Başlık açma formatını bilmediğimden, yanlışlık yaptıysam kusura bakmayın. Yardım ederseniz sevinirim çok.

-----

http://320volt.com/pic-16f877-ds-18b20-lcd-dijital-termometre/

Bu sitedeki projeyi yapmak istiyordum. Ama isteğim 21,5 dereceden sonra rc0'dan 5v almaktı. Buradan indirdiğim c ve hex kodu idi. Hex kodunu, isis'te pic'e atınca çalıştı. Ama c kodunu derleyemedim.

Araştırmalarım neticesinde:

Lcd_Init(&PORTB);
  Lcd_Cmd(Lcd_CURSOR_OFF);

satırlarını

Lcd_Init();
  Lcd_Cmd(_Lcd_CURSOR_OFF);

haline getirdim.

Sonra error vermedi ama derlemedi de. LCD'nin pinlerini tanımlamam gerektiğini öğrendim.

http://www.mikroe.com/app/webroot/forum/viewtopic.php?f=88&t=48270#p186784 Buradaki yazı neticesinde, pinleri, kendi şemama göre tanımladım.

Ama hocam yine de;

Sorunlar şunlar: (Yardım ederseniz çok sevinirim. Çözemedim günlerdir, önemli bir proje okulum için. Benzer sorun ile ilgili burada yazdıklarınızı da uygulayamadım, simülasyon olduğundan hocam http://www.elektrotekno.com/archive/o_t__t_37809__start_10__index.html )

LCD sürekli Sıcaklık: -1,93 gösteriyor.

RC0 ucu hep aktif.

Isis simülasyonda verilen uyarı mesajı şu:

http://i57.tinypic.com/kedgdl.png

Ne yapmam lazım?


Kodum şöyle, tekrar belirtmem gerekirse (mikroC ile derliyorum). Asıl yapmak istediğim 21,5 dereceden fazla olduğunda rc0'ın aktif olmasını sağlamak ve tabi ki derecenin lcd'de doğru gösterilmesi.

------------------------

// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
// Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
//  18S20: 9
//  18B20: 12 (default setting; can be 9,10,11,or 12)
const unsigned short TEMP_RESOLUTION = 12;

const int RES_FACTOR_1[4] = {5000, 2500, 1250, 625};
const unsigned int RES_FACTOR_2[4] = {0x0001, 0x0003, 0x0007, 0x000F};
const unsigned int RES_FACTOR_3[4] = {0x8000, 0xC000, 0xE000, 0xF000};
float alarma;
unsigned temp,temp2,new_temp;
unsigned short  j, RES_SHIFT,j2;

void Display_Temperature(unsigned int temp) {
  const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
  unsigned int temp_whole, temp_fraction;
  unsigned short i;
  char text[8];

  // Isolate the fraction and make it a 4-digit decimal integer (for display)
  temp_fraction = temp & RES_FACTOR_2[RES_SHIFT - 1];
  temp_fraction = temp_fraction * RES_FACTOR_1[RES_SHIFT - 1];
  //portc = temp_fraction;
  // Handle the whole part of temperature value
  temp_whole = temp;

  // Is temperature negative?
  if ((temp_whole & 0x8000) != 0u) i = 1;  // Yes, i = 1
  else i = 0;                              // No,  i = 0
//  PORTC = i;
  // Remove the fractional part
  temp_whole >>= RES_SHIFT;

  // Correct the sign if necessary
  if (i) temp_whole |= RES_FACTOR_3[RES_SHIFT - 1];

  //portd = temp_whole;
  IntToStr(temp_whole, text);  // Convert whole part to string
  Lcd_Out(2, 6, text);         // Print whole part on LCD
  Lcd_Chr_Cp('.');             // Print dot to separate fractional part


  IntToStr(temp_fraction, text); // Convert fractional part to string

  // Add leading zeroes (we display 4 digits fractional part)
  if (temp_fraction < 1000u) Lcd_Chr_Cp('0');
  if (temp_fraction < 100u)  Lcd_Chr_Cp('0');
  if (temp_fraction < 10u)   Lcd_Chr_Cp('0');

  Lcd_Out_Cp(text);            // Print fractional part on LCD

  Lcd_Chr_Cp(223);             // Print degree character
  Lcd_Chr_Cp('C');             // Print 'C' for Centigrades
}//~

void main() {
  ADCON1 = 0xFF;               // Configure RA5 pin as digital I/O
  PORTE  = 0xFF;
  TRISE  = 0x0F;               // PORTE is input
  PORTB  = 0;
  TRISB  = 0;               // PORTB is output
  TRISD=0;
  PORTD=0;
  TRISC=0;
  PORTC=0;

  // Initialize LCD on PORTB and prepare for output
  Lcd_Init();
  Lcd_Cmd(_Lcd_CURSOR_OFF);
  Lcd_Out(1, 1, "Sicaklik:   ");

  do { // main loop

    Ow_Reset(&PORTE,2);        // Onewire reset signal
    Ow_Write(&PORTE,2,0xCC);   // Issue command SKIP_ROM
    Ow_Write(&PORTE,2,0x44);   // Issue command CONVERT_T
    Delay_us(120);

    Ow_Reset(&PORTE,2);
    Ow_Write(&PORTE,2,0xCC);   // Issue command SKIP_ROM
    Ow_Write(&PORTE,2,0xBE);   // Issue command READ_SCRATCHPAD
    Delay_ms(400);

    j = Ow_Read(&PORTE,2);     // Get temperature LSB
    j2=j;
    temp = Ow_Read(&PORTE,2);  // Get temperature MSB
    temp2=temp;
    temp <<= 8; temp += j;     // Form the result
    temp2<<=5;
    j2>>=3;
    new_temp=temp2^j2;
    portd=new_temp;
  //   alarma=39;
    alarma=((new_temp*127.5)/255);
    if(((alarma>=36.5)))  {    //YESİL LED AKTIF
  PORTC.F0=1;
   }

    else  {
    portc.f0=0;}

    Display_Temperature(temp); // Format and display result on LCD
    Delay_ms(500);

  } while (1);

}//~!

phil

Sizce LCD'de -1,93 çıkması sorununu nasıl çözerim?

Burayı okudum ama çözüm yok gibi http://www.picproje.org/index.php?topic=50207.0

Hattuşa

usta burda C bilen sayısı az sanırım, basic türevi olsa yardım edebilirdik ama bilenler bir cevap yazacaktır elbet

phil

Teşekkür ederim arkadaşım.

Ben de bir yandan araştırıp, deneyip bir yandan da umutla bekliyorum belki çözüm bulunur diye :)

levent61

kardes foruma yenı uye oldum ınsallah sorununu cozmussunudur ama benım dıkkatımı bı kac sey cektı.programın ortalarında (nasıl gosterecegımı bılmıorum ama dıkkat edersen bulursun) ıf temperature negatıve bolumu var burda sıcaklıgın negatıf olup olmadıgını ıncelıyor program ve ona gore c portuna 1 yanı 5v veya 0volt gonderıyor ve ona gore yazının basına shıft yapıp ısaret koyuyor .fakat senın attıgın proteus sımılasyonunun resmını actıgımda c0 portunun pozıtf oldugunu gordum buyuk ıhtımalle sorun burdan kaynaklanıyor .saygıla.

Powered by EzPortal