avatar_POWER

ır kumanda

Başlatan POWER, 13 Aralık 2021, 21:55:36

POWER

#45
İyi geceler hocam,
Başlangıç sinyalini 12,35ms high+1ms low olarak görünüyor.Burda 1ms low sinyalini yakalayacağım için 1ms=1000us
1000us/10=100
  PULSIN IR_Goz,0,TAMAM   
      IF TAMAM >90 AND TAMAM<110 THEN   
         for X=0 to 10             
           pulsin IR_Goz,0,IR_AL(X)
         next 
         ALDIM=1 
      ENDIF 
şeklinde ayarlayarak sinyalin low kısmına bakmak istedim çalışmadı.Şöyle bir durum var,Burdaki IF şartını iptal ettiğim zaman sinyalin hıgh kısmına bakıyor ve istediğim işlemi yaptırabiliyorum.Fakat low kısmını ölçmek için
PULSIN IR_Goz,0,TAMAM  
şeklinde düzeltirsem işlem yapmıyor.If satırı aktif ise her iki şekildede çalışmıyor.Yani sinyalin low kısmınada hıgh kısmınada bakmıyor.



ete

NEC protokolü ile bu sinyalin çözülmesi zor gözüküyor ekstra eklentiler gerekiyor.
Sinyal şekline bakarsak,
- 12,35ms uzun HIGH
- 1 ms low
- yaklaşık 0,5ms HIGH
işte bu aşamdan sonra bana kalırsa asıl kod başlıyor.
Bu durumda bizim önce uzun HIGH sinyalini yakalamamız lazım. Ancak programın başında yer alan DEFINE PULSIN_MAX... şeklindeki satırı ya silmemiz yada rakamı 1500 yapmamız lazım.

TEKRAR:
PULSIN IR_Goz,1,tamam
IF TAMAM<1000 THEN TEKRAR
Bu kod parçası yine KESME de en başa yerleşebilir.
Arkasına heme PULSIN IR_Goz,1,TAMAM satırını ekleyip birinci HIGH palsini bulup atlamak lazım.
Hemen arkasına artık gelen dataları HIGH bakarak almak lazım
O da,
    
for X=0 to 10             
  pulsin IR_Goz,1,IR_AL(X)
next 
ALDIM=1 
şeklinde olmalı.
Bu şekilde data lar alındıktan sonra ana program içindeki

     
TUS=0
for X=0 to 7
  IF IR_AL(X)>60 then TUS.0[X]=1    '
next 
şeklinde çözümlemeyi yapmak lazım.
Bu şekilde dene bakalım.
Şunu unutma toplam 11 bit okudun ama bunun hangisi tuş kodu hangisi cihaz kodu şu anda bilmiyoruz.
Önce en baştaki 8 bite bir bak sonra sondaki 8 bite bak istersen.
Yada hepsini birden değerlendir.

Ete

POWER

#47
Hocam iyi günler,
Proğramı söylediğiniz şekilde düzenledim çalışıyor.Söylediğiniz gibi,önce 8 bit okudum daha sonra sonraki 8 bit'e baktım daha sonra tamamını yani 11 bit okudum sorun olmadı.Porta.6 ya bağlı led toggle olarak çalışıyor.Tuşu sürekli basılı tutarsam 3 kez flaş yapıp yanık olarak kalıyor.Tuşun sinyaline baktığım zaman,tuşu sürekli basılı tutarsam basılı tuttuğum sürece aynı kodu sürekli tekrarlıyor.O zaman ledin sürekli(yada daha fazla sayıda) flaş yapması gerekmezmiydi? Burasını anlayamadım.Birde bu ledin toggle çalışması sağlıklı olmuyor o yüzden tek tuşla on-off şeklinde çalıştırmak içinde çok uğraştım.Daha önceki konulardan hatırladığım, aldım=1 ise tuşa basılıyor aldım=0 ise tuş bırakılmış gibi bir mantık vardı.Burdan yola çıkarakda uğraştım olamadı.Sonra "aldım" ve "say" değişkenlerinin aldığı değerleri tam olarak göreyim diye lcd ekranlı bi deneme kartım vardı oraya uyarladım denemeler yaptım.Proğmamın mantığına göre,aldım=0 ise say değişkeninin sayması lazım ama bazen sayıyor bazen saymıyor bazende misal 455 de duruyor. Aldım değişkenide düzenli olarak tuşa basılı ise 1 bırakılmışsa 0 değerini almıyor.Yani bazen alıyor bazen almıyor.Böyle olunca ilgili ledi on-off olarak çalıştıramadım hocam.Bunun için öneriniz ne olablir.Teşekkürler.

ete

İşlemci ne emredersen onu yapar. Emretmediklerinide yapmaz.
Kod'u görmeden kim ne yapıyor ne yapmıyor söylemem imkansız.
Ledin yanması için bir şart oluşturuyor isen sönmesi içinde bir şart oluşturmak gerekir.
Bir sistemi on - off çalıştırmak istiyor isen öncelikle on olması koşulunu gözleyip yakaladığın anda on yapmalısın. Sonra sinyalin kesildiği anı kollaman gerekir. AKsi halde On durumu bir on olur bir off olur. Garip bir anlatım oldu ama dediklerim doğru

Ete

POWER

Hocam iyi geceler,
Verdiğim bu kod üzerinde, tüm denemelerime rağmen ilgili ledi on-off olarak çalıştırmayı başaramadım.Daha doğrusu tuşun bırakıldığı anı yakalayamadım.Bir çok yöntem denedim ama olmadı.Yardımınıza ihtiyacım var hocam.Verdiğim kod satırlarında led toggle olarak çalışıyor.Yaptığım denemeleri buraya koymadım zaten çorba olmuştu.
define OSC 4
Include "MODEDEFS.BAS"
@ DEVICE pic16F628A
@ DEVICE PIC16F628A, WDT_Off
@ DEVICE PIC16F628A, LVP_Off
@ DEVICE PIC16F628A, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F628A, MCLR_Off
@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

DEFINE PULSIN_MAX 15000

TRISA=%00000000
TRISB=%00000001        
PORTA=0
PORTB=0

INTCON=%10010000         
OPTION_REG=%10000000  
CMCON = 7
ON INTERRUPT GoTo KESME   

SYMBOL LED=PORTA.6
SYMBOL IR_GOZ=PORTB.0

Paket var word 56
TAMAM VAR word 58
Tus   Var WORD 60
IR_AL var byte(32)62
X     var byte 100
SAY   VAR WORD 102
ALDIM VAR BIT

PAUSE 250

BASLA:
       SAY=0
    while ALDIM=0
       SAY=SAY+1
    WEND
       ALDIM=0
       TUS=0
    for X=0 to 10
       IF IR_AL(X)>70 then TUS.0[X]=1 '0.bit den itibaren gelen 10 bit ise komut bitleri oluyor
    next 

IF Tus=1229  THEN  '1229
     TOGGLE LED
     PAUSE 200 
ENDIF
   
      GOTO BASLA           

DISABLE 'yeniden kesme oluşması önleniyor  
KESME:  'program buraya geldiğinde kesme oluşmuş demektir.
   TEKRAR:
        PULSIN IR_Goz,1,tamam
        IF TAMAM<1000 THEN TEKRAR
        PULSIN IR_Goz,1,TAMAM   
     for X=0 to 10            
        pulsin IR_Goz,1,IR_AL(X)
     next 
        ALDIM=1 
GECGIT:
       SAY=0      
       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
       Resume      'geldiğin yere dön.
   Enable          'kesmeler yeniden aktif.
End

ete

Aşağıdaki kodu dene bakalım.
Programınbaşındaki DEFINE PULSIN_MAX 15000 komut satırındaki 15000 bence yanlış değer 1500 olmalı.
Pulsin daima 10 a bölünmüş miktarı verir. 15 ms bakacak isek bunun pulsin karşılığı 15000/10=1500 dür. Bu kısmı 1500 yaptım.
Option Registeri 6.cı bitini 1 yapmak lazım yükselen kenarda kesme oluşsun diye. Onuda düzelttim.
Tam olarak ne istediğini anlamamakla birikte sanki tuşa basılınca led yansın bırakınca sönsün istiyorsun gibi geldi kodu ona göre düzelttim. Farklı bir şey istiyorsan da kodun içinde tuşun bırakılma anı da yer almakta. Bırakılma anı nasıl yakalanır ona kafa yoralım istersen.
Tuşa bastığın müddetçe puls gelmekte ve buda kesme oluşmasına sebep olmaktadır. Tuşu bıraktığın anda ise düz HIGH sinyali geldiğinden dolayı pulslar kesilmektedir. İşte ip ucumuz bu olmalı. Puls kesilince ALDIM=0 da kalacak hiç bir zaman 1 olmayacak ve bizim sayac bu esnada sayıp 700 rakamını buluncaya kadar kesme olmaz ise tuş bırakıldı anlamına gelecektir.
Kodu bu mantığa göre yeniden düzenledim. Umarım çalışır.

Ete

define OSC 4
	Include "MODEDEFS.BAS"
	@ DEVICE pic16F628A
	@ DEVICE PIC16F628A, WDT_Off
	@ DEVICE PIC16F628A, LVP_Off
	@ DEVICE PIC16F628A, PWRT_ON             'Power on timer açık
	@ DEVICE PIC16F628A, MCLR_Off
	@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
	@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
	 
	DEFINE PULSIN_MAX 1500
	 
	TRISA=%00000000
	TRISB=%00000001        
	PORTA=0
	PORTB=0
	 
	INTCON=%10010000         
	OPTION_REG=%11000000  
	CMCON = 7
	ON INTERRUPT GoTo KESME   
	 
	SYMBOL LED=PORTA.6
	SYMBOL IR_GOZ=PORTB.0
	 
	Paket var word 56
	TAMAM VAR word 58
	Tus   Var WORD 60
	IR_AL var byte(32)62
	X     var byte 100
	SAY   VAR WORD 102
	ALDIM VAR BIT
	 
	PAUSE 250
	 
	BASLA:
	      ALDIM=0
	      WHILE ALDIM=0:WEND
	      ALDIM=0
	      TUS=0
   	      for X=0 to 10
	         IF IR_AL(X)>60 then TUS.0[X]=1 '0.bit den itibaren gelen 10 bit ise komut bitleri oluyor
	      next 
	 
	      IF Tus=1229  THEN  '1229
	        LED=1
TEKRAR_BAK:	        
	        SAY=0
	        WHILE ALDIM=0
	          SAY=SAY+1
	          IF SAY=700 THEN 
                 LED=0 'BU NOKTA TUŞUN BIRAKILDIĞI ANDIR. 700 RAKAMI İLE OYNAMAK GEREKEBİLİR                 
                 GOTO BASLA
	        WEND
	        ALDIM=0
            GOTO TEKRAR_BAK 'ALDIM=1 OLUNCA BURAYA GELECEK YENİDEN BAKACAĞIZ ALDIM=0 DA KALMALI
	      ENDIF
	   
	      GOTO BASLA           
	 
	DISABLE 'yeniden kesme oluşması önleniyor  
	KESME:  'program buraya geldiğinde kesme oluşmuş demektir.
	   TEKRAR:
	        PULSIN IR_Goz,1,tamam
	        IF TAMAM<1000 THEN TEKRAR
	        PULSIN IR_Goz,1,TAMAM   
	     for X=0 to 10            
	        pulsin IR_Goz,1,IR_AL(X)
	     next 
	        ALDIM=1 
	GECGIT:
	       SAY=0      
	       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
	       Resume      'geldiğin yere dön.
	   Enable          'kesmeler yeniden aktif.
	End

POWER

#51
iyi geceler hocam,
Tam olarak istediğim,tuşa birkez basınca ledin yanması,aynı tuşa tekrar basınca ledin sönmesi.tuşa basılı tutulsa dahi flaş yapmaması.Derleme esnasında "Tekrar_Bak" başlığına ait kodlarda hata verdiği için "endif" yerini değiştirdim Yeni hali bu şekilde.Doğrudur umarım.Proğram çalışıyor fakat biraz kararsız gibi.Tuşa basılınca ledin yanması bırakılınca sönmesi gerekiyor proğram gereği.Fakat çoğu zaman yanan led tuş bırakılınca sönmüyor,yanık kalan led,tuşa 5-6 sefer bas bırak yapılırsa bazen sönebiliyor.Yani yanmasında problem yok,sönmesi biraz kararsız.Ayrıca denemelerimi deneme bordunda yapıyorum hocam.Say değeriylede çok oynadım ama pek etkisi olmadı.
TEKRAR_BAK:	        
	        SAY=0
	        WHILE ALDIM=0
	          SAY=SAY+1
	          IF SAY=715 THEN 
                LED=0 'BU NOKTA TUŞUN BIRAKILDIĞI ANDIR. 700 RAKAMI İLE OYNAMAK GEREKEBİLİR                 
                 GOTO BASLA
	          ENDIF
            WEND
	        ALDIM=0
            GOTO TEKRAR_BAK 'ALDIM=1 OLUNCA BURAYA GELECEK YENİDEN BAKACAĞIZ ALDIM=0 DA KALMALI
'ENDIF
	  GOTO BASLA   

ete

Sinyal içindeki puls süreleri kodun çalışmasını etkiliyor diye düşünüyorum.
Sinyal başlangıcını tespit edebildiğimizi düşünüyorum. Sorun başlangıçtan sonra alınan kodun çözülmesinde olsa gerek.
Şimdi siyal şekline tekrar baktım. Asıl kod içinde, kısa pulslar 496us-497us civarında hiç 500us olmamış. Uzunlarda bir adet 685us lik bir yer var sonrasında 1566 us lik pulslar yer alıyor.
neden 685 lik kısım var onu anlayamıyorum zira sinyalin hiç bir yerinde benzeri yok.Sinyalin geri kısmında LOW olarak nitelediğimiz kısım da HIGH ve LOW süreleri eşit gözüküyor. Bütün buları dikkate alarak yapabileceğimiz değişiklikleri aşağıdaki program yaptım zaten fazla bir yer değiştirmemizde mümkün değil. Bu kod yine kararlı çalışmıyor ise o kumandanın kararsızlığı diye düşünürüm. Başka da yapacak bir şey yok maalesef.

Ete

define OSC 4
		Include "MODEDEFS.BAS"
		@ DEVICE pic16F628A
		@ DEVICE PIC16F628A, WDT_Off
		@ DEVICE PIC16F628A, LVP_Off
		@ DEVICE PIC16F628A, PWRT_ON             'Power on timer açık
		@ DEVICE PIC16F628A, MCLR_Off
		@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
		@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
		 
		 
		TRISA=%00000000
		TRISB=%00000001        
		PORTA=0
		PORTB=0
		 
		INTCON=%10010000         
		OPTION_REG=%11000000  
		CMCON = 7
		ON INTERRUPT GoTo KESME   
		 
		SYMBOL LED=PORTA.6
		SYMBOL IR_GOZ=PORTB.0
		 
		Paket var word 56
		TAMAM VAR word 58
		Tus   Var WORD 60
		IR_AL var byte(32)62
		X     var byte  
		SAY   VAR WORD  
		ALDIM VAR BIT
		 
		PAUSE 250
		 
		BASLA:
		      ALDIM=0
		      WHILE ALDIM=0:WEND
		      ALDIM=0
		      TUS=0
	   	      for X=0 to 10
		         IF IR_AL(X)>50 then TUS.0[X]=1 '0.bit den itibaren gelen 10 bit ise komut bitleri oluyor
		      next 
		 
		      IF Tus=1229  THEN  '1229
		        LED=1-led
	TEKRAR_BAK:	        
		        SAY=0:ALDIM=0
		        WHILE ALDIM=0
		          SAY=SAY+1
		          IF SAY=700 THEN 
'	                 LED=0 'BU NOKTA TUŞUN BIRAKILDIĞI ANDIR. 700 RAKAMI İLE OYNAMAK GEREKEBİLİR                 
	                 GOTO BASLA
		        WEND
		        ALDIM=0
	            GOTO TEKRAR_BAK 'ALDIM=1 OLUNCA BURAYA GELECEK YENİDEN BAKACAĞIZ ALDIM=0 DA KALMALI
		      ENDIF
		   
		      GOTO BASLA           
		 
		DISABLE 'yeniden kesme oluşması önleniyor  
		KESME:  'program buraya geldiğinde kesme oluşmuş demektir.
		   TEKRAR:
		        PULSIN IR_Goz,1,tamam
		        IF TAMAM<900 THEN TEKRAR
		        PULSIN IR_Goz,1,TAMAM   
		     for X=0 to 10            
		        pulsin IR_Goz,1,IR_AL(X)
		     next 
		        ALDIM=1 
		GECGIT:
		       SAY=0      
		       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
		       Resume      'geldiğin yere dön.
		   Enable          'kesmeler yeniden aktif.
		End

POWER

İyi çalışmalar hocam,
Son verdiğiniz kodu,nec protokolünde çalışan başka bir kumanda için düzenledim sorunsuz çalışıyor.Üzerinde uğraştığım kumanda da sorunlu çalışıyor malum.İlk 9 biti atlayıp son 2 biti okuduğum zaman gayet iyi çalışıyor fakat iki bit ilede tuşları birbirinden ayırt edemiyorum.Çünkü bir tuş hariç diğer tuşların son iki biti 01 geliyor.Esas sorun, sinyal sürelerinin nec protokolündeki sinyal sürelerine uymamasındanmı kaynaklanıyor hocam? IR kumandalarla daha önce bir kez uğraştım(bu başlığı o zaman açmıştım)o yüzden bu işin mantığı tamamen kavrayamadım malesef.Aslında mantığı tamamen öğrenmek adına uğraşıyorum birazda.

ete

İşin mantığı şöyle.
Önce sinyal başını yakalamak gerekiyor. Başı yakalarsan sonra gelen bitlerin sonucu belirleyen kısmını süre olarak kayıt ediyorsun. Sonra bu sürelere bakıp uzun olanları "1" kısa olanları "0" şeklinde belirliyorsun. Hepsi bu. Sendeki sorun konusunda ancak tahmin yürütebilirim. Ya sinyal başını doğru yakalayamıyoruz. Yada bit süreleri yakın oluyor bu nedenle kayıtlı süreleri çözemiyoruz. Gördüğüm bit süreleri kısalar 0,5 ms dolayında uzunlar ise 1-1,2 ms civarında dolayısıyla bu kodun çalışması gerekirdi.
Ete

POWER

iyi geceler hocam,
söylediğiniz gibi bit süreleri kısalar 0,55-0,65 ms arasında değişiyor.Fakat uzunlar biraz farklı.Uzunlar,1,16---0,86---1,18---1,51---1,21 ms şeklinde.Bu değerler A tuşuna ait.B tuşunda kısalar aynı fakat uzunlar hep 1,50-55 civarında.Problem burdan kaynaklı olabilirmi hocam?

ete

Bu sorun olmasın diye programda kısa bit uzunluğunu baz alıp ondan uzun olanları "1" kabul ettik. Böylece kısa bitlerden daha (farklı şekilde) uzun bit yakaladığın sürece kodun çalışması gerekirdi. Ama çalışmadığına göre göremediğimiz başka sorunlar var demektir. Bu ya bir veya birden fazla parazit sinyalinin gelmesi yada kısa bitlerin dahada kısa olması gibi bir durum söz konusu.
Kodu çözme konusunda Şayet kayıt edilen süreler 60 (yani 600us) den büyük ise o bit 1 dir diyoruz.
Belkide 50 den büyük demek gerekir orada belkide 40 yada 45 den büyükse demek gerekir orada. Yada uzun bitleerin 800 us den büyük olduklarına emin isek oraya 80 demek daha doğru olabilir. Bunları denemelisin.
Diğer bir konu da A ve B butonlarına basıldığı anda gelen kodun tamamını bir kayda alıp kim değişiyor görsel olarak incelemek ve ona göre tedbir almak gerekebilir.

Diğer bir yapılacak işlem de, Butonlara basıldığında okunan kodu eproma kayıt ederek ne okuyor anlamak ve bu kayıtların bitlerini görsel kayıt ile karşılaştırmak.
Kumandanın üzerindeki entegreyi hiç kontrol ettinmi nedir acaba?

Ete

POWER

#57
İyi geceler hocam,
kumandayı söktüm entegrede AD11-2 ibaresi var.Aynı isimle datasheed bulamadım.Çözümü kolaylaştırmak için tek bir tuş üzerinde denemeler yapmam daha uygun olacak galiba.Çünkü farklı tuşlardan gelen sinyallerin,süreleri faklı.Çözümü bulduğumuz zaman diğer tuşların sürelerine ayrı ayrı bakılarak ona göre çözüm bulunabilir diye düşünüyorum.Kumandadaki (+) tuşundan gelen sinyallerin kısaları 0,50-0,60 ms arasında değişiyor.O zaman gelen kodu çözmek için aşağıdaki kodu kullanmam gerektiğini düşünüyorum.Çok fazla sayıda sinyal inceledim.Sadece bir kez 0.60 ms gördüm,çoğunlukla 0,55-0,57 ms.Birde hocam IF IR_AL...ile başlayan kodun tam olarak ne yaptığını söyleyebilirmisiniz?
for X=0 to 10
IF IR_AL(X)>60 then TUS.0[X]=1 '0.bit den itibaren gelen 10 bit ise komut bitleri oluyor
next 

ete

#58
Programın kesme kısmında dizi başını yakaladıktan sonra ;
 for X=0 to 10      
    pulsin IR_Goz,1,IR_AL(X)
next

satırları ile 11 adet "1" pulsine ait süreleri IR_AL dizi değişkenine sırası ile kayıt ediyoruz.
Bu süreler yaklaşık olarak 500 us ile 1200us aralığında olacaklar. Bunlarıda 500us için 50, 1200us için ise 120 olarak kayıt edeceğiz. Dolayısıyla elimizde 11 adet süre değeri bulunacak.
Sinyal şekline bakarsan başta sabit genişlikte bir LOW sinyali peşinden ise bazen kısa bir HIGH bazende uzun bir HIGH sinyali görülüyor. Bİzde HIGH ları kayıt ederek o sinyalin HIGH mi yoksa LOW bitimi olduğuna ,
    for X=0 to 10
    IF IR_AL(X)>60 then TUS.0[X]=1 '0.bit den itibaren gelen 10 bit ise komut bitleri oluyor
    next 
satırları ile karar vereceğiz.
Kayıt edilen süre 60 dan büyük ise (Yani 120 civarında ise) o bit "1" dir diyoruz ve bu satırlar o işi yapıyor. Onuda şöyle yapıyor. Döngüden önce TUS=0 diyoruz. Ardından 11 birimlik döngüyü kuruyoruz. X=0 iken şunlar oluyor,
IF IR_AL(0)>60 THEN TUS.0
  • =1 yapılıyor kısaca TUS değişkeninin X index değerine bağlı olarak sıfır nolu biti 1 yapılmış oluyor ve TUS=%00000001 yapılmış oluyor.
X=1 iken bu sefer ikinci kayıt (X=1 iken ) süresine bakılıp ona karşılık gelen TUS değerinin 1 nolu biti ayarlanıyor.
X=2 iken 2 nolu biti ayarlanıyor. bu şekilde TUS (word cinsinden) değişkeninin 11 bitinin değerleri ayarlanarak tuş değeri belirlenmiş oluyor.

Ete



POWER

Hocam verdiğiniz değerli bilgilerden dolayı çok teşekkür ederim.Allah razı olsun.Kesme kısmında bulunan
 IF TAMAM<1000 THEN TEKRAR
satırı yerine
IF TAMAM>8 AND TAMAM<180 THEN TEKRAR
gibi bir satır ekledim ve proğram çalıştı.Tesadüfi oldu birazda.Özellikle 180 rakamı geniş bi aralıkta çalışıyor,900 versemde çalışıyor.O yüzden bu satırın proğrama katkısı ne yönde ve olması gereken rakamlar ne olmalı hocam.

Powered by EzPortal