74hc595 - 7 segment display tarama

Başlatan debi, 27 Ağustos 2008, 17:16:17

debi

Arkadaşlar 74hc595'in kullanımını öğrenmek için şekildeki devreyi kurup kodları yazdım fakat, derleme esnasında hata veriyor ve hatayı bulamadım.. Kabaca devre şöyle çalışacaktı;

ilk digit aktif olacak 'd' harfi gönder;
reset sonrası ikinci digit aktif 'e' harfini gönder;
reset sonrası üçüncü.......
.......

Tarama yöntemi ile bu şekilde olacaktı..

http://rapidshare.de/files/40332946/deneme.DSN.html



#include <16F628.h> 
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD 
#use delay(clock=4000000) 

#define data pin_a1   /* pin_a1'i data ile ilişkilendirdim */ 

int i,j,segment=1;   /* değişkenler */ 
const int debi[]={0b01111010,0b10011110,0b00111110,0b01100000}; /* 'd','e','b','i' kelimesi */ 

void cikis_yaz()   
{ 
output_high(pin_a0); 
output_low(pin_a0); 
} 

void cikis_latch()
{
output_high(pin_a2);
output_low(pin_a2);
}

void cikis_sil()     
{ 
output_high(pin_a3); 
cikis_latch(); 
output_low(pin_a3); 
} 

void main() 
{ 

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 
   setup_timer_1(T1_DISABLED); 
   setup_timer_2(T2_DISABLED,0,1); 
   setup_comparator(NC_NC_NC_NC); 
   setup_vref(FALSE); 

   output_a(0); 
   output_b(0); 


while(TRUE) 
{ 
      
         for(i=0;i<=3;i++)     /* debi[0],debi[1],debi[2],debi[3]için döngü */ 
            { 
            cikis_sil();      /* ilk olarak çıkışı sıfırla */ 
            output_b(segment);   /* 7 seg'lerin ilkini aktif yapar */ 
            segment<<=1;        /* sonraki döngüde 2. 7 seg digitini aktif yapmak için sola kaydırma işlemi */ 
            if(segment==0b00010000) /* debi 4 harf,4 digit taranacak. segment 2^4 olunca segmenti 1'e eşitle */ 
            segment=1; 
               for(j=0;j<=7;j++)                      /* ilk olarak debi[0] yani d harfinin */ 
               {                                      /* 8 bitini tarar. her bit testini */ 
               output_bit(data,bit_test(debi[i],j));   /* data ucuna verir ve 74hc595  */ 
               cikis_yaz();                           /* çıkışında 8 biti de gösterir. */ 
               }
               cikis_latch();
               delay_us(500);
            } 
} 
}



edit :: driverı bilerek kullanmadım.. Bu şekilde zihinde daha iyi canlanıyor diye düşünüyorum..

M_B

Merhaba

öncelikle 74HC595 entegresine seri olarak bilgi
girip sonra 12 nolu ucu (st_cp) high sonra low yapacaksın ki gonderdiğin bitler cıkısta gozuksun.  
sizin 74hc595 surme mantıgınızı tam anlayamadım.

Birde ne tur bir hata veriyor.
forumu ve 74hc595 in datasheetinı incelemeni tavsiye ederım.

Gene takıldıgın yerde yardım ederız.
kolay gelsın
M_B
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

iyonosfer

segment<<=1;
            if(segment=0b00010000)

segment<<=1  bu satırda yapmak istediğin segmenti bir bit sola kaydırmaksa
segment = segment << 1;  bu şekilde kullan,
ek olarak  if(segment=0b00010000) bu satırdada segment==0b0001000 olmalı "=" lerden birini unutmuşsun.
Blog Sayfam: www.teknobakis.com

debi

Hala düzeltemedim, kodlara açıklama satırları da ekledim, daha açıklayıcı olsun diye.. Altı üstü 7 seg displayde "debi" kelimesini yazdıracaktım..

Ayrıca şöyle bir hata veriyor CCS derleyici;
Expecting a close paren

edit::hatayı buldum ama devre çalışmıyor:)

Son olarak 74hc595'i şu şekilde kullanıyorum,doğru mu?

-- data (ds) ucuna 1 veya 0 bilgisi veriyorum..
-- SH ucunu önce high(1) sonra low(0)'a çekiyorum..
-- ST ucunu önce high(1) sonra low(0)'a çekiyorum..
-- Q0'da data gözüküyor... Aynı işlem tekrarında kayarak son veri Q0'da gözükecek şekilde ilerliyor..

--Reset içinse  reset bacağını sıfıra çekip SH high,low sonrsında ST high,low'a çekerek çıkışı sıfırlıyorum...

M_B

Merhaba
Semanda Transistor yerine Not kapısı kullan. ( simulasyon ıcın )

Asagıdakı kod sımulasyonda calısıyor.
Fikir vermesı acısından yardımcı olması dılegıyle
Kolay gelsın.
// main  74HC595 UYGULAMASI
// islemci : PIC16F628 
// Derleyici: Hi-Tech C 

#include <pic.h>
#include "delay.h"

#define clock      RA0  // 
#define latch      RA2  // 
#define ds1        RA1  //

unsigned char debi[]={0x5E,0x79,0x7C,0x04}; 
unsigned char segment =1;


void gonder(unsigned char veri) 
{ 
  unsigned char i; 
	
	if(segment==0b000010000) {segment =1;}
    for(i = 0; i<8; i++) 
      {  
          if((veri & 0x80 ) == 0x80 ) 
               ds1 =1; 
          else 
               ds1 =0; 
               veri<<=1; 
               clock =0; 
               DelayUs(20); 
               clock =1; 
        } 				PORTB = segment;
						segment = segment << 1;
						latch = 1;
    					DelayUs(10);
    					latch = 0;    				
						DelayUs(20);
				}  


main(void)
{ TRISA = 0x00;
  TRISB = 0x00;
  PORTB=0x00;
  PORTA=0x00;
  CMCON =0x07;
	for(;;)
		{  
 			unsigned char j;
 		 	for(j=0;j<4;j++)
			gonder(debi[j]);
		}         
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

debi

Teşekkür ederim,, sayende çözdüm olayı  :0)
Hatalar ve düzelttiklerim;

-- Transistör yerine not kapısı(simulasyonda)
-- bekleme süresi eklememiştim, onu ekledim..
-- latch olayını 8biti gönderdikten sonra yaptım..

Tekrardan sağol, kodları da son haline düzeltiyorum..