abc016002e69 LCD yadım

Başlatan eemkozkan, 08 Mayıs 2011, 18:54:52

eemkozkan

Ds 18b20 kullanarak bir termometre yaptım. Hersey tamam derken LCD de resimdeki gibi kareler çıkmaya başladı. 20 Mhz kiristalden 4 MHz kadar  denedim düzelmedi. Sorun nerde aceba. Ne bağlantıyı değiştirdim nede programı . Resimden de anlaşılacağı gibi program falan sağlam led yanıyor yani. Birde bu LCD nin herhangi bir ayağına elimle dokunmadıkça görüntü gelmiyor. 2 tane aynı tip LCD var elimde ikisindede aynı sorun var.

[IMG]http://i52.tinypic.com/2hx3rdw.jpg[/img]

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

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, 5, 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, "Temperature:   ");

  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=37.125;
    alarma=((new_temp*127.5)/255);
    if(((alarma>=35.475)&&(alarma<=37.000)))  {    //YESİL LED AKTIF
  PORTC.F0=1;  }
    else  {
    PORTC.F0=0;
    }
    if(((alarma>=37.125)&& (alarma<=59.500))) {
    PORTC.F1=1;
   }

    else  {
    portc.F1=0;}
    if(((alarma<=35.375)))  {
    PORTC.F2=1;
    }
    else {
    PORTC.F2=0;
    }

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

  } while (1);

}

F.T

LCD  de bulunan kontrast ucu baglımı.pot varsa potu ayarlayın yada direk baglayın.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

eemkozkan

evet pot bağlı her şey normaldi birden bire bu hale geldi. tamemen kendiliğinden oldu.

The Gariban

Breadboardda  kompenentlerin bacaklarını  ve kabloları tekrar konrol edin (özellikle LCD ye giden kabloları)

eemkozkan

20 k ohmluk variable direnci kaldırıp araya 2.2 k lık direnç attım çalıştı. daha önce sıkıntısız çalışırken böyle olması ilginç tabi ama parmağımı LCD uzerinde herhangi bir bacağa dokundurmadıkça çalışmıyor devre bunun nedeni nedir aceba. Parmak ne görevi yapıyorda çalışıyor devre?

Tagli

Kontrast ile ilgisi yok. O karelerin çıkması LCD'ye komut gelmediğini gösteriyor. Yani başlangıçta gerekli reset işlemi de yapılmamış. Sorun kablolarda olabileceği gibi yazılımda da olabilir.

Hazır kütüphane kullanırken genelde LCD komutları arasındaki bekleme süresinin bir yerlerde tanımlanması gerekir. R/W bacağının kullanılmadığı durumlarda bu şarttır. Kodda bu tanımlamayı göremedim. Bununla ilgili bir sorun olabilir. Ayrıca, sonuç alana kadar denemelerini 4 MHz kristal ile yapmanı öneririm. PIC'in yavaş çalışması, yukarıda bahsettiğim bekleme süresi göz önünde bulundurulduğunda faydalı olabilir. Sonuç aldıktan sonra daha yüksek hızları denersin.
Gökçe Tağlıoğlu

Maxim

resimdeki devrede göremediklerim :

100nf hem lcd için hemde pic için yok (en büyük hata)
7805 sonrası kondansatör yok, 100uf gibi
osc uçlarında 22p kondansatör varmı ?
kısacası hiç kondansatör yok, olmaz öyle .

ayrıca "parmak" ile çalışması daha çok osilatör sıkıntısının göstergesi kristal sağlammı ?
birde mlcr girişi ne durumda ?

eemkozkan

Devrenin son hali bu mclr daki drenç kopuk çıktı onu farkedince düzeldi ama kapasitörlere neden gerek varki. güvenlik içinmi aceba. ayrıca ilgilenen tüm arkadaşlara ayrı ayrı çok teşekkürler.

[IMG]http://i55.tinypic.com/a2qemq.jpg[/img]

fahri-

Forumda, beslemedeki 100n kondansatör konularını araştırsan iyi edersin. ne kadar önemli ve gerekli olduğunu göreceksin.

Maxim

o dediğim tüm kondansatörleri takınız, onlar %100 şart olan şeyler.
sonra sizde "picler kitleniyor, picler yaramaz , piclerde sorun var" demeyin.

eemkozkan

Ben 9 voltluk pilden 7805'e bağlantı taptığım için her hangi bi dalgalanma olmaz diye düşündüğümden böyle saçma bi soru sormuş bulundum. kızmayın yaa :)