CCS C ile Led Efekti.

Başlatan electroshock, 05 Kasım 2016, 21:26:45

electroshock

Mrb.
Aşağıdaki videodaki 1.30dk dan sonraki 20sn süren animasyon efekti ile. 3.dk başlayan efeckti nasıl yaparım?
Nasıl bir PWM döngüsü kurmalıyım fikir verirmisiniz.

https://www.youtube.com/watch?v=WlfD1bFekmI

mehmet

#1
Adam yazmış oraya; "1000USD yollarsanız,
nasıl yapıldığını anlatırım."

1) Led yak - söndür,
2) SPI, I2C, UART gibi iletişimler
3) Çevresel donanım elemanları

gibi konularla biraz ilgilenirseniz, başlangıç
yapmış olursunuz...

aliveli

pek zorluğu yok tarama yaptıracaksın

electroshock

normal 74hc595 entegresi ile karaşimşek efekti yapabiliyorum. oraya kadar sıkıntı yok.. fakat bu kuyruklu/gölgeli karaşimşek için pwm sinyalini nasıl kullanacağımı pek anlamadım.

RaMu

Daha detaylı anlatım vardı ama hemen bulamadım,
şu yöntemle yazılımsal çok kanal pwm üretiyorsun,
http://etepic.com/index.php/topic,145.msg2148.html?PHPSESSID=67eef84ea4965ba6f16cc6f29e24c392#msg2148

74HC olunca,
her bir mcu pin pwm çıkışı yerine 74hc nin pinleri kullanılmış oluyor,
kaç tane 74hc led süren pini varsa o kadar yazılımsal pwm üretmen gerekiyor.

En basit manada yazılımsal pwm ile mcu pininden 1 adet led i dimlersen gerisi gelir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

electroshock

Linki okudum biraz anladim fakat
Simdi normalde 74hc595 3 adet pin ile kontrol ediyorum (stcp,shcp,data)
Şimdi 3 adet pwm mi gerekiyor?
3 pwm demek en fazla 3 kuyrutan oluşan efekt mi demek oluyor?

mehmet

Sadece bir pwm yeterli. İlgili HC595 çıkışı aktif iken
OE ye pwm uygula. Bu şekilde de tara...

electroshock

Alıntı yapılan: mehmet - 06 Kasım 2016, 20:52:34
Sadece bir pwm yeterli. İlgili HC595 çıkışı aktif iken
OE ye pwm uygula. Bu şekilde de tara...
Tek pwm ile olacaksa donanımsal pwm kullanayım. Ama oe pini ile nasıl olck bu iş anlamadım biraz kurcalıyım.

RaMu

Alıntı yapılan: electroshock - 06 Kasım 2016, 19:45:48
...
Şimdi 3 adet pwm mi gerekiyor?
...

Alıntı yapılan: RaMu - 06 Kasım 2016, 17:44:47
...
kaç tane 74hc led süren pini varsa o kadar yazılımsal pwm üretmen gerekiyor.
...

Önce
Alıntı yapılan: RaMu - 06 Kasım 2016, 17:44:47
...
En basit manada yazılımsal pwm ile mcu pininden 1 adet led i dimlersen gerisi gelir.

Daha sonra mcu nun 1 portundaki 8 pinin tamamına 8 tane led bağlayıp
bunları ayrı ayrı dimleyebilen yapıya geçersin.

Dahada sonra bu yapıyı mcu nun 1 portundaki 8 pinin yerine 74hc kullanarak yaparsın.
...
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


ertuğrul54

buyur arkadaşım başlangıç için ideal geliştir
4094 ile yapmıştım  output enable  bacağına pwm  vereceksin

#TYPE short=8, int=16, long=32
///main.c
//#if defined(__PCM__)
#include <18F2550.h>
#fuses HS,NOWDT,PUT,BROWNOUT,PROTECT
#use delay(clock=10M)
#ZERO_RAM
//#endif

#include   "main.h"

#define INTS_PER_SECOND 30     // (4000000/(4*256*16))

void main()
{
   SET_TRIS_A( IOBITS_A );
   SET_TRIS_B( IOBITS_B );
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1, 255, 16);
  
   do{
   for(i = 0; i <= 32; ++i){
       write_expanded_outputs(led_tablo16[i][0]);
       write_expanded_outputs(led_tablo16[i][1]);
       write_expanded_outputs(led_tablo16[i][2]);
       write_expanded_outputs(led_tablo16[i][3]);
      for ( x=0;x<25; x++){
      set_pwm1_duty(x); 
      delay_ms(5);
      }
         for (x=25;x>0;x--){
         set_pwm1_duty(x); 
         delay_ms(5);
         }
       GONDER;
       delay_us(5);
      }
   } while ( TRUE );
}
//main.h
define   GONDER   (output_high(ST),output_low(ST))
// PORT_B'NIN BIT TANIMLAMALARI //
      #define   IOBITS_B      0b01110000

//   #define pwm      PIN_C2  //OUT
   #define DT       PIN_B7  //OUT
   #define CL       PIN_B6  //OUT
   #define ST       PIN_B5  //OUT


static const unsigned char led_tablo16[32][4] = {
        
   {0b00000000,0b00000000,0b00000000,0b00000001},   //0
   {0b00000000,0b00000000,0b00000000,0b00000011},   //1
   {0b00000000,0b00000000,0b00000000,0b00000111},   //2
   {0b00000000,0b00000000,0b00000000,0b00001111},   //3
   {0b00000000,0b00000000,0b00000000,0b00011111},   //4
   {0b00000000,0b00000000,0b00000000,0b00111111},   //5
   {0b00000000,0b00000000,0b00000000,0b01111111},   //6
   {0b00000000,0b00000000,0b00000000,0b11111111},   //7
   {0b00000000,0b00000000,0b00000001,0b11111111},   //8
   {0b00000000,0b00000000,0b00000011,0b11111111},   //9
   {0b00000000,0b00000000,0b00000111,0b11111111},   //10
   {0b00000000,0b00000000,0b00001111,0b11111111},   //11
   {0b00000000,0b00000000,0b00011111,0b11111111},   //12
   {0b00000000,0b00000000,0b00111111,0b11111111},   //13
   {0b00000000,0b00000000,0b01111111,0b11111111},   //14
   {0b00000000,0b00000000,0b11111111,0b11111111},   //15
   {0b00000000,0b00000001,0b11111111,0b11111111},   //16
   {0b00000000,0b00000011,0b11111111,0b11111111},   //17
   {0b00000000,0b00000111,0b11111111,0b11111111},   //18
   {0b00000000,0b00001111,0b11111111,0b11111111},   //19
   {0b00000000,0b00011111,0b11111111,0b11111111},   //20
   {0b00000000,0b00111111,0b11111111,0b11111111},   //21
   {0b00000000,0b01111111,0b11111111,0b11111111},   //22
   {0b00000000,0b11111111,0b11111111,0b11111111},   //23
   {0b00000001,0b11111111,0b11111111,0b11111111},   //24
   {0b00000011,0b11111111,0b11111111,0b11111111},   //25
   {0b00000111,0b11111111,0b11111111,0b11111111},   //26
   {0b00001111,0b11111111,0b11111111,0b11111111},   //27
   {0b00011111,0b11111111,0b11111111,0b11111111},   //28
   {0b00111111,0b11111111,0b11111111,0b11111111},   //29
   {0b01111111,0b11111111,0b11111111,0b11111111},   //30
   {0b11111111,0b11111111,0b11111111,0b11111111},   //31
};

};     
//-------------------------------------------------------------------//
char   i;
char   x,z;
//int  value;

//-------------------------------------------------------------------//
void time(int Get)
{
   Get = Get * 10;
   int16 i;
   for(i=0;i<Get;i++)
   {
      delay_ms(100);
   }   
}   

//----- EXT OUT -----//
void write_expanded_outputs(char* eo)
{
    char   bitno;
    bitno = 8;
       do {
          if(eo & 1){
             output_high(DT);
            output_high(CL);
            output_low(CL);
          }
          if(!(eo & 1)){//if(!(eo & 1))
             output_low(DT);
            output_high(CL);
            output_low(CL);
          }
          eo = (eo >> 1) | 0x80;
       } while(--bitno);
      //output_high(ST);
      //output_low(ST);
}

ertuğrul54

veya bunu hazır entegrelerle de yapabilirsiniz bu iş için üretilmiş entegereler var  ws2811 gibi

JOKERAS

74HC595 OE pinini ile olmazki bu.
OE Pini tüm çıkışları kapatıp açacak.

3-4 yıl önce yapmıştım bunu, Orjinal kuyruklu Kara Eşek devresi.
O videodakinin aynısı,hatta çok daha egzantrik efektler yapaliyordu,kuyruğu istediğiniz kadar uzatıp kısaltabiliyorsunuz.

Mantık şu..

8 adet bardağı bir masanın üzerine koyup elimdeki kaşıkla bu bardaklara istediğim bir sıra ile vuruyor
ve bardakların çıkardığı çınlama seslerinin vurduğum sıra ile azaldığını görüyorum.
Burada ne oluyorsa algoritmayı ona göre tasarlamak gerekiyor.

Her bir Bardağa vurmak ilgili LED'in PWM oranını MAX seviyeye çekmek demek.
PWM ise belli bir zaman aralığında sürekli Aşağı yani MİN seviyeye inen bir yapı.
Gerisi aliveli Arkadaşin dediği gibi 74HC595'i Tarama yöntemi.






electroshock

Alıntı yapılan: JOKERAS - 07 Kasım 2016, 14:01:05
74HC595 OE pinini ile olmazki bu.
OE Pini tüm çıkışları kapatıp açacak.

3-4 yıl önce yapmıştım bunu, Orjinal kuyruklu Kara Eşek devresi.
O videodakinin aynısı,hatta çok daha egzantrik efektler yapaliyordu,kuyruğu istediğiniz kadar uzatıp kısaltabiliyorsunuz.

Mantık şu..

8 adet bardağı bir masanın üzerine koyup elimdeki kaşıkla bu bardaklara istediğim bir sıra ile vuruyor
ve bardakların çıkardığı çınlama seslerinin vurduğum sıra ile azaldığını görüyorum.
Burada ne oluyorsa algoritmayı ona göre tasarlamak gerekiyor.

Her bir Bardağa vurmak ilgili LED'in PWM oranını MAX seviyeye çekmek demek.
PWM ise belli bir zaman aralığında sürekli Aşağı yani MİN seviyeye inen bir yapı.
Gerisi aliveli Arkadaşin dediği gibi 74HC595'i Tarama yöntemi.






Yani OE ile yapamadım zaten. fakat sizin söylediğinizide pek anlamadım. Daha doğrusu PWM ile bir ledin parlaklığını ayarlamayı yani pic'İn herhangi bir bacağına led'e dimmer yapmayı pwm ile yapabiliyorum.
Lakin araya 74hc595 girince.. bu PWM sinyalini Data bacağına Nasıl uygulayacağımı anlamadım.
Biraz Sanırım bu 40 fırın ekmek yemekle alakalı ama bulacağım inşallah
Yardımcı olan arkadaşlara teşekkürler.

İstek:  74hc595'in herhangi bir bacağındaki lede PWM uyguluma örneği paylaşırmısınız.

RaMu

Öncelikle MCU pininden yazılımsal olarak ledi dimlemelisin.
Yani her hangi bir mcu pinini
örneğin sonsuz bir döngüde
bir süre 1
bir süre 0 yapacaksın.

74hc için başlangıç olarak şunları uygulayıp
mantığı daha net anlayabilirsin:
while(1)
{
Adım1> 74hc ye 0xFF gönder 1ms bekle,
Adım2> 74hc ye 0x00 gönder 1ms bekle,
}


while(1)
{
Adım1> 74hc ye 0xFF gönder   200 mikrosaniye  bekle,
Adım2> 74hc ye 0x00 gönder 1800 mikrosaniye bekle,
}


while(1)
{
Adım1> 74hc ye 0xFF gönder  1500 mikrosaniye  bekle,
Adım2> 74hc ye 0x00 gönder   500 mikrosaniye bekle,
}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html