74hc595 ve buton kontrol hakkında

Başlatan xoom, 01 Kasım 2013, 11:19:39

xoom

#15
Hocam Verdiğiniz Kodda değişkenlerin neleri temsil ettiği hakkında kodların yanına açıklama ekleyerek mesajınızı düzenleyebilirmisiniz.
önce 1 adet 74hc595 entegresinde sağa sola kaydırma işini halletmek için sizin kodları CCS C ye çevirmeye çalışacağım.
Koddaki değişkenleri ve yapmak istediklerinize biraz açıklama eklerseniz ccs c ye çevirebilirim sanırım.

Klein

Yapılan işlemler pek karışık değil. Yine de açıklamaya çalıştım. 

char effect =0;

void WriteByte(char Val){
char i;
        for(i=0;i<8;i++){
            if(Val & 0x80) SDA=1; else SDA=0; // 7. bit 1 ise, D pinini 1 değilse 0 yap. 
            SCL=1;  // çipa CLK uygula
            SCL=0;
            Val <<=1;  // Baytı sola doğru 1 kez kaydır.
          } // bu işlemleri 8 kez tekrar et. 
    LD=1; // 74595'in Shift registerindeki bilgiyi çıkışına yaz. (Latch)
    LD=0;//
}

void sola_kaydir(void)
{
      Effect = (Effect << 1) | 0x01; // Efekt baytını sola kaydır. 0. bitini Hi yap. 
      WriteByte(Effect); // Efekt baytını 74595'e yaz. 
}

void saga_kaydir(void)
{
      Effect = (Effect >> 1) | 0x80; // Efekt baytını sağa kaydır. 7. bitini Hi yap. 
      WriteByte(Effect); // 74595'e yaz. 
}

xoom

yardım için tşkler.. Verdiğiniz kodları çevirdim CCS C ye ama istediğim sonucu vermedi.. videonun 4.30 dk'daki effect ile alakası yok. sırasıyla pinler 1 oluyor.

Klein

Tamam zaten öyle olacak. Efekt kodu vermedim. Kaydırma örneği verdim. 
Effect değişkeninin değerini başlangıçta 0xFF yapıp  0x01 veya 0x80  ile orlamadan kaydırırsan da bu sefer sıra ile sönerler.
Gerisi de efekti kurgulayıp bu rutinleri belirli bir sırada işletmeye kalıyor.

xoom

Hocam o zaman sizden birşey daha rica ediyorum.. pic'in herhangi bir pininde olan bir butona kaç defa basıldıysa o kadar led yanacak ve bu ledler önce sağa sonra sola doğru kayacak  sonsuz döngüde  bu kodu o şekile dönüştürebilirmisiniz. Butona bi daha basılırsa bu sefer o kadar led  ile gidip gelecek..
ben CCS C ye çeviririm zaten çok benziyor.

Klein

Yarın bir şeyler yazmayaçalşırım. ancak PIC kullanmadığım için bazı tanımlar sembolik olur.

LukeSkywalker

pwmle ayrı ayrı kontrolü nasıl sağlamış onu anlayamadım.

Klein

Ledlerin yanık kalma sürelerini değiştirerek yapmıştır. 74595 yterince hızlı. yapılabilir.

sadogan

74HC595 leri dışardaki bir ram düşün
Klein hocamın dediği gibi içerde animasyon ları hazırlayıp hc595 lere yazınca istedigin
animasyonu yapmış olursun.
Örnek olması açısında birkaç animasyon içeren kod gerisi size kalmış.
#include "main.h"

#Define DS PIN_B5
#Define ST_CP PIN_B6
#Define SH_CP PIN_B7
#Define Buton PIN_B0
int i;
int k;
int sayi=0;
unsigned int8 Hc595Data[5];
void write_hc595()
{
   unsigned int8 i,j,veri;
   for(j=0;j<5;j++) // hc595 e yazmayı 5 kez tekrarla
   {
      veri=Hc595Data[4-j];
      for(i=0x80;i>0;i>>=1) // hc595 e yaz
      {
         if(i&veri)output_high(DS);
         else  output_low(DS);  
         output_high(SH_CP);
         output_low(SH_CP);
      }
   }
   
      output_low(ST_CP);
      output_high(ST_CP);
}
void clr_hc595()
{
   Hc595Data[0]=0;
   Hc595Data[1]=0;
   Hc595Data[2]=0;
   Hc595Data[3]=0;
   Hc595Data[4]=0;   
}
void fill_hc595()
{
   Hc595Data[0]=255;
   Hc595Data[1]=255;
   Hc595Data[2]=255;
   Hc595Data[3]=255;
   Hc595Data[4]=255;   
}
void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   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);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   clr_hc595();
   write_hc595();
   while(TRUE)
   {
      unsigned int8 a,b; 
      for(a=0;a<5;a++)
      {
         for(b=0;b<255;)
         {
             b>>=1; 
             b|=0x80;
             Hc595Data[a]=b;
             write_hc595();
             delay_ms(100);
         }
      }
      clr_hc595();
///////////////////////////////////////
      for(a=0;a<5;a++)
      {
         for(b=0;b<255;)
         {
             b>>=1; 
             b|=0x80;
             Hc595Data[4-a]=b;
             write_hc595();
             delay_ms(100); 
         }
      }
      clr_hc595();
/////////////////////////////////////////////      
      write_hc595();
      delay_ms(500); 
      fill_hc595();
      write_hc595();
      delay_ms(500); 
      clr_hc595();
      write_hc595();
      delay_ms(500); 
      fill_hc595();
      write_hc595();
      delay_ms(500);       
      clr_hc595();
      write_hc595();
////////////////////////////////////      
       for(a=0;a<5;a++)
      {
         for(b=0;b<255;)
         {
             b<<=1; 
             b|=0x01;
             Hc595Data[a]=b;
             write_hc595();
             delay_ms(100); 
         }
      } 
//////////////////////////////////////      
   }

}

xoom

sadogan hocam örnek kod için çok teşekkürler.. Epey daha anlamamı kolaylaştırdı..
Benim başımdan  yapmayı düşündüğüm animasyon içinde yardımcı olsanız çok iyi olucak.
B0 pinine bağlı olan bir butona kaç defa basılırsa o kadar led sağa sola gidip gelecek sürekli..Butona bastıkça gidip gelen led grubunun sayısı artacak.
Burada 40 led var butona 5 kere basınca 5 li grup led yanacak ve sağa sola gidip gelecek. hiç basılmazsa hepsi sönük bekleyecek..
bu animasyonu yapmamdaki amaç yanması gereken kadar ledi 1 yapıp diğerlerini sıfırla nasıl doldurup sağa sola götürücem kafam almadı..