16F628A İLE 2 ADET SERİ BAĞLI 74HC595 İLE SIRALI LED YAKMA

Başlatan Y_K, 18 Aralık 2021, 23:49:34

mehmet

Basic bilgim az bunu söyledim.
Başka dilde de burada paylaşım yapmak
uygun olmaz. Bu nedenle hex verdim.
Bunu bir yazı düzenleyici ile kaydedin
ve deneyin.

Bit kaydırma ve 16-bit sayıyı 8-bite
çevirme konularına çalışın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Y_K

Anladığım kadarı ile ccs c olarak çalışma yapıyorsunuz.bende yeniyim bir arkadaşım sayesinde yazılım üzerine çalışmaya başladım.microcode üzerine kendimi yetiştirmeye çalışıyorum sizin alanınızdaki yazılım çok karmaşık geldi.Yinede yardım etmeye çalıştınız teşekkür ederim.iyi çalışmalar.birgün belkide benimde size yardımım olur inşaallah.

ete

IF BILGI=0 THEN BILGI=0
SHIFTOUT DTA,CLK,1,[BILGI3.byte1,BILGI3.byte0]
SHIFTOUT DTA,CLK,1,[BILGI2.byte1,BILGI2.byte0]
SHIFTOUT DTA,CLK,1,[BILGI1.byte1,BILGI1.byte0]
SHIFTOUT DTA,CLK,1,[BILGI.byte1,BILGI.byte0]

Yunus kafanı fazla çalıştırmıyorsun.
IF BILGI=0 THEN BILGI=0  şeklindeki bir ifade sence mantıklımıdır? Bence değil.
Bilgi=0 ise BILGI=0 olsun diyorsun bu anlamsız zaten sıfır. Ne 595 lerin nasıl çalıştığını nede bu işin nasıl yapılacağını o kadar anlatmama rağmen hiç birini anlamamışsın. Buda doğal çünki bir altyapın yok. Bu durumda sürekli olarak ihtiyacın olan şeyi bizim yapmamızı beklemende mantıklı olmayacak. Peki ne yapacaksın? bana kalırsa sitede yayınlanmış olan Basic derslerini ders-1 den başlayarak oturup çalışacaksın. Bu işin sonunda düşünme kaabiliyetin artacak.
Şu anda mantık açısından sıfır sın diyebilirim. Hiç bir şeyi anlamadığın o kadar bariz ki sana ne anlatsam yine bir kulağından girip diğerinden çıkacak. Yazdıklarına bile dikkat etmiyorsun.
Çok kısa bir iki şey söyleyip mesajı bitireceğim.
Her şeyden önce sana seri bağlı her 595 için bir değişkenin olması gerektiğini söyledim. Bunu anlamışsın ama ne yazıkki gerektiği şekilde değil. Nedenmi çünki yazdığın koda değişkenleri koymuşsun ama onlara bir değer vermemişsin. 595 lerden çıkan ona ait değişkenin sayısal karşılığının bit değerleridir. BILGI=15 dediğin zaman 15 in binary karşılığı olan %00001111 sayısı düşünülmeli ve buna karşılık 595 den aynı binary sayıya eşdeğer bir çıkış olacağını düşünmen gerekirdi. Ama sen sözüme bakıp yanlızca içi boş olan değişkenleri koduna yazmışsın.
Buraya kadar olan mesajlarda 16 bitlik bir sayıyı ikiye ayırıp bu sayıya karşılık gelen bitleri 595 lerden çıkartmış idik. Şimdi 595 adedi artınca yapman gereken bir çok iş var. İlk iki 595 de yer alan Bilgi1 değişkeni 65535 değerine ulaşınca ikinci değişkene (Bilgi2) 1 vererek artık onu artırmaya başlaman gerekir. Çünki 3 ve 4 nolu 595 lerde bu bilgi yer alacaktır.Unutma değişken değeri sıfır ise ona ait 595 lerden yanlızca LOW çıkar. Bilgi2=65535 oluncada Bilgi3=1 vermen gerekir. Daha sonrada bu değişkeni sıralı olarak artırman gerekir. Bu kadarını düşünebilmeli idin. Sürekli olarak acemi olduğıunu tekrarlıyorsun o haşde ders çalışıp acemiliğinden kurtulman gerekmezmi ? Kurtul o zaman. Yoksa şimdi anlattıklarımıda anlamayacaksın ve bu işi yine yapamayacaksın. Hiç bir zaman ezberci olma. Her zaman işin mantığını öğrenmeye çalış. Böylece program yazarken fazla yerdım almadan kendin her zorluğu aşarsın. Ama şu anda yaptığın şekilde bu iş yürümez bunda bilesin. Şimdi sana hatalarını ve bu işin nasıl olması gerektiğini yeniden anlattım. Ama bu sefer program şeklinde vermeyeceim artık. Anladın ise anladıklarını programa döker yaparsın bu işi anlamamış isen zaten dediklerimde haklı çıkarım ve sen de ders çalışmaya başlarsın artık umarım.

Ete

Y_K

Hocam yapmak istediğim devrede sıralı led yakıp söndüreceğim 595 lerin her çıkışına npn transistör bağlayıp gerekirse role kontrolü sağlayacağım BILGI=0 THEN BILGI=0 yazmamdaki amacımda 595 in 1.çıkışınında bulunan ledinde söndükten sonra tekrar yanmasını istediğim için 0 yaptım.siz 1 olması gerektiğini yazmıssınız farkettim kesin 1 olup olmaması konusunda bilgi sahibi değilim.Derslerinize elbette bakıyorum fakat yazılanlar ve anlatılanlar yeterli gelmedi doyum sağlayamadım ben yaptım oldu diyen birisi değilim.türkiye şartlarda sizin gibi mükemmel bilgilere sahip insan sayısı çok az kimse sizin gibi paylaşımda bulunmuyor o yüzden ben kendimi çok şanslı buluyorum.ne derseniz deyin ama bana bu işi öğretin gündüzleri vaktim olmuyor malum geçim derdindeyiz yaş 40 hocam.2005 yıllarında yazmış olduğunuz 13 dersten oluşan bir word sayfası var onlara bakıyorum 2 aydan beri anlamaya çalışıyorum.ALLAH sizin ile karşılaşmayı inşallah bir gün nasip eder.

Y_K

@ DEVICE pic12F675                      'işlemci 12F675                              
@ DEVICE pic12F675, WDT_OFF            'Watch Dog timer açık
@ DEVICE pic12F675, PWRT_ON            'Power on timer açık
@ DEVICE pic12F675, PROTECT_OFF        'Kod Protek kapalı
@ DEVICE pic12F675, MCLR_OFF            'MCLR pini kullanılıyor.
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
DEFINE OSCCAL_1K 1
DEFINE OSC 4
ANSEL=0
GPIO=0
'-----------------------------------------------------------------
CMCON=7 
I VAR BYTE
SAYI_BIR VAR WORD
SAYI_IKI VAR WORD


symbol CLK=GPIO.0  
SYMBOL DTA=GPIO.1
SYMBOL VERI=GPIO.2
'-----------------------------------------------------------------  
BASLA: 
FOR I=0 TO 16
PULSOUT CLK,1
PULSOUT VERI,1
PAUSE 50 
NEXT  
SAYI_BIR=%00000001 
SAYI_IKI=%00000000  


FOR I=0 TO 1
SHIFTOUT DTA,CLK,1,[SAYI_IKI,SAYI_BIR]  
PULSOUT VERI,1
PAUSE 500
NEXT
        
      GOTO BASLA

ete hocam aynı devreyi farklı yazıp 12f675 ile yeniden yaptım devre çalışıyor fakat bazı yerlerde takıldım
1.devreye enerji verdiğim zaman 3 veya 4 sn.geç başlıyor.hemen başlaması gerekiyor.
2.devre çalıştıktan sonra 1.led yanık kalıyor.ben söndükten sonra tekrar çalışsın istiyorum.
3.bütün ledler yandıktan sonra aynı yönde yandığı şekilde söndürmek istiyorum.



ete

Tris registeri ayarlanmamış daha dorusu programda yer almıyor. Bu  register kim giriş gim çıkış onu ayarlar. Programın başına TRISIO=0 eklersen açılış hızlanacaktır.
Başla satırından evvel 200 ms lik gecikme koymayıda ihmal etme.

Kodları bilerek yazmadığını algılıyorum.
Çıkışları sırası ile yakmak ve bunu sadece clk palsi ile yapmak için,
DTA=1 data girişini HIGH yapıyorsun
FOR I=0 to 15  '(sende 16 ya kadar 0 dahil 17 adım eder. 0-15 ise sıfır dahil 16 adım eder)
  PULSOUT CLK,1
  PULSOUT VERI,1
  pause 100
Next
toplam da 16 adet clk palsi verirsen her  ir çıkışın sırası ile yandığını ve yanık kaldığını görebilirsin.
Sende eksik olan DTA=1 komutu.

74HC595 ler 8 bitlik shift registerdir. 8 pin çıkışı var ve 1 adet byte bilgisini dışa verebilir. Peki sen ne yapmışsın?
   SAYI_BIR VAR WORD
   SAYI_IKI VAR WORD
şeklindeki tanımlamalarla her bir registere 16 şar bitlik değişken sığdırmaya çalışmışsın buda yanlış.
   SAYI_BIR VAR byte
   SAYI_IKI VAR byte
şeklinde olmalı

SAYI_BIR=%00000001
SAYI_IKI=%00000000
şeklinde değer verilmiş sayıları 595 lere verince ...00001 den dolayı program sonunda birincli led yanık kalıyor. O halde onlara
SAYI_BIR=%00000000
SAYI_IKI=%00000000
verirsen hepsi anında sönecektir.

Geriye doğru söndürme işlemi biraz daha komplike. Zira bunu registere yazarak yapabilirsin ancak. Başlangıçta, SAYI_BIR=%11111111:SAYI_IKI=%11111111 olarak başlayacak döngün.
Basla satırından itibaren kod aşağıdaki şekilde olmalı.
BASLA: 
GPIO.5=1

dta=1

FOR I=0 TO 15
PULSOUT CLK,1
PULSOUT VERI,1
PAUSE 50 
NEXT  

SAYI_BIR=%11111111 
SAYI_IKI=%11111111  



for I=0 to 15
SHIFTOUT DTA,CLK,1,[SAYI_IKI,SAYI_BIR] 
PULSOUT VERI,1
SAYI_IKI=SAYI_IKI>>1
IF I>6 THEN SAYI_BIR=SAYI_BIR>>1
PAUSE 50
NEXT
PAUSE 100        
      GOTO BASLA

Y_K

Hocam yardımız ve anlatımınız için teşekkür ederim fakat GPIO.5=1 i niçin yazdık?

ete

onu silebilrsin test etmek için yazmıştım unuttum silmeye
Ete

Y_K

Hocam devreyi yaptım simülasyonda çok güzel çalışıyor fakat uygulamada  enerjiyi kesip tekrar verdiğimde ilk önce ledlerin hepsi yanıyor sonra düzeliyor devrede giriş dc 12 volt çıkışında 7805 var

ete

Programı göreyim. Umarım dediğim gecikmeyi BASLA satırından evvel konuma eklemişsindir. O gecikmeden evvel GPIO=0 komutunu ekle. Bunlar sorunu düzeltmez ise 595 lerin besleme bacaklarına 100nf bağla. Sorun yinede devam ederse 595 lerin reset bacağına programdan müdahale etmek gerekir. Boşta bacak varmı bilemiyorum varsa yapmak zor değil.
Ete

Y_K

DEFINE OSCCAL_1K 1
DEFINE OSC 4
ANSEL=0
GPIO=0
TRISIO=0
'-----------------------------------------------------------------
CMCON=7 
I VAR BYTE
SAYI_BIR VAR BYTE
 
 
symbol CLK=GPIO.0  
SYMBOL DTA=GPIO.1
SYMBOL VERI=GPIO.2
DTA=1
SAYI_BIR=%00000000
PAUSE 200

'-----------------------------------------------------------------  
BASLA: 
DTA=1
FOR I=0 TO 8
PULSOUT CLK,1
PULSOUT VERI,1
PAUSE 70 
NEXT 
 
SAYI_BIR=%11111111 
  
 
 
FOR I=0 TO 8
SHIFTOUT DTA,CLK,1,[SAYI_BIR]  
PULSOUT VERI,1
IF I<8 THEN SAYI_BIR=SAYI_BIR<<1
PAUSE 35
NEXT
PAUSE 200
        
      GOTO BASLA

hocam siz geriye söndürme demiştiniz fakat ben yandığı yönde sönmesini istiyordum o yüzden böyle değiştirdim.ama sizin söylediklerinizi yazdım simülasyonda istediğim gibi çalışıyor. 12F675 te 2 ve 3. ayaklar boşta 595 te ise 9 numaralı ayak boşta


aRci

Merhaba
595 in 8 ile 16 pinleri besleme pinleri onları boş bırakarakdevreniz nasıl çalışıyor anlamadım simulasyondan mı bahsediyorsunuz.


Alıntı yapılan: Y_K - 12 Mart 2022, 21:48:39
DEFINE OSCCAL_1K 1
DEFINE OSC 4
ANSEL=0
GPIO=0
TRISIO=0
'-----------------------------------------------------------------
CMCON=7 
I VAR BYTE
SAYI_BIR VAR BYTE
 
 
symbol CLK=GPIO.0  
SYMBOL DTA=GPIO.1
SYMBOL VERI=GPIO.2
DTA=1
SAYI_BIR=%00000000
PAUSE 200

'-----------------------------------------------------------------  
BASLA: 
DTA=1
FOR I=0 TO 8
PULSOUT CLK,1
PULSOUT VERI,1
PAUSE 70 
NEXT 
 
SAYI_BIR=%11111111 
  
 
 
FOR I=0 TO 8
SHIFTOUT DTA,CLK,1,[SAYI_BIR]  
PULSOUT VERI,1
IF I<8 THEN SAYI_BIR=SAYI_BIR<<1
PAUSE 35
NEXT
PAUSE 200
        
      GOTO BASLA

hocam siz geriye söndürme demiştiniz fakat ben yandığı yönde sönmesini istiyordum o yüzden böyle değiştirdim.ama sizin söylediklerinizi yazdım simülasyonda istediğim gibi çalışıyor. 12F675 te 2 ve 3. ayaklar boşta 595 te ise 8-9 ve 16 numaralı ayaklar boşta



Y_K

pardon yazımı düzelttim.12F675 te 2. ve 3. ayaklar boşta 595 te ise 9 numaralı ayak boşta devreye enerji verdiğimde önce 595 e bağlı 8 adet led hepsi yanıyor daha sonra düzgün çalışıyor enerjiyi kesip tekrar verdiğimde aynı şekilde bütün ledler hepsi yanıp tekrar düzgün çalışmaya devam ediyor.

ete

Konu saptı yine. Dediklerimi yapıp yapmadığını belirtmedin!!!!!.
BASLA etiketinden öncesinde Pause 200 görüyorum. Bu pause 200 den bir önceki satırda GPIO=0 olsun
595 lerin 16ve 8 nolu bacakları arasına 100nf bağla. İşlemci besleme bacaklarına 100 nf bağla
tekrar dene.
Ete

Y_K

Hocam GPIO=0 komutu yukarıda ve dediğiniz gibi pause 200 den bir önceki satırlara yazdım.yukarıda yazılı kalması konusunda sıkıntı yok gibi o yüzden silmedim.
-595 in 8 ve 16
-işlemcinin 1 ve 8 numaralı ayakları arasına 100nf
-7805 in 5 volt çıkış ayaklarına 470mf kondansatörleri monte ettim
Sorun minimum oldu fakat biryerlere bir kondansatör daha eklememmi yoksa değerler ilemi oynamam gerekiyor kararsız kaldım.çünkü devrede hala arasıra kararsız çalışma var yazılım olarak siz eksik birşey görmüyorsanız.

Powered by EzPortal