Timer0 kullanarak led animasyon modu değişimi

Başlatan lftwing123, 06 Ağustos 2021, 14:19:27

lftwing123

Merhabalar,
16f877a ile butona her bastığımda animasyon modunu değiştirip sıradaki mod döngüsüne geçmesini istiyorum. İlk önce Timer olmadan if ile butonu kontrol ettirmeye çalıştım ama yapamadım, devre düzgün çalışmadı. Timer0 ile çok daha güzel sonuç aldım ama butona basıldığında her bir modun içini tamamlayıp ondan sonra mod değiştiriyor. Case1 ve Case2 gibi kısa kodlarda sorun olmuyor ama Case4 gibi uzun kodlarda animasyonun bitmesini beklemek zorunda kalıyorum.
Timerlı kullanımda butona basıldığı anda hemen mod değişikliğini sağlamak için ne yapmam gerekir?
Case4'teki gibi uzun uzun animasyon tanımlamanın sakıncası olur mu illaki döngülerle mi yapılmalıdır?
Teşekkürler.

#include <16f877a.h> 
#use delay(clock=4000000) 
#fuses XT,NOWDT,NOPUT,NOLVP,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOCPD
#use fast_io(a)
#use fast_io(b)

int mod=0;
int i;
int sonuc;

#int_timer0
void sayici()
{
   set_timer0(255);
   mod++;
   if(mod>4)
   mod=1;
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_a(0b00010000);
   set_tris_b(0b00000000);
   output_b(0b00000000);
   
   while(true)
   {
      setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);// 1 bölme oranı. (256-255)*1=1=sayma sayısı
      set_timer0(255);//(256-255) 
      enable_interrupts(INT_timer0);
      enable_interrupts(GLOBAL);

      switch(mod)
      {
         case 1:
         {
            output_b(0xFF);
            delay_ms(100);
            output_b(0x00);
            delay_ms(100);
            break;
         }
         case 2:
         {
            output_b(0b10101010);
            delay_ms(100);
            output_b(0b01010101);
            delay_ms(100);
            break;
         }
         case 3:
         {
            sonuc=1;
            for(i=0;i<9;i++)
               {
                  output_b((sonuc-1));
                  delay_ms(100);  
                  sonuc=sonuc*2;
                  if(i==9) i=0;
               }
            break;
         }
         case 4:
         {
            output_b(0b00000000);
            delay_ms(100);
            output_b(0b00000001);
            delay_ms(100);
            output_b(0b00000011);
            delay_ms(100);
            output_b(0b00000111);
            delay_ms(100);
            output_b(0b00001111);
            delay_ms(100);
            output_b(0b00011111);
            delay_ms(100);
            output_b(0b00111111);
            delay_ms(100);
            output_b(0b01111111);
            delay_ms(100);
            output_b(0b11111111);
            delay_ms(100);
            output_b(0b11111110);
            delay_ms(100);
            output_b(0b11111100);
            delay_ms(100);
            output_b(0b11111000);
            delay_ms(100);
            output_b(0b11110000);
            delay_ms(100);
            output_b(0b11100000);
            delay_ms(100);
            output_b(0b11000000);
            delay_ms(100);
            output_b(0b10000000);
            delay_ms(100);
            output_b(0b00000000);//
            delay_ms(100);
            output_b(0b10000000);
            delay_ms(100);
            output_b(0b11000000);
            delay_ms(100);
            output_b(0b11100000);
            delay_ms(100);
            output_b(0b11110000);
            delay_ms(100);
            output_b(0b11111000);
            delay_ms(100);
            output_b(0b11111100);
            delay_ms(100);
            output_b(0b11111110);
            delay_ms(100);
            output_b(0b11111111);
            delay_ms(100);
            output_b(0b01111111);
            delay_ms(100);
            output_b(0b00111111);
            delay_ms(100);
            output_b(0b00011111);
            delay_ms(100);
            output_b(0b00001111);
            delay_ms(100);
            output_b(0b00000111);
            delay_ms(100);
            output_b(0b00000011);
            delay_ms(100);
            output_b(0b00000001);
            delay_ms(100);
            output_b(0b00000000);
            delay_ms(100);
            break;  
         }  
      }
   }
}

sifirzero

Alıntı yapılan: lftwing123 - 06 Ağustos 2021, 14:19:27Merhabalar,
16f877a ile butona her bastığımda animasyon modunu değiştirip sıradaki mod döngüsüne geçmesini istiyorum. İlk önce Timer olmadan if ile butonu kontrol ettirmeye çalıştım ama yapamadım, devre düzgün çalışmadı. Timer0 ile çok daha güzel sonuç aldım ama butona basıldığında her bir modun içini tamamlayıp ondan sonra mod değiştiriyor. Case1 ve Case2 gibi kısa kodlarda sorun olmuyor ama Case4 gibi uzun kodlarda animasyonun bitmesini beklemek zorunda kalıyorum.
Timerlı kullanımda butona basıldığı anda hemen mod değişikliğini sağlamak için ne yapmam gerekir?
Case4'teki gibi uzun uzun animasyon tanımlamanın sakıncası olur mu illaki döngülerle mi yapılmalıdır?
Teşekkürler.

#include <16f877a.h> 
#use delay(clock=4000000) 
#fuses XT,NOWDT,NOPUT,NOLVP,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOCPD
#use fast_io(a)
#use fast_io(b)

int mod=0;
int i;
int sonuc;

#int_timer0
void sayici()
{
   set_timer0(255);
   mod++;
   if(mod>4)
   mod=1;
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   set_tris_a(0b00010000);
   set_tris_b(0b00000000);
   output_b(0b00000000);
   
   while(true)
   {
      setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);// 1 bölme oranı. (256-255)*1=1=sayma sayısı
      set_timer0(255);//(256-255) 
      enable_interrupts(INT_timer0);
      enable_interrupts(GLOBAL);

      switch(mod)
      {
         case 1:
         {
            output_b(0xFF);
            delay_ms(100);
            output_b(0x00);
            delay_ms(100);
            break;
         }
         case 2:
         {
            output_b(0b10101010);
            delay_ms(100);
            output_b(0b01010101);
            delay_ms(100);
            break;
         }
         case 3:
         {
            sonuc=1;
            for(i=0;i<9;i++)
               {
                  output_b((sonuc-1));
                  delay_ms(100);  
                  sonuc=sonuc*2;
                  if(i==9) i=0;
               }
            break;
         }
         case 4:
         {
            output_b(0b00000000);
            delay_ms(100);
            output_b(0b00000001);
            delay_ms(100);
            output_b(0b00000011);
            delay_ms(100);
            output_b(0b00000111);
            delay_ms(100);
            output_b(0b00001111);
            delay_ms(100);
            output_b(0b00011111);
            delay_ms(100);
            output_b(0b00111111);
            delay_ms(100);
            output_b(0b01111111);
            delay_ms(100);
            output_b(0b11111111);
            delay_ms(100);
            output_b(0b11111110);
            delay_ms(100);
            output_b(0b11111100);
            delay_ms(100);
            output_b(0b11111000);
            delay_ms(100);
            output_b(0b11110000);
            delay_ms(100);
            output_b(0b11100000);
            delay_ms(100);
            output_b(0b11000000);
            delay_ms(100);
            output_b(0b10000000);
            delay_ms(100);
            output_b(0b00000000);//
            delay_ms(100);
            output_b(0b10000000);
            delay_ms(100);
            output_b(0b11000000);
            delay_ms(100);
            output_b(0b11100000);
            delay_ms(100);
            output_b(0b11110000);
            delay_ms(100);
            output_b(0b11111000);
            delay_ms(100);
            output_b(0b11111100);
            delay_ms(100);
            output_b(0b11111110);
            delay_ms(100);
            output_b(0b11111111);
            delay_ms(100);
            output_b(0b01111111);
            delay_ms(100);
            output_b(0b00111111);
            delay_ms(100);
            output_b(0b00011111);
            delay_ms(100);
            output_b(0b00001111);
            delay_ms(100);
            output_b(0b00000111);
            delay_ms(100);
            output_b(0b00000011);
            delay_ms(100);
            output_b(0b00000001);
            delay_ms(100);
            output_b(0b00000000);
            delay_ms(100);
            break;  
         }  
      }
   }
}
Kesme kullanarakta animasyon bitmeden baska animasyona gecer.

https://www.sifirzero.com/?m=1

Ornekler bu web sitede var bakabilirsin.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

rree

Kendin özel delay  fonksiyonu yaz. delay fonksiyonu içinde mod kontrolu olsun. Mod değişince case işlemini "break;"
komutu ile başa dönsün.

lftwing123

Alıntı yapılan: sifirzero - 06 Ağustos 2021, 15:53:47Kesme kullanarakta animasyon bitmeden baska animasyona gecer.

https://www.sifirzero.com/?m=1

Ornekler bu web sitede var bakabilirsin.
Hocam hepsine baktım ama bulamadım ya da gözden kaçırdım.
Alıntı yapılan: rree - 06 Ağustos 2021, 16:12:05Kendin özel delay  fonksiyonu yaz. delay fonksiyonu içinde mod kontrolu olsun. Mod değişince case işlemini "break;"
komutu ile başa dönsün.
Hocam ufak bir örnek kod yazabilir misiniz yol göstermesi için.

rree

#4
void delayBnm(int16 Gecikmedegeri){
     int16 i,modyedek;
     modyedek=mod;
     for (i=1;i<=Gecikmedegeri;i++;){
        if(mod=!modyed){ break;}
      }
    }

tekosis

Alıntı yapılan: lftwing123 - 06 Ağustos 2021, 17:53:40Hocam ufak bir örnek kod yazabilir misiniz yol göstermesi için.
Dersin içeriğini izlemedim, arkadaş iyi anlatmış mı bilemem ama öğrenmeniz gereken konu dış kesmeler.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

rree

Birde şunu dene bende merak ediyorrum çalışırmı?
#int_timer0
void sayici()
{
   set_timer0(255);
   mod++;
   if(mod>4)
   mod=1;
   break;
}

lftwing123

Alıntı yapılan: rree - 06 Ağustos 2021, 23:43:36void delayBnm(int16 Gecikmedegeri){
    int16 i,modyedek;
    modyedek=mod;
    for (i=1;i<=Gecikmedegeri;i++;){
        if(mod=!modyed){ break;}
      }
    }
Fonksiyonla da yapamadım ama teşekkürler.
Case içindeki tüm modları döngü ile yazarak kısalttım, output_b komutu her Case'de 2-3 taneye düşmüş oldu, her output_b komutundan önce if(mod!=X) break; komutu ekleyerek halletmiş oldum. Pice biraz amelelik yaptırmış gibi oldum ama son halini tekrar atıyorum :)

#include <16f877a.h> 
#use delay(clock=4000000) 
#fuses XT,NOWDT,NOPUT,NOLVP,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT,NOCPD
#use fast_io(a)
#use fast_io(b)

int mod=0;
long int j,i;

#int_timer0
void sayici()
{
  set_timer0(255);
  mod++;
  if(mod>9)
  mod=1;
}

void main()
{
  setup_psp(PSP_DISABLED);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  setup_CCP1(CCP_OFF);
  setup_CCP2(CCP_OFF);
  
  set_tris_a(0b00010000);
  set_tris_b(0b00000000);
  output_b(0b00000000);
  
  while(true)
  {
      setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);// 1 bölme oranı. (256-255)*1=1=sayma sayısı
      set_timer0(255);//(256-255) 
      enable_interrupts(INT_timer0);
      enable_interrupts(GLOBAL);

      switch(mod)
      {
        case 1:
        {
            if(mod!=1) break;
            output_b(0xFF);
            delay_ms(100);
            if(mod!=1) break;
            output_b(0x00);
            delay_ms(100);
            break;
        }
        case 2:
        {
            if(mod!=2) break;
            output_b(0b10101010);
            delay_ms(100);
            if(mod!=2) break;
            output_b(0b01010101);
            delay_ms(100);
            break;
        }
        case 3:
        {
            for(j=1;j<=256;)
            {
              if(mod!=3) break;
              output_b((j-1));
              delay_ms(100);  
              j=j*2; 
              }
            break;
        }
        case 4:
        {
            for(j=1;j<=256;)
            {
              if(mod!=4) break;
              output_b((j-1));
              delay_ms(100);
              j=j*2;
            }
            for(j=1;j<=256;)
            {
              if(mod!=4) break;
              output_b((256-j));
              delay_ms(100);
              j=j*2;
            }
            for(j=128;j>=1;)
            {
              if(mod!=4) break;
              output_b((256-j));
              delay_ms(100);
              j=j/2;
            }
            for(j=128;j>1;)
            {
              if(mod!=4) break;
              output_b(255+j);
              delay_ms(100);
              j=j/2;
            }
            break; 
        }
        case 5:
        {
            for(j=1;j<=16;)
            {
              if(mod!=5) break;
              output_b((256/j)-j);
              delay_ms(100);
              j=j*2;
            }
            for(j=16;j>=1;)
            {
              if(mod!=5) break;
              output_b((256/j)-j);
              delay_ms(100);
              j=j/2;
            }
            break;        
        }
        case 6:
        {
            for(j=1;j<=128;)
            {
              if(mod!=6) break;
              output_b(j);
              delay_ms(100);
              j=j*2; 
            }
            for(j=64;j>=2;)
            {
              if(mod!=6) break;
              output_b(j);
              delay_ms(100);
              j=j/2;
            }
            break;
        }
        case 7:
        {
            for(j=1,i=128;j<=128,i>=1;)
            {
              if(mod!=7) break;
              output_b(i+j);
              delay_ms(100);
              j=j*2;
              i=i/2; 
            }
            for(j=128,i=1;j>=1,i<=128;)
            {
              if(mod!=7) break;
              output_b(i+j);
              delay_ms(100);
              j=j/2;
              i=i*2; 
            }
            break;  
        } 
        case 8:
        {
            for(j=1;j<=128;)
            {
              if(mod!=8) break;
              output_b(255-j);
              delay_ms(100);
              j=j*2;
            }
            for(j=64;j>=2;)
            {
              if(mod!=8) break;
              output_b(255-j);
              delay_ms(100);
              j=j/2;
            }
            break;  
        }
        case 9:
        {
            if(mod!=9) break;
            output_b(0b11110000);
            delay_ms(100);
            if(mod!=9) break;
            output_b(0b00001111);
            delay_ms(100);
            break;
        }  
      }
  }
}