Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: cesurcelik - 05 Şubat 2006, 17:02:59

Başlık: ccs ile 74hc595 kullanimi
Gönderen: cesurcelik - 05 Şubat 2006, 17:02:59
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,
Başlık: ccs ile 74hc595 kullanimi
Gönderen: emrahmrcn - 05 Şubat 2006, 19:27:56
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
Başlık: ccs ile 74hc595 kullanimi
Gönderen: kalman - 05 Şubat 2006, 19:54:13
@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
Başlık: 65535 sayici
Gönderen: necati - 05 Şubat 2006, 22:14:30
#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..
Başlık: ccs ile 74hc595 kullanimi
Gönderen: cesurcelik - 06 Şubat 2006, 12:49:21
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...
Başlık: ccs ile 74hc595 kullanimi
Gönderen: mcan - 06 Şubat 2006, 20:09:58
merhaba bende deneme yapmaya başladım,benimkiler yanıp sönüyor bu kısım ne işe yarıyor,merak ettimif (shift_left(mask,4,0))
mask[0] = 0x01;
                 }
                             }
                             while(1);

                            }
Başlık: ccs ile 74hc595 kullanimi
Gönderen: cesurcelik - 07 Şubat 2006, 11:46:46
@mcan
o kisim eger maske sifirlanirsa tekrardan dongu basladiginda ,maskeyi  yukluyor
mutlu gunler
Başlık: Ynt: ccs ile 74hc595 kullanimi
Gönderen: kuylus - 29 Ocak 2015, 21:27:15
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

Başlık: Ynt: ccs ile 74hc595 kullanimi
Gönderen: mehmet - 30 Ocak 2015, 03:28:17
595 den önce biraz 74164'e bakmak gerekli bence;
http://www.mehmetbilgi.net.tr/node/4 (http://www.mehmetbilgi.net.tr/node/4)
Başlık: Ynt: ccs ile 74hc595 kullanimi
Gönderen: veliusta - 30 Ocak 2015, 04:50:06
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 (http://www.mehmetbilgi.net.tr/node/4)

SPI'yi anlayamadım. Yeterli gelmedi.
Başlık: Ynt: ccs ile 74hc595 kullanimi
Gönderen: hasankara - 30 Ocak 2015, 08:59:34
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.

(http://s29.postimg.cc/jgseh5ivn/spi_gorsel.jpg) (http://postimg.cc/image/jgseh5ivn/)

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.
Başlık: Ynt: ccs ile 74hc595 kullanimi
Gönderen: okannet - 10 Mart 2015, 11:40:43
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.
      }
   }

}