Display uygulamasında rakam geçişlerini yavaşlatamıyorum.

Başlatan Recep METE, 10 Ekim 2013, 12:22:43

serhat1990

Rica ederim , elektronik mühendisi değilim elektronik haberleşme teknikeriyim . Mühendislik hayalim hep var ama hayal olmaktan pek öteye geçemiyor .
Bu arada mühendis olmayanlarında yolu açık olsun demek lazım :)

İyi çalışmalar , saygılarımla ...

Recep METE

Hocam yukarıdaki 0-99 sayıcı display programını TİMER-0 kesmesi ile çalıştırabilirmiyiz?pin_a4'e buton bağlasak butona basınca timer_0 kesmesi çalışsa acaba bu şekilde olur mu?Naçizane yorumlarınızı bekliyorum.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

serhat1990

Tabiki çalıştırabilirsin kesme ile . Kesme programında kendi oluşturduğun yazılımsal bir bayrağı ( değişken değeri ) aktif edersin. Ana programda bu bayrak aktif ise sayma işlemini yapar. Sayma işlemi bittiğinde çıkarken bu bayrağı temizler. Tekrar kesme ile bayrak aktif olunca aynı işlemler tekrar olur.

Yani mantıksal olarak , aşağıdaki şekilde yapabilirsin.

İyi çalışmalar ...

kesme_programi()
{
    if(kesme_bayrağı)saymaya_basla=1;
}

ana program

{

while(1)

{

if(saymaya_basla==1)
{
// sayma işlemleri yapılır . 
// Saymaya başla bayrağı sıfırlanır.
}

}

}

Recep METE


Hocam, bu kesme bayrağı olayını tam anlamış değilim.Örnekle gösterecek olursak ben aşağıdaki programda hangi değişkeni TİMER_0 kesmesine yazmalıyım.Aklım sahiden karıştı da.


#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   buton      pin_a2      // buton ifadesi pin_a2 ifadesine eşitleniyor
int i,x;
char birler=0, onlar=0, sayi=0;       // char tipinde değişkenler tanımlanıyor


// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{

unsigned char a=0;
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI 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(0xFC);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda
  
  
  
   while(1)
   {
      

   for(i=0;i<10;i++)       // sayi değişkenini 1 arttır
  {
  if(a==10) {sayi++;a=0;}
 
            if (sayi==100)  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;

            birler=sayi%10;          // birler hanesi hesaplanıyor
            onlar=sayi/10;           // onlar hanesi hesaplanıyor

            
               output_low(display_2);  // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(50);             // gecikme veriliyor
               output_high(display_2);   // 2. display pasif durumda
               output_low(display_1);  // 1. display aktif durumda
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(50);             // gecikme veriliyor
               output_high(display_1);   // 1. display pasif durumda
               a++;
            
         
  }}
   }


mesaj birleştirme:: 11 Ekim 2013, 19:32:53

Hocam;"kendi oluşturduğun yazılımsal bir bayrağı ( değişken değeri ) aktif edersin. "bu cümlede anlatılmak istenen olayı biraz daha açar mısın? saygılarımla...
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

serhat1990

Yani bir tane değişken oluşturduk bunun ismi saysin olsun . Kesme alt programında saysin değişkeninin değerini 1 yapacaksın . Ana program bölümünde sayma işlemini saysin değişkeninin 1 olması koşulunda gerçekleştireceksin. Açıklayıcı olmuştur diye umuyorum.

İyi çalışmalar dilerim .

mehmet

http://eng-serve.com/pic/pic_timer.html
bu siteden Osc=8Mhz,
Timer0;
Prescaler to TMR0 = 1:256
TMR0 Preload       = 100 verilerek aşağıdaki kod oluşturuldu.
Yaklaşık 50Hz.' lik bir kare dalga.
Timer0 interrupt flag (INTCON.TMR0IF) kontrol
ediliyor. Kesme fonksiyonu içerisinde kendi tanımladığınız
değişkene hükmedebilirisiniz. (Artırma, eksiltme, 1/0<bayrak gibi çalıştırma> vs.)
Ya da örnekte olduğu gibi bir portun durumunu
değiştirebilirisiniz...

/*
* Example Source Code For PIC Timers
*   THis blinks LEDs on PORTB to show interrupt rates
*
* Barton Dring
* Dring Engineering Services
* [url=http://www.eng-serve.com]www.eng-serve.com[/url]
*
* Example only!  Use any code at your own risk.
*/

unsigned char test;

// Interrupt Handler
void interrupt()
{
  // Timer0 Interrupt - Freq = 50.08 Hz - Period = 0.019968 seconds
  if (INTCON.TMR0IF ==1) // timer 0 interrupt flag
  {
    //----------------------------
    test++;
    //----------------------------
    PORTB.F0 = ~PORTB.F0;      // Toggle PORTB bit0 LED
    INTCON.TMR0IF = 0;         // clear the flag
    INTCON.TMR0IE = 1;         // reenable the interrupt
    TMR0 = 100;           // reset the timer preset count
  }

}



// code starts here...
void main()
{

  // setup portb to show the interrupts by blibking LEDs
  TRISB = 0x00;    // PORT is all output...to show the interrupts
  PORTB = 0;       // start with all outputs low

//Timer0 Registers Prescaler= 256 - TMR0 Preset = 100 - Freq = 50.08 Hz - Period = 0.019968 seconds
OPTION_REG.T0CS = 0;  // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
OPTION_REG.T0SE = 0;  // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
OPTION_REG.PSA = 0;   // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
OPTION_REG.PS2 = 1;   // bits 2-0  PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1 = 1;
OPTION_REG.PS0 = 1;
TMR0 = 100;             // preset for timer register


// Interrupt Registers
  INTCON = 0;           // clear the interrpt control register
  INTCON.TMR0IE = 1;        // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
  INTCON.TMR0IF = 0;        // bit2 clear timer 0 interrupt flag
  INTCON.GIE = 1;           // bit7 global interrupt enable


  while(1)  //endless loop
  {
      //------------------------
      if(test == 200) test = 0;
      //------------------------
  }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr