tarama yöntemi ilgili sorun

Başlatan sifirzero, 07 Şubat 2018, 00:16:37

sifirzero

merhaba arkadaşlar seven segment ile ufak bir uygulama yapıyorum tarama yöntemi kullanıyorum.sorunum şu, seven segment sayıyı göseteriyor kayboluyor,sayma işlemi yaptırıyorum. proteusda deniyorum uygulamada denemedim

#include<16f877a.h>
#fuses hs,nowdt,noprotect
#use delay(clock=4m)

int8 display[10]={63,6,91,79,102,109,125,7,127,103};
int8 display1[10]={63,6,91,79,102,109,125,7,127,103};
int8 unid,dec,unid1,dec1;
int sayac=0,sayac1=0;

void main()
{
set_tris_a(0xff);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_e(0x00);

output_a(0xff);
output_b(display[0]);
output_c(display1[0]);
output_d(0b00);
output_e(0b00);

while(true)
{

delay_ms(100);
unid1 ++;
if(unid1 == 9)
{
dec1 ++;
unid1 = 0;
}
output_e(0b01);
output_c(display1[unid1]);
delay_ms(10);
output_e(0b10);
output_c(display1[dec1]);
delay_ms(10);

// dakika

if(dec1==6 )
{
unid1=0;
dec1=0;

unid ++;
if(unid == 9)
{
dec++;
unid = 0;
}
output_d(0b01);
output_b(display[unid]);
delay_ms(10);
output_d(0b10);
output_b(display[dec]);
delay_ms(10);
}

}
}

problem her iki displayde sağ hanelerde oluyor sol hanelerde olmuyor.
delay_ms(100); bilerek yazdım sayma işlemini göreyim diye daha sonra 1000 olacak.
ilgilenen arkadaşlara şimdiden teşekkür ederim
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Salih

7 segment display denerken proteus başarılı değil.
gerçek devrede dene.

sifirzero

elimde malzeme yok salih ustam kodlar doğru mu sizce
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

Proteusta bu problemin çözumu varmi arkadaşlar
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

ete

Proteus da tek tek displaylerden kullanırsanız her biri için ayrı hesap yapıyor ve gecikiyor bu nedenlede kırpışma gözüküyor.
Ama birleşik display kullanırsanız nispeten gerçeğe yakın bir görüntü alıyorsunuz.
Tarama hızı kesinlikle 0,5 - 3 ms aralığında olmalı. Bu verdiğim değerler kesme kullanılırsa doğru. Ama kendiniz manuel tarama yapıyorsanız taramadan çıktıktan sonra programın ne kadar meşgul edildiğine bağlı olarak kırpışmalar ortaya çıkabilir.
Birleşik display olarak daima çift alternatifler mevcut model dosyasında 2 li, 4 lü, 6 lı gibi. Tek sayılarda display kullanıyorsanız bir fazlasını gösteren birleşik display seçin ve diplaylerden birini kullanmayın (sürmeyin).

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

sifirzero

Ete hocam çok teşekkür ederim. Anladim inşAllah
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sigmoid

Tarama işlemini timer kesmesi ile yaparsanız  işler daha kolay olur. Xc8 ile yazılmış kodu incelemek isterseniz.

https://youtu.be/DXBtmVu9l-0

Salih

Kesmeli bir örnek vereyim.
Sen ihtiyacına göre geliştir.


// ikili 7 segment uygulamasında TMR0 kesmesi kullanımı 
#Include  <16F877.h>
#Fuses XT,NOWDT
#Use Delay(clock=4M)


#Define Display_0 Pin_A0
#Define Display_1 Pin_A1


#Define Buton     Pin_B0// Artma Butonu
#Define Buton1    Pin_B1// Eksiltme Butonu


int8 birler=0, onlar=0, Sayi=0, x=0, saniye=0;


const int digit[16]={
0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7C,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71};
#int_Timer0  // 6 ms
void goster()// Bu fonksiyon Tmr0 kesmesi oluştuğunda çalışır
{
            set_timer0(68);
            birler=sayi%10;
            onlar =sayi/10;
        if (x==0)
          {            
            output_low(display_1);
            output_high(display_0);
            output_d(digit[birler]);
            x++;
          }else
            {               
               output_low(display_0);
               output_high(display_1);
               output_d(digit[onlar]);
               x=0;
            }                  
}


Void Main()
{   
   Setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
   setup_timer_2(T1_DISABLED,0,1); 
   Port_B_Pullups(True);
   Output_D(digit[0]);   
   Output_low(Display_0);
   Output_Low(Display_1);
   
   Enable_interrupts(INT_Timer0);
   Enable_interrupts(GLOBAL);
      While(True)
      {                      
            
            if (!input(buton))
               {
                  delay_ms(10);                  
                     if (sayi < 99) sayi++;                     
                        while(!input(buton));                          
               }
            if (!input(buton1))
               {
                  delay_ms(10);
                 if (sayi) sayi--;                                         
                        while(!input(buton1));                          
               }               
      }
}

sifirzero

sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

Çok teşelkurler @Salih ustam deneyim gelistireyim
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir