Merhabalar;
Elimde bitisik olarak 4 haneli 7 segment display var. Alt resimdeki ( 4 adet nokta mevcut )
(http://m1307.hizliresim.com/1c/s/qq0zp.jpg) (http://bit.ly/c25MCx)
(http://t1307.hizliresim.com/1c/s/qq0zs.jpg) (http://bit.ly/c25MCx)
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 )
(http://t1307.hizliresim.com/1c/s/qq0vu.png) (http://bit.ly/c25MCx)
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 )
resimler gözükmüyor güncelleme lutfen
Alıntı yapılan: parametre - 24 Temmuz 2013, 08:58:21
resimler gözükmüyor güncelleme lutfen
Farklı siteye de yükledim. ( Yukardaki resimler normalde gozukuyor )
[IMG]http://img486.yukle.tc/images/466arkadan.jpg[/img] (http://bit.ly/V0BZqe)
[IMG]http://img486.yukle.tc/images/6155onden.jpg[/img] (http://bit.ly/V0BZqe)
[IMG]http://img486.yukle.tc/images/6565Display_veri.png[/img] (http://bit.ly/V0BZqe)
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ü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.
(http://img486.yukle.tc/images/6565Display_veri.png)
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]
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 :(
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.
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ış
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.
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.
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.
Merhaba arkadaslar Ekranın semasını proteusta cizdim
Henuz ekrana istenen veriyi yazamadım.
(http://n1307.hizliresim.com/1c/v/quuwy.bmp) (http://bit.ly/c25MCx)
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](http://r1307.hizliresim.com/1c/y/qy2pz.jpg)[/url]
(http://r1307.hizliresim.com/1c/y/qy2rd.png) (http://bit.ly/c25MCx)
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);
}
}