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,
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
@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
#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..
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...
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);
}
@mcan
o kisim eger maske sifirlanirsa tekrardan dongu basladiginda ,maskeyi yukluyor
mutlu gunler
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
595 den önce biraz 74164'e bakmak gerekli bence;
http://www.mehmetbilgi.net.tr/node/4 (http://www.mehmetbilgi.net.tr/node/4)
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.
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.
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.
}
}
}