4' lü 7 Segment sürme algoritması ( Standart Display değil )

Başlatan M_B, 24 Temmuz 2013, 08:37:20

M_B

Merhabalar;
Elimde bitisik olarak 4 haneli 7 segment display var. Alt resimdeki  ( 4 adet nokta mevcut )


Kartta 4 tane sn74hc595 5 tanede uln2003 entegre kullanılmıs.
uln2003 bir tanesini noktaları yakmak ıcın kullanılmıs.  Diger 4 tanesi de Displayi surmek icin.
İlk veri giren 595  in Qa-Qb-Qc-Qd cıkıslarını noktalar icin kullanmış diğer cıkısları da 1-dijit ıcın kullanmış.
1 dijit icin 1. 595 'in Qe-Qf-Qg-Qg ve ikinci 595'in Qa-Qb-Qc lerini kullanmış ( Tablodan da gozukeceği üzerine )


Bu displayı sürebilmem icin nasıl bir algoritma kurmalıyım.  595 'ler birebir dijitlere baglı olsa sorun olmayacaktı.
Tablodan da gorulecegi üzerine bir dijiti sürmek icin iki 595 'den yararlanmış. ( mecburen veri kayması olmus )
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

parametre


M_B

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Tagli

Hocam takıldığın yer neresi tam olarak? 7 ve 4 bitlik değişkenleri kaydıracak birer fonksiyon yazsan 4 hane ve ek olarak 4 bitlik nokta verisini rahatça dışarı kaydırabilirsin.
Gökçe Tağlıoğlu

Kabil ATICI


Güzel ekranmış..Her dijitin üzerinde görüntüleneceği ve ekran için veriler hazırlanacak bunlar tablo halinde hazırlanacak. Sonra bunlar sistem çalışırken bu tablodan okunup veri gönderim tablosuna göre bit bit düzenlenip gönderilecek.


Bu şekilde yazmak yerine her djitin numarasına göre verileri düzenlersen sonucu daha iyi görebilirsin.
Eğer giden veri her baytı içinde farklı dijitler için bilgi yer alıyorsa, bit bit yerlerine oturtman gerekir. işlemci kullanıyoruz.
örneği verini
[size=0px]Q1h-Q2h-Q3h-Q4h-[/size][size=0px]Q1a-Q1b-Q1c-Q1d -[/size][size=0px] Q2e-Q2f-Q2g-Q2g [/size]
[size=0px]gibi etiketlersen sonucu daha kolay görebileceğini düşünüyorum öbür türlü işin içinden çıkamazsın.[/size]
[size=0px]Verini yukadaki gibi etiketleyip bit bit bunları işlemek. ASM'de bit işleri kolayda diğerlerini bilmem.[/size]
ambar7

M_B

Alıntı YapHocam takıldığın yer neresi tam olarak? 7 ve 4 bitlik değişkenleri kaydıracak birer fonksiyon yazsan 4 hane ve ek olarak 4 bitlik nokta verisini rahatça dışarı kaydırabilirsin.
4 Tane 595  4x8=32 bit  var bunu seri olarak göndermede sorun yok.
Tek sorun her digit icin tablo mu hazırlamak hazırlasam bile muhakkak bir onceki 595 'in bir cıkısı yana kaymıs oluyor. Onu değiştirince bu seferde yandaki digitin degeri değişmez mi ? Biraz olayı karıstırdım sanırsam :( Sağlıklı düşünemiyorum.


Alıntı YapBu şekilde yazmak yerine her djitin numarasına göre verileri düzenlersen sonucu daha iyi görebilirsin.
Orneğin
Digit-4 bir rakam gösterecem.
Sonrada Digit-3 te de bir başka rakam gösterecem.
Digit-3 teki verinin bir tanesi Digit-4 un 595 inden geliyor.
Bu yuzden her digit icin tablo olusturamam diye dusunuyorum.
Programı C ile yazacam. Benim icin şu an algoritmayı oturtabilmeliyim. Kafam durdu :(
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Tagli

Hocam her haneyi bir byte'lik bir değişkende sakla. Özel bir kaydırma fonksiyonu yaz, bu fonksiyon bir byte içindeki sadece 7 biti dışarı kaydırsın. Dört hane için bu fonksiyonu çağır. Ek olarak bir de 4 bitlik bir kaydırma yap, ki bu da zaten noktaları gösteren bitler olacak.
Gökçe Tağlıoğlu

Kabil ATICI

4 bayt gösterilecek değerimizi var. Bunlar doğrudan ekranda gösterilecek durumda...gös1,gös2,gös3,gös4 olsun
4 tane ekrana gönderilecek bayt var. Bunlar hazırlanacak. gön1,gön2,gön3,gön4 olsun
eğer gönderle göster arasında bir fonksiyon oluşturacak bağlantı yoksa;
yapacağın tek şey,
bit bit gön ve gös arasında bit taşıma yapman.
gön1.1=gös1.7
gön1.2=gös3.5
gön1.3=gös4.1
gön1.4=...
.
.
gön4.8=...
gibi (örnek)
sonuçta 32 bit yerlerine yerleştirilecek.
bunu C'de nasıl yaparsın orası sana kalmış

ambar7

JKramer

32 bit'lik bir değişkenle ve dört elemanlı bir structure'la union oluşturursunuz. Her bir digit için dediğiniz gibi tablo hazırlarsınız. Bundan sonra structure'daki ilgili digit değişkenine, kendi tablosundaki değeri atarsınız;
display.digits.d1=digit_1[5];
display.digits.d2=digit_2[7];
...
gibi. Bunları ayarladıktan sonra göndereceğiniz data 32 bit'lik değişkende (display.all olsun mesela) olacak zaten.

fatih6761

Alıntı yapılan: M_B - 24 Temmuz 2013, 10:39:58
4 Tane 595  4x8=32 bit  var bunu seri olarak göndermede sorun yok.
Tek sorun her digit icin tablo mu hazırlamak hazırlasam bile muhakkak bir onceki 595 'in bir cıkısı yana kaymıs oluyor. Onu değiştirince bu seferde yandaki digitin degeri değişmez mi ? Biraz olayı karıstırdım sanırsam :( Sağlıklı düşünemiyorum.

Orneğin
Digit-4 bir rakam gösterecem.
Sonrada Digit-3 te de bir başka rakam gösterecem.
Digit-3 teki verinin bir tanesi Digit-4 un 595 inden geliyor.
Bu yuzden her digit icin tablo olusturamam diye dusunuyorum.
Programı C ile yazacam. Benim icin şu an algoritmayı oturtabilmeliyim. Kafam durdu :(
Hocam benim anladığım kadarıyla digitlere tek tek müdahele etmek istiyorsunuz, bu şekildeki bir shift register mantığında tek baytı değiştiremezsiniz. Tek parça halinde 32-bit göndermelisiniz. Mesela ekrana 2345 göndermiştiniz. 3. Dijite 6 yazmak isterseniz tek baytla olmaz, baştan 2365 göndermeniz gerekiyor.

hasankara

void display_yansit(){
   unsigned char i=0,j=0,buff;

//yreset=0;yreset=1;
ylock=0;
	for(j=5;j>0;j--){
	buff=data[j];

		for(i=8;i>0;i--){

		yclock=0;
		if((buff&0b00000001)>0) ydata=1; else ydata=0;
		yclock=1;

		buff=buff>>1;
		}
	}
ylock=1;
}

data[1], data[2], data[3], data[4], data[5]  değişkenlerine verileri yükleyip, ardından bu fonksiyonu çağırırsak tüm verileri 595 lere aktarmış oluruz.

değişkenler arasından sadece bir tanesini değiştirsek bile aynı fonksiyonu çağırmamız gerekiyor. yani tüm değişkenleri tekrar en baştan çıkışa aktarmamız gerekiyor.

M_B

Merhaba arkadaslar Ekranın semasını proteusta cizdim
Henuz ekrana istenen veriyi yazamadım.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

M_B

Ekranla ilgili son durumlar.
Yukarda vermiş oldugum tablo yanlıs. Ekranı ters tutarak cıkarmısım.

Ekranın calıstırmamda yardımcı olan Ete hocaya ayrıca burdan da Teşekkür ederim.

Calısan ekran goruntusu ve yeni tablo aşagıda.
url=http://bit.ly/c25MCx][/url]

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

M_B

Sonunda Ekranı tam manasıyla kullanabildim.
İlgili kod
#include <pic.h>

#define _XTAL_FREQ 4000000

#define DATA RB2   // Pin 8   Beyaz
#define CLK  RB1   // Pin 7   Sari
#define ENB  RB3   // Pin 9   Yesil




// sigorta ayarları yapılıyor.
__CONFIG(FOSC_INTOSCIO&MCLRE_OFF&WDTE_OFF&LVP_OFF&PWRTE_ON&BOREN_ON);

volatile unsigned char sayac = 0;

// Ortak Anot display için veri değerleri
char Digit[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
//              [0   ,1,  2 ,   3 ,  4 ,  5 ,  6 , 7,   8 ,   9 ,o ,c ,- ,r ]
unsigned char temp;



typedef  union
              {
              int all;
              struct {
                      unsigned  d0  :1;
                      unsigned  d1  :1;
                      unsigned  d2  :1;
                      unsigned  d3  :1;
                      unsigned  d4  :1;
                      unsigned  d5  :1;
                      unsigned  d6  :1;
                      unsigned  d7  :1;                      
                      };
             }bittype;
   
bittype  Data1,Data2,Data3,Data4;


// *****************************************************

void gonder(char veri) 
{
  int i;
    for(i = 0; i<8; i++) 
        {  
    		if((veri & 0x80 ) == 0x80 )
      			DATA =1;
    		else
      			DATA =0;
   				veri<<=1;
   				CLK =0;
         		__delay_ms(10);		
   				CLK =1;
  		}

}  


 void ekrana_yaz(void) 
{

          Data1.all = sayac % 10 ;
          Data2.all = (sayac/10)%10;
          Data3.all = (sayac/100 );
          Data4.all = 0;

		  Data4.all=Digit[Data4.all];
		  Data3.all=Digit[Data3.all];
		  Data2.all=Digit[Data2.all];
		  Data1.all=Digit[Data1.all];

		  Data4.d0=Data3.d7;   // Data4 hazır
	
    temp=Data3.all;  
	temp=temp<<1;
	Data3.all=temp;

		Data3.d0=Data2.d6; 
		Data3.d1=Data2.d7;  // Data3 hazır

	temp=Data2.all;  
	temp=temp<<2;
	Data2.all=temp;

		Data2.d2=Data1.d7;
		Data2.d1=Data1.d6;
		Data2.d0=Data1.d5;


	temp=Data1.all;  
	temp=temp<<3;
	Data1.all=temp;

	ENB = 0;	
	gonder(Data4.all);
	gonder(Data3.all);
	gonder(Data2.all);
	gonder(Data1.all);
	ENB = 1;     	              
 }

  
// *********************************************************
// ana program
main(void)
{
    TRISA = 0b00000000;
    TRISB = 0b00000000;

    PORTA = 0b00000000;
    PORTB = 0b00000000;

    OPTION_REG = 0b00000001; // PullUp dirençleri devreye sokar.

    CMCON = 0x07;		 // PORTA analog pinlerini kapatır. PortA Dijitale dönüştür.
 
 

    while(1)
            { 					// program döngüsü	
            sayac++;			// Sayacı bir artır.		
     			    
			__delay_ms(20);	
		ekrana_yaz();	
			__delay_ms(20);	
	
            }        
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet