Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ccs ile 74hc595 kullanimi

Başlatan cesurcelik, 05 Şubat 2006, 17:02:59

cesurcelik

merhaba.
ardisik bagli sift register kullanarak 3 adet 8x8 matrix display kolonlarini taramak istiyorum..
yazdigim kod :
#if defined(__PCM__)
#include <16F873.H>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1,RESTART_WDT,ERRORS,INVERT)


#IFNDEF EXP_OUT_ENABLE

#define EXP_OUT_ENABLE PIN_C2
#define EXP_OUT_CLOCK PIN_C1
#define EXP_OUT_DO PIN_C0
#define NUMBER_OF_74595 2
#ENDIF
//void TurnOnAll( ) ;
//void TurnOffALL( );
#include <74595.C>

#byte port_b=6
#byte port_c=7


                           main()
                           {

//int mask = 0x01; // mask for turning on 1 column at a time
int data[3]; // array to store our data
set_tris_c(0);
set_tris_b(0);
port_b = 0xff;
port_c = 0;
                              do
                              {

data[0] = 0x01;
data[1] = 0x00;
data[2] = 0x00;
delay_ms(500);
write_expanded_outputs(data);
delay_ms(500);

shift_left(data,3,0);


if (shift_left(data,3,0))
data[0] = 0x01;

                              }
                              while(1);

                             }

bu kodu proteus ta denedigimde sadece ilk shift  register aktif oluyor,
daha once picbasic pro kullaniyordum ,ccs e gectim,,,ccs de yeniyim
ccs de deneyimli olan arkadaslar dusuncelerini paylasirsa cok memnun olurum,

emrahmrcn

74HC595 için çalışma şöyle oluyor;

   SH_CP (clock) darbesi her pozitife çekişte DS(data) kolundaki dataları içeri alır.(Yani datayı DS bacağında tut içeri grimesi için clock darbesi uygula).
   ST_CP (aktifleme) ise pozitife çekildiği zaman içeri alınmış dataların uçlarda görünmesi sağlanır.

Bu çalışma şeklinde data latchlenir(tutulur).Yani uçlarda görünen bilgi yeni bilgi gelinceye kadar tutulur.

MR ucu pozitife , OE ucu negatife bağlı olmalıdır.
bcdshift (unsigned char output_data)
{
	unsigned char index;

	for(index = 0; index < 8; index++)  	        
	{
        if (output_data & 0x80) 
		RB5=1;      
    		else 
		RB5=0;
      	output_data  <<= 1;
		
		RB4=1;	//Clockla		
		RB4=0;
							
	}	  					
}


Kullanımı ise

bcdshift(bcd[128]);
adigit1=1;
adigit1=0;   //aktifle
Benim yaradılışımda bir ayrıcalık varsa o da TÜRK olmamdır. M.K ATATÜRK

kalman

@cesurcelik,

#include <74595.C>  de  kac tane 74595 olduğunu belirtmen gerekir

eğer sen sadece bir tane 74595 olduğunu belirtirsen bu durumda sadece dizinin ilk elemanı  yollanır diğerleri dikkate alınmaz

Kolay gelsin

Herkese Başarılar

necati

#include <16f628.H> //sayici 65535 74595-1 bafgedc. 74595-2 birler onlar 4k7 bc337
#use delay(clock=4000000) //counter 65535
#fuses NOPROTECT,NOWDT,NOPUT,noBROWNOUT,NOLVP,NOMCLR,intRC_io
#BYTE PORT_A=0X05
#BYTE PORT_B=0X06

#IFNDEF EXP_OUT_ENABLE
#define EXP_OUT_ENABLE PIN_b0
#define EXP_OUT_CLOCK PIN_b1
#define EXP_OUT_DO PIN_b2
#define NUMBER_OF_74595 2
#ENDIF

#use fast_io(a)
#use fast_io(b)

void TurnOnAll( ) ;
void dsp_yaz( );
#include <74595.C>

		   int16	OKUNAN;
			int	bir=0,on=0,yuz=0,bin=0,ONBIN=0,data;

byte CONST tablo [10]= {
			//76543210     common chahode
			//bafgedc.
			0b11101110,	//	0
			0b10000010,	//	1
			0b11011100,	//	2
			0b11010110,	//	3
			0b10110010,	//	4
			0b01110110,	//	5
			0b01111110,	//	6
			0b11000010,	//	7
			0b11111110,	//	8
			0b11110110,	//	9
		       	};

void	main() {

		setup_timer_1	(t1_external|t1_div_by_1);
		set_timer1		(0);
		ext_int_edge		(h_to_l);
		SET_TRIS_A	(0b11111111);
		SET_TRIS_B	(0b01000000);

      input(pin_b6);
		SET_TIMER1(0);

START:
		OKUNAN=get_timer1();

		BIR=0;
		ON=0;
		YUZ=0;
		BIN=0;
		ONBIN=0;
		WHILE(OKUNAN>=10000)   {OKUNAN=OKUNAN-10000,    ONBIN    ++;}
		WHILE(OKUNAN>=1000)    {OKUNAN=OKUNAN-1000,     BIN      ++;}
		WHILE(OKUNAN>=100)     {OKUNAN=OKUNAN-100,      YUZ      ++;}
		WHILE(OKUNAN>=10)      {OKUNAN=OKUNAN-10,       ON       ++;}
		WHILE(OKUNAN>=1)       {OKUNAN=OKUNAN-1,        BIR      ++;}
      dsp_yaz();

      		goto	start;
}

void dsp_yaz(){
int8 mydata[2];
      mydata[0] =tablo[bir];//ikinci595
      mydata[1] = 1,//birinci 595 d0 birler 4k7 bc337
      write_expanded_outputs(&mydata[0]);
		DELAY_ms	   (3);

      mydata[0] =tablo[on];
      mydata[1] = 2,//birinci 595 d1 onlar 4k7 bc337
      write_expanded_outputs(&mydata[0]);
		DELAY_ms	   (3);

      mydata[0] =tablo[yuz];
      mydata[1] = 4,//birinci 595 d2 yuzler 4k7 bc337
      write_expanded_outputs(&mydata[0]);
		DELAY_ms	   (3);

      mydata[0] =tablo[bin];
      mydata[1] = 8,//birinci 595 d3 binler 4k7 bc337
      write_expanded_outputs(&mydata[0]);
		DELAY_ms	   (3);

      mydata[0] =tablo[onbin];
      mydata[1] = 16,//birinci 595 d4 obinler 4k7 bc337
      write_expanded_outputs(&mydata[0]);
		DELAY_ms	   (3);}


Mod notu : Code Tag ı kullanalım..
[email]entegreterbiyecisi@yahoo.com[/email]

cesurcelik

merhaba.
arkadaslar cok teşekkür ederim...
sorunumu hallettim.
dogru kod:
#if defined(__PCM__)
#include <16F873.H>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1,RESTART_WDT,ERRORS,INVERT)


#IFNDEF EXP_OUT_ENABLE

#define EXP_OUT_ENABLE PIN_C2
#define EXP_OUT_CLOCK PIN_C1
#define EXP_OUT_DO PIN_C0
#define NUMBER_OF_74595 4//kac tane tane shift register kullandin?4//
#ENDIF

#include <74595.C>

#byte port_b=6
#byte port_c=7


                           main()
                           {


int i;
int mask[4];//maske
int data[4];//gonderilecek dizi//
set_tris_c(0);
set_tris_b(0);
port_b = 0xff;
port_c = 0;
                              do
                              {

mask[0]=0x01; //kaydirmak istedimiz 32 bitlik data//
mask[1]=0x00;
mask[2]=0x00;
mask[3]=0x00;
for(i=0;i<32;i++)
                  {
data[0] = mask[0];
data[1] = mask[1];
data[2] = mask[2];
data[3] = mask[3];

delay_ms(500);
write_expanded_outputs(data);
delay_ms(500);


if (shift_left(mask,4,0))
mask[0] = 0x01;
                  }
                              }
                              while(1);

                             }

bilgi paylastikca cogalir...
mutlu gunler...

mcan

merhaba bende deneme yapmaya başladım,benimkiler yanıp sönüyor bu kısım ne işe yarıyor,merak ettim
if (shift_left(mask,4,0)) 
mask[0] = 0x01; 
                  } 
                              } 
                              while(1); 

                             }

cesurcelik

@mcan
o kisim eger maske sifirlanirsa tekrardan dongu basladiginda ,maskeyi  yukluyor
mutlu gunler

kuylus

Sayın arkadaşlar

ccs c de yeni oldugumda  anlayamadığım birkaç nokta var
konuya hakim olanlardan 595 olayı için şöyle bir detay rica etsem

yukardaki verilen kodların karşısına  her satırda tam olarak ne yapılmak isteniyor diye yazabilirmisiniz

birde örneyin ısı sensörünü okudum  bunu 595 nasıl göndericemde ekranda çıksın ve saat entegresini  okudum  onu nasıl göndericem bir türlü  olayı çözemedim

mesela  ds18b20 yi  16f628a ile okudum ve portun birinden   belli bir sıcaklıkda  led yaktıkda peki bu  değerleri  matrixlere  , LCD ye ve led dsplay gönderme  rutinine örnek verebilirmisiniz

şimdiden çok teşekkür ederim


mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

veliusta

Alıntı yapılan: mehmet - 30 Ocak 2015, 03:28:17
595 den önce biraz 74164'e bakmak gerekli bence;
http://www.mehmetbilgi.net.tr/node/4

SPI'yi anlayamadım. Yeterli gelmedi.

hasankara

Sırf sen anla diye gittim google görsellerde kırbaç resmi aradım anlamazsan darılırım. ekleyeceğim resim biraz paint terk ama sende seveceksin.



spi in en temel olayı bu 3 hat. her kırbaç darbesinde aygıtlar registerlerini bir bit kaydırıyor ve SDI da ki seviyeyi 0. bite alıyor, 7. bitin deki bilgi de SDO seviyesini belirliyor.

Önemli kısımlardan birisi ise master slave ilişkisi. Clock darbesini aygıt dışarıdan bekliyorsa bu aygıt slave (köle) dir. Clock darbesini aygıt kendisi uyguluyorsa bu aygıt master(yönetici) dir. Bu görselde iki aygıtta köle ve biz ikisini de ortak uçtan kırbaçladık. 595 denilen shift register aygıtı slave dir mikrodenetleyici ile kontrol edecekken mikrodenetleyicimiz master olmalıdır.

Diğer bir kısım register genişliği. Bu görselde 8 bitlik register genişliği bulunmakta. Bu bazı aygıtlarda 16 bit olabilir bazen 8 bazen ... böyle gider. Yani tasarıma göre register uzunluğu değişebilir. Mesela her bir 595 register uzunluğu 8 bitliktir. Ancak 3 adet 595 i peş peşe bağlarsan bunun tasarımcısı olarak bunu sen bilirsin ve mikrodenetleyici tasarımını 24 bit e göre ayarlarsın.

Bu arada 595 diyoruz diyoruz da konu spi olunca neden bu aygıt çıkıyor hep karşımıza? spi kullanan ve her bir bitini ayrı ayrı görebildiğimiz bir aygıt olması dolayısı ile spi i üzerinde anlamak oldukça kolay olmakta. Bu aygıtların geneline shift register denilir. 595 ten daha temel seviye shift register aygıtlar da vardır (4017 gibi) ancak 595 in ek olarak bazı özellikleri daha olduğu için ve ucuz olduğu için tercih edilir.

okannet

Merhaba;
Aşağıda bir butona basılınca bilgi isimli değişkendeki veriyi 74HC595 in çıkışına aktaran kodu çalışmasını anlatmak adına ekledim. Birden fazla entegre olması durumunda Q7' çıkışını diğer entegrenin DS girişine bağladığınızda ve kaydırma sayısını arttırdığınızda işlem tamamdır. Umarım işe yarar.
Kolay gelsin.
#define SH_CP   PIN_C0 // shift register clock ucu
#define DS      PIN_C1 // data ucu
#define ST_CP   PIN_C2 // storage register ucu

// bilgi=0x04 ==> 0000 0100
// maske=0x80 ==> 1000 0000
// maskenin 1 olan biti sağa kaydırılıp bilgi değişkeni ile AND işlemine tabi tutuluyor, böylece o bit 1 mi 0 mı anlaşılıyor.
unsigned int bilgi=4;   // göndermek istediğimiz bilgi
unsigned int i;  // döngü sayacı
unsigned int maske=0x80;   // gönderilecek bilginin bitlerini öğrenmek için kullanılan maske bilgisi.
void main()
{
   while(TRUE)
   {
      if (input(pin_b0))   //Butona basılınca porta 4 bilgisini gönder
      {
         while (input(pin_b0)){} //butondan elini çekmesini bekle
         for (i=0;i<8;i++)
         {
            if(bilgi&maske) output_high(DS); //bilginin ilk biti 1 ise seri bilginin ilk biti olarak 1 ver.
            else output_low(DS);
            maske>>=1;  //Maskeyi ikinci-üçüncü... bite ayarlamak için kaydır.
            output_high(SH_CP); // shift register clock girişini ver.
            delay_us(2);
            output_low(SH_CP);
         }
            output_high(ST_CP);  //storage register clock girişini ver ve bilgiler portlarda görünsün.
            delay_us(2);
            output_low(ST_CP);
            maske=0x80; //maskeyi eski haline getir.
      }
   }

}
Cahil, her şeyi bilendir.