Kare dalga (pulse) sayma (Grafik LCD)

Başlatan ozanyuksel89, 16 Aralık 2013, 13:46:06

ozanyuksel89

Arkadaslar; Pulse ları sayıp, belli bir sayıyla çarpıp, grafik Lcd de gösteren bir program yazmaya çalıştım. Program proteusta çalışıyor, ancak devreyi kurdugumda çalışmıyor. Bu gibi bir duruma ne sebep olabilir?
#include <16f877A.h>     


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=20000000)

#use fast_io(a) 

#include<HDM64GS12.c> 
#include<graphics.c> 
char ozan[16];
float pulse;
int sayi=0;



void print_lcd(){
        
        sprintf(ozan,"pulse: %2.2f l",pulse);
        glcd_text57(14,40,ozan,1,on);
        delay_ms(150) ;
        
        



}
  
#int_timer0  // Timer0 kesmesi

void  timer0_kesme ()   // Kesme fonksiyonu ismi
{   
        
        glcd_fillScreen(off); 
        delay_ms(50) ;
        sayi++;
        print_lcd();
       
   if (sayi==255)   
      sayi=0;

      set_timer0(254);
      pulse=sayi* 0.045;
      
}

/********* ANA PROG********/

void main ( )
{
   glcd_init(on);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x8); // RA4 pini giriş
   enable_interrupts(INT_timer0); 
   enable_interrupts(GLOBAL);     
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1); // Timer0 ayarlar
   set_timer0(254);   // TMR0 değeri



   while(1);  

 }

Kabil ATICI

İsisde düzgün çalışması sadece programın fonksiyonlarını düzgün yazdığını gösterir. Örneğin yazdığın program 4 MHz'de düzgün çalışır ama iş 20 MHz'e gelince cıvıtır. Çünkü isis bunlara bakmaz.

LCD'in başlaması için bir zaman tanıman gerekebilir.(işlemcinin başında bekleme veya gecikme eklemek gibi)

Yazdığın program LCD için örneğin 4MHz'de düzgün çalışır ama 20MHz'de LCD'e hızlı gelebilir. (LCD meşgul incelemesi gerekebilir)

Devren düzgün çalışıyor mu? Önce bunu bir led yak söndür ile dene..

Yazdığın program senin kullanabilir flash belleğini aşmış olabilir. Yapacağın iş için 18F serilerine geçmeni öneririm. (aynı bacak bağlantıları sahip olan pic'le var)
ambar7

ozanyuksel89

Tesekkür ederim. glcd_init(on) komutu sonrasına gecikme koydum ve 4 MHz kristal kullandım sorun çözüldü.

Kabil ATICI

Pic için Sigorta ayarlarında (20MHz gibi) yüksek hızlı kristal ayarı HS olması lazım diye hatırlıyorum.
ambar7

skara1214

Alıntı yapılan: ambar7 - 16 Aralık 2013, 17:14:16
Pic için Sigorta ayarlarında (20MHz gibi) yüksek hızlı kristal ayarı HS olması lazım diye hatırlıyorum.
evet hocam teşhisi dogru koymussunuz 
Herkes ölür ama herkes gerçekten yaşamaz

ozanyuksel89

 Tekrar Merhaba, bu sefer timer1 ile işlem yapmayı denedim. Ancak timer1 in external pulse girişi: RC0 pini, bu da grafik LCD nin RST ucuna bağlı ne yapmamı önerirsiniz?

Mucit23

Alıntı yapılan: ozanyuksel89 - 17 Aralık 2013, 10:17:22
Tekrar Merhaba, bu sefer timer1 ile işlem yapmayı denedim. Ancak timer1 in external pulse girişi: RC0 pini, bu da grafik LCD nin RST ucuna bağlı ne yapmamı önerirsiniz?

Sende RST yi başka pine taşı.

ozanyuksel89

      HDM64GS12.c dosyası içinden değişiklik yaparak farklı pin kullandım. Teşekkür ederim "Mucit23".  Şöyle bir sorum daha olacak: bir butona basılı tutulduğunda harici kaynaktaki pulse ları saymasını buton 0 konumundayken saymayarak, butona tekrar basılı tutulduğunda kaldığı yerden devam etmesini istiyorum, bunu nasıl yapabilirim? aşağıdaki kodda butona basılı olarak başlayınca sayıyor ve buton 0 olduğunda duruyor ancak tekrar buton aktifleştirildiğinde başlamıyor.

#include <16f877A.h>     


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=20000000)

#use fast_io(a) 

#include<HDM64GS12.c> 
#include<graphics.c> 
char ozan[16];
float pulse;
int sayi=0;



void print_lcd(){
        
        sprintf(ozan,"pulse: %2.2f l",pulse);
        glcd_text57(14,40,ozan,1,on);
        delay_ms(150) ;
        
        



}
  
#int_timer0  // Timer0 kesme

void  timer0_kesme ()   
{   
        
        glcd_fillScreen(off); 
        delay_ms(50) ;
        sayi++;
        print_lcd();
       
   if (sayi==255)   
      sayi=0;

      set_timer0(254);
      pulse=sayi* 0.045;
      
}



void main ( )
{
   glcd_init(on);
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x8); // RA4 pini giriş
   enable_interrupts(INT_timer0); 
   enable_interrupts(GLOBAL);     
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1); // Timer0 ayarlar
   set_timer0(254);   // TMR0 değeri



   while(input(buton));  

 }