4x3 Tuş Takımı ile PWM yardımı

Başlatan overlok, 22 Şubat 2017, 00:42:31

overlok

Merhabalar;
Elimde 1. tuşa basılınca tam, 2. tuşta en az parlaklıkta, 3 tuşta ise yarım olacak şekilde yanan led uygulaması kodları var. Bu kodları, butonları kaldırıp 4x3 tuş takımı ekleyerek hangi tuşa basıldıysa (örneğin 1 nolu tuşa basınca en az parlaklıkta, 9 nolu tuşa basınca en yüksek parlaklıkta, 0 nolu tuşa basınca tamamen sönecek şekilde) ona göre ledin parlaklığını ayarlamak istiyorum . Yardımcı olur musunuz? Elinde hazır kod olan var mıdır?
Elimdeki kodlar:
/*
 Lab 9: Pulse Width Modulation
 Copyright @ Rajendra Bhatt, 2010.
 Description: CCP module generating PWM
 MCU: PIC16F628A
 Oscillator: XT, 4.0 MHz, MCLR Enabled
*/
 sbit UP at RB0_bit;
 sbit DOWN at RB1_bit;
 sbit CENTER at RB2_bit;
 unsigned short new_DC, current_DC;

 void debounce(){
  Delay_ms(300);
 }

 void main() {
 CMCON = 0x07; // Disable comparators
 PORTB = 0x00;
 TRISB = 0b00000111; // RB0, RB1 input, RB3 (PWM1) output
 PWM1_Init(5000);    // PWM module initialization (5KHz)
 new_DC = 0;         // Initial value of variable Duty Cycle
 current_DC = 0;
 PWM1_Start();       // Start PWM1 module with Zero DC
 PWM1_Set_Duty(current_DC);
 do {
  if (!UP){      // If the button connected to RB0 is pressed
   debounce();
   if (new_DC < 250)      // Don't go above 250
   new_DC = 249 ; // increment Duty Cycle by 25
  }
  if (!DOWN) {   // If the button connected to RB1 is pressed
   debounce();
   if (new_DC !=0)        // Don't go below 0
   new_DC= 1 ; // Decrement Duty Cycle by 25
  }
  if (!CENTER) {   // If the button connected to RB1 is pressed
   debounce();
   if (new_DC !=1 | 249)        // Don't go below 0
   new_DC= 100 ; // Decrement Duty Cycle by 25
  }
  if (current_DC != new_DC) {
   current_DC = new_DC ;
   PWM1_Set_Duty(current_DC); // Change the current DC to new value
  }
 } while(1);
}  // END main()
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

vitruvius

Niye her şey için hazır kod isteniyor anlayamıyorum. Biraz düşünüp üretsek olmuyor mu?

İstediğin şey zor bir şey değil. Projeyi iki aşamaya böl.


  • Kullandığın işlemci ile PWM sinyal üret ve çıkışa bir adet led bağla ve bunun parlaklığını kontrol et.
  • 4x3 keypad'ini işlemcine bağla ve bazı tuşlara bastığında değişik led'ler yak. 74C922 gibi bir encoder kullanacağını düşünürsek datasheet'ini okursan zaten gayet basit bir doğruluk tablosu var. Hangi durumda ne gibi çıkış alacağını takip edebilirsin. Kodunu da buna göre yazarsın.

overlok

@vitruvius
Yaşım 35, grafikerim. Hobiciyim. Biraz düşünebilmek için temeli olması gerekiyor insanın.
Kodun orijinali 2 tuşluydu. Tuşlara her basışta parlaklık artıp /azalıyordu. 3 tuşlu olarak yukarıdaki haline çevirdim ama 4x3 tuş takımı olarak kafam almadı.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

mehmet

Farklı meslek ve yaşlardan arkadaşlarımız,
abilerimiz var burada. Hala bir şeylerle
uğraşmaktadırlar. Yaş olayının arkasina
saklanmayalım. Siz de gençsiniz daha. ;)

Eğer bu tür işleri şip-şak halletmek istiyorsanız
Arduino iyi bir çözüm olacaktır. Çok fazla
hazır örnek bulabilirsiniz.
Kolaylıklar.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

overlok

Haklısınız, yaşımın yanında yaptığım iş yorucu, pek zaman bırakmıyor.
Aklımda şimdi bir iki çözüm var aslında yapmak istediğimle alakalı ama tarzanca olacak. Artık akşam deneme yaparım.
Arduino iyi güzel ama yani yaptığım şey kalıcı olsun, yapıp yapıp bırakıyorum arduinoda. Hazır elimde boşta picler varken, değerlendirmek istedim
Hanımların dikkatine, overlok makinesi ayağınıza geldi!

vitruvius

Bir devre semasi koyarsaniz da fena olmaz.

Ben de dil tavsiyesinde bulunayim o zaman. CCS C ile bu isleri yapmak cok daha kolay olur.

dnacikaya

@overlok bence örnek kodlarla bu işi çözemezsiniz. Böyle bir projeyi siz yapmalısınız. Ama mantığı bilirseniz olur. Önce tuş takımına hakim olun. Tarama yöntemiyle 0dan 9a kadar tuşları portta görün. 2Ye basınca porta 2 yazın. Yada 9 tane ledi 0-9 değeri için kullanın. Sonra pwm değerini portta okuduğunuz değere göre değiştirin. Bu projeyi yaparsanız hem pwm hem tuştakımı kullanmayı öğrenirsiniz. Eğer c ile zorlanıyorsanız basic ile daha kolay olur. Adım adım giderseniz işler daha kolay çözülür.

overlok

Alıntı yapılan: dnacikaya - 22 Şubat 2017, 11:55:56
@overlok bence örnek kodlarla bu işi çözemezsiniz. Böyle bir projeyi siz yapmalısınız. Ama mantığı bilirseniz olur. Önce tuş takımına hakim olun. Tarama yöntemiyle 0dan 9a kadar tuşları portta görün. 2Ye basınca porta 2 yazın. Yada 9 tane ledi 0-9 değeri için kullanın. Sonra pwm değerini portta okuduğunuz değere göre değiştirin. Bu projeyi yaparsanız hem pwm hem tuştakımı kullanmayı öğrenirsiniz. Eğer c ile zorlanıyorsanız basic ile daha kolay olur. Adım adım giderseniz işler daha kolay çözülür.

Alıntı yapılan: vitruvius - 22 Şubat 2017, 11:19:33
Bir devre semasi koyarsaniz da fena olmaz.

Ben de dil tavsiyesinde bulunayim o zaman. CCS C ile bu isleri yapmak cok daha kolay olur.
Zamanında çok istemiştim CCS C öğrenmeyi, hatta Serdar Çiçek'in kitabını da almıştım. Bakalım zamanla öğrenmeye çalışıcam.

Devre bu.


Orijinal kodlar da bunlar:
/*
 Lab 9: Pulse Width Modulation
 Copyright @ Rajendra Bhatt, 2010.
 Description: CCP module generating PWM
 MCU: PIC16F628A
 Oscillator: XT, 4.0 MHz, MCLR Enabled
*/
 sbit UP at RB0_bit;
 sbit DOWN at RB1_bit;
 unsigned short new_DC, current_DC;

 void debounce(){
  Delay_ms(300);
 }

 void main() {
 CMCON = 0x07; // Disable comparators
 PORTB = 0x00; 
 TRISB = 0b00000011; // RB0, RB1 input, RB3 (PWM1) output
 PWM1_Init(5000);    // PWM module initialization (5KHz)
 new_DC = 0;         // Initial value of variable Duty Cycle
 current_DC = 0;
 PWM1_Start();       // Start PWM1 module with Zero DC
 PWM1_Set_Duty(current_DC);
 do {
  if (!UP){      // If the button connected to RB0 is pressed
   debounce();
   if (new_DC < 250)      // Don't go above 250
   new_DC = new_DC + 25 ; // increment Duty Cycle by 25
  }
  if (!DOWN) {   // If the button connected to RB1 is pressed
   debounce();
   if (new_DC !=0)        // Don't go below 0
   new_DC= new_DC - 25 ; // Decrement Duty Cycle by 25
  }
  if (current_DC != new_DC) {
   current_DC = new_DC ;
   PWM1_Set_Duty(current_DC); // Change the current DC to new value
  }
 } while(1);
}  // END main()

Hanımların dikkatine, overlok makinesi ayağınıza geldi!

vitruvius


Salih

CCS ile yapılmış bir tuş okuma fonksiyon örneği vereyim.
Sana bir fikir verir.

char Tus_Oku()
{      
      Output_High(Pin_B4);
      Output_High(Pin_B5);
      Output_High(Pin_B6);      
      Output_Low(Pin_B4);
      Delay_ms(1);
      if (!input(Pin_B0)) Return('1');
      if (!input(Pin_B1)) Return('4');
      if (!input(Pin_B2)) Return('7');
      if (!input(Pin_B3)) Return('*');
      Output_High(Pin_B4);
      Output_Low(Pin_B5);
      Delay_ms(1);
      if (!input(Pin_B0)) Return('2');
      if (!input(Pin_B1)) Return('5');
      if (!input(Pin_B2)) Return('8');
      if (!input(Pin_B3)) Return('0');
      Output_High(Pin_B5);
      Output_Low(Pin_B6);      
      Delay_ms(1);            
      if (!input(Pin_B0)) Return('3');
      if (!input(Pin_B1)) Return('6');
      if (!input(Pin_B2)) Return('9');
      if (!input(Pin_B3)) Return('#');
      Output_High(Pin_B6);
      Return(0);
}


Keypad bağlantısı


vitruvius

Bir şey diyeceğim eğer Serdar Çiçek'in kitabı varsa orada PWM uygulaması da tuş takımı uygulaması da var. Onları okursan kendin halledersin bence. Dediğim gibi iki aşamaya ayır  projeyi. İkisini de tek tek yap, sonra birleştirirsin.

JOKERAS

Overlok usta,vitruvius doğru söylüyor.
Yamalı bohça gibi oradan bir kod buradan bir kod sonra bunları birleştirip kod yazmak pek hoş bir yöntem değil.
Sizin yapacağınız kompleks olan nokta Matrix Tuş okuma,önce onu yapın derim.

Matrix Tuş okuma öyle zor bir olay değil.Senaryo taslağı şu şekilde.Gerisini deteylandırın.

1) Satır ve sutunları sürekli tara.
2) İlgili Tuş basıldığı anda Debounce kontrolü yapıp hangi sutun ile hangi Satır öpüşmüş - hanshake  olmuş bunları tespit et.
3) Satır Sutunu tespit ettiysen hangi tuş basılmış onu da bulmuşsun demektir.
4) ilgili Tuşlar basıldığında PWM Duty'ini update et.Hepsi bu.





overlok

Alıntı yapılan: vitruvius - 22 Şubat 2017, 13:04:17
Tuş takımı bağlantısı nasıl?
Alıntı yapılan: vitruvius - 22 Şubat 2017, 14:18:31
Bir şey diyeceğim eğer Serdar Çiçek'in kitabı varsa orada PWM uygulaması da tuş takımı uygulaması da var. Onları okursan kendin halledersin bence. Dediğim gibi iki aşamaya ayır  projeyi. İkisini de tek tek yap, sonra birleştirirsin.

Alıntı yapılan: JOKERAS - 22 Şubat 2017, 14:35:31
Overlok usta,vitruvius doğru söylüyor.
Yamalı bohça gibi oradan bir kod buradan bir kod sonra bunları birleştirip kod yazmak pek hoş bir yöntem değil.
Sizin yapacağınız kompleks olan nokta Matrix Tuş okuma,önce onu yapın derim.

Matrix Tuş okuma öyle zor bir olay değil.Senaryo taslağı şu şekilde.Gerisini deteylandırın.

1) Satır ve sutunları sürekli tara.
2) İlgili Tuş basıldığı anda Debounce kontrolü yapıp hangi sutun ile hangi Satır öpüşmüş - hanshake  olmuş bunları tespit et.
3) Satır Sutunu tespit ettiysen hangi tuş basılmış onu da bulmuşsun demektir.
4) ilgili Tuşlar basıldığında PWM Duty'ini update et.Hepsi bu.



@vitruvius , @JOKERAS
Zaman buldukça bakayım o zaman. Bu kodlar mikroC ile yazılmış oluduğu için kod üzerinden gideyim istedim. Doğru yamalı bohça gibi oluyor ama napalım.
PortB= RB0, RB1, RB2, RB4 satır, RB5, RB6, RB7 sütun olarak düşünüyorum.

Alıntı yapılan: Salih - 22 Şubat 2017, 13:08:52
CCS ile yapılmış bir tuş okuma fonksiyon örneği vereyim.
Sana bir fikir verir.


@Salih hocam teşekkürler, aklıma bulunsun bu.

Hanımların dikkatine, overlok makinesi ayağınıza geldi!

pwm.c

#13
şunu dene bakalım:



#include <16F628A.h>
#FUSES INTRC_IO, PUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOPROTECT
#use delay(internal=4MHz)
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#define sat_d   PIN_A0
#define sat_c   PIN_A1
#define sat_b   PIN_A6
#define sat_a   PIN_A7
#define sut_1   PIN_B0
#define sut_2   PIN_B1
#define sut_3   PIN_B2

char tus;
int16 pwmduty=0;
char keypad_oku() 
{
   output_high(sut_1);
   output_high(sut_2);
   output_high(sut_3);
   tus=0;

   output_low(sut_1); 
   if (!input(sat_a))   
      { delay_ms(10); tus=1; }
   if (!input(sat_b))  
      { delay_ms(10); tus=4; }
   if (!input(sat_c))  
      { delay_ms(10); tus=7; }
   if (!input(sat_d))   
      { delay_ms(10); tus=0x0A; }
   output_high(sut_1); 

   output_low(sut_2); 
   if (!input(sat_a))   
      { delay_ms(10); tus=2; }
   if (!input(sat_b))  
      { delay_ms(10); tus=5; }
   if (!input(sat_c))  
      { delay_ms(10); tus=8; }
   if (!input(sat_d))   
      { delay_ms(10); tus=0x0B; }
   output_high(sut_2); 

   output_low(sut_3); 
   if (!input(sat_a))   
      { delay_ms(10); tus=3; }
   if (!input(sat_b))  
      { delay_ms(10); tus=6; }
   if (!input(sat_c))  
      { delay_ms(10); tus=9; }
   if (!input(sat_d))   
      { delay_ms(10); tus=0x0C; }
   output_high(sut_3); 
     
   return tus; 
}
void main() {
   setup_timer_2(T2_DIV_BY_1,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty((int16)0);
   set_tris_a(0xFF);
   delay_ms(250);

   while(TRUE){
   keypad_oku();
   if(tus==1){pwmduty=100;set_pwm1_duty(pwmduty);}
   if(tus==2){pwmduty=200;set_pwm1_duty(pwmduty);}
   if(tus==3){pwmduty=300;set_pwm1_duty(pwmduty);}
   if(tus==4){pwmduty=400;set_pwm1_duty(pwmduty);}
   if(tus==5){pwmduty=500;set_pwm1_duty(pwmduty);}
   if(tus==6){pwmduty=600;set_pwm1_duty(pwmduty);}
   if(tus==7){pwmduty=700;set_pwm1_duty(pwmduty);}
   if(tus==8){pwmduty=800;set_pwm1_duty(pwmduty);}
   if(tus==9){pwmduty=900;set_pwm1_duty(pwmduty);}
   if(tus==0x0A){if(pwmduty>0){--pwmduty;}set_pwm1_duty(pwmduty);}
   if(tus==0x0B){pwmduty=0;set_pwm1_duty(pwmduty);}
   if(tus==0x0C){if(++pwmduty>1000){pwmduty=1000;}set_pwm1_duty(pwmduty);}
   }

}


hex:
:1000000000308A00BD2800002330840083130008DC
:10001000031918280130F800F701F70B0D28F80B29
:100020000C284A30F700F70B13281628800B0A28F3
:10003000080000308316860083120614831686009B
:10004000831286148316860083120615A001831678
:10005000860083120610831685178312851B3528A8
:100060000A30A30004200130A00083160517831274
:10007000051B3F280A30A30004200430A00083168B
:1000800085148312851849280A30A30004200730FC
:10009000A000831605148312051853280A30A30004
:1000A00004200A30A0000030831686008312061454
:1000B0008316860083128610831685178312851B8C
:1000C00066280A30A30004200230A000831605171A
:1000D0008312051B70280A30A30004200530A000FD
:1000E00083168514831285187A280A30A300042009
:1000F0000830A000831605148312051884280A30DE
:10010000A30004200B30A000003083168600831269
:1001100086148316860083120611831685178312B0
:10012000851B97280A30A30004200330A000831603
:1001300005178312051BA1280A30A30004200630EE
:10014000A0008316851483128518AB280A30A300FB
:1001500004200930A0008316051483120518B52861
:100160000A30A30004200C30A00000308316860063
:10017000831206152008F800E12803081F398300C0
:1001800083168E158312A201A10107309F008313ED
:100190000030F80004389200FF30831692000030DF
:1001A0008600831286110C30970095011708CF390D
:1001B0009700FF3083168500FA308312A3000420D5
:1001C0001928200BF928A2016430A1002208F900A7
:1001D0002108F800F90CF80CF90CF80CF90C780867
:1001E0009500F90C790C3039F7001708CF397704EE
:1001F00097002008023C031D1329A201C830A1006A
:100200002208F9002108F800F90CF80CF90CF80C98
:10021000F90C78089500F90C790C3039F7001708BB
:10022000CF39770497002008033C031D2E290130A5
:10023000A2002C30A1002208F9002108F800F90CD6
:10024000F80CF90CF80CF90C78089500F90C790CFD
:100250003039F7001708CF39770497002008043C9D
:10026000031D49290130A2009030A1002208F900A5
:100270002108F800F90CF80CF90CF80CF90C7808C6
:100280009500F90C790C3039F7001708CF3977044D
:1002900097002008053C031D64290130A200F430BA
:1002A000A1002208F9002108F800F90CF80CF90C5B
:1002B000F80CF90C78089500F90C790C3039F70036
:1002C0001708CF39770497002008063C031D7F29C3
:1002D0000230A2005830A1002208F9002108F800DD
:1002E000F90CF80CF90CF80CF90C78089500F90CDD
:1002F000790C3039F7001708CF39770497002008B8
:10030000073C031D9A290230A200BC30A10022083C
:10031000F9002108F800F90CF80CF90CF80CF90CAC
:1003200078089500F90C790C3039F7001708CF39A7
:10033000770497002008083C031DB5290330A2006C
:100340002030A1002208F9002108F800F90CF80C6F
:10035000F90CF80CF90C78089500F90C790C303987
:10036000F7001708CF39770497002008093C031DD0
:10037000D0290330A2008430A1002208F90021080E
:10038000F800F90CF80CF90CF80CF90C7808950049
:10039000F90C790C3039F7001708CF39770497003A
:1003A00020080A3C031DF129A108031DDA29A2082F
:1003B0000319DE2921080319A203A1032208F90069
:1003C0002108F800F90CF80CF90CF80CF90C780875
:1003D0009500F90C790C3039F7001708CF397704FC
:1003E000970020080B3C031D0A2AA201A101220844
:1003F000F9002108F800F90CF80CF90CF80CF90CCC
:1004000078089500F90C790C3039F7001708CF39C6
:100410007704970020080C3C031D332AA10A031916
:10042000A20A2208023C0318202AFF3A031D1C2AB4
:100430002108E83C0318202A0330A200E830A1007C
:100440002208F9002108F800F90CF80CF90CF80C56
:10045000F90C78089500F90C790C3039F700170879
:0A046000CF3977049700E02863000D
:02400E00103F61
:00000001FF
;PIC16F628A
;CRC=B9B7  CREATED="22-Şub-17 19:39"





_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

overlok

@pwm.c Valla hocam ne diyeceğimi şaşırdım. Gerçekten çok teşekkürler. Kod gayet iyi çalışıyor. Tam aklımdaki gibi olmuş. özellike * ve # tuşları böyle düşünüyodum hakikatten. Tekrar çok teşekkürler.
Hanımların dikkatine, overlok makinesi ayağınıza geldi!