avatar_POWER

ır kumanda

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

ete

#15
Tahmin ettiğim gibi bir kere tuş kodunu veriyor ve tuşa basmaya devam edince sabit bir bilgi veriyor.
O sabit bilginin sürelerini ölçüp buraya kay bakalım ne yapabiliriz.

LOW ve HIGH sürelerini ölçeceksin. Bir de iki tekrar sinyali eresındaki süreyide ölçüver lütfen.

Ete

ete

#16
Süreleri ölçmeye gerek kalmadı. Bir pdf buldum orada bütün detay varmış. Tuşa bir kere bastınmı bırakıncaya kadar her 110ms süre sonrasında repeat kodu gönderiliyor. Buda 9 ms HIGH ve 2,25 ms LOW dan oluşuyor. Onun peşine yine 560us lik bir burst dediği HIGH sinyali yollanıyor.
Bu durumda bu sistemi kullanmak pek mantıklı olmayacak. Zira tuş kodu çözüldükten sonra 110 ms bekleyeceksin yada 100 ms bekleyip pulsin ile 9ms lik HIGH kodunu yakalamak ve boyunu ölçmek gerekir. Belkide ölçmeden de 110 ms sonra sinyale bakıp HIGH ise direk Dimleme işlemine devam ettirmek değilse basla ya göndermek yeterli olacaktır.
IR_Göz çıkışında transistör var ise sinyallerin kendilerini test etmek yani 9ms HIGH bakmak yok ise 9ms LOW bakmak gerekir.
BASLA:
      SAY=0:ALDIM=0
      while ALDIM=0:wend
       ALDIM=0 
       TUS=0
       for I=0 to 7
         IF IR_AL(16+I)>70 then TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
       next 

TUSA:      
      IF Tus=1 THEN    
        DUTY=DUTY+1:IF DUTY=0 THEN DUTY=255  'DİM ARTIRILDI
        GOSUB AYAR    'DIM VERİLDİ
'        GOSUB DELAY   'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
         ALDIM=0:SAY=0
         pause 110
         IF PORTB.0=1 THEN 
            TUS=1:GOTO TUSA
         ENDIF  
         TUS=0:ALDIM=0 
         GOTO BASLA
       ENDIF           
      
       
TUSB:           
      IF Tus=2 THEN    
        DUTY=DUTY-1 :IF DUTY=255 THEN DUTY=0
        GOSUB AYAR
'        GOSUB DELAY  'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
        ALDIM=0:SAY=0
        PAUSE 110
        IF PORTB.0=1 THEN
          TUS=2:GOTO TUSB
        ENDIF
        TUS=0:ALDIM=0
        GOTO BASLA  
      ENDIF
Bu kodları IR_Göz çıkışında transistör olduğu varsayarak veriyorum. Direk IR-Göz çıkışını pic'e girmiş isen Kesme kısmında pulsin komutları HIGH bakması lazım. Ayrıca yukarıdaki IF PORTB.0=1 komutu yerine IF PORTB.0=0 yazılması gerekir.

Ete

POWER

#17
Hocam iyi geceler,
kullandığım IR-Göz çıkışında transistör yok.Söylediğiniz şekilde proğramda bir iki değişiklik yaparak denedim olumlu sonuç alamadım.Ledlerin parlaklığı hiç değişmiyor.Yani tuşlar her iki yöndede çalışmıyor.Proğrama baktığımda,Portb.0 pinin sıfır olması ve tus=1 olması ile devam edecek.Fakat gerçek devresinde,Tuşa basılı tutarak, ölçü aletiyle porb.0 pinini ölçüyorum 4.5v civarı,tuşa basmazken ise 5v da bekliyor.Bu durum normalmi?Yani tuşa basılı iken portb.0 pini gnd ye daha yakın olması gerekmezmi? Bundan dolayıda tus=1 olmuyor.O yüzden proğram hiç ilerlemiyor gibi.
Hocam kusura bakmayın çok uğraştırdım sizi.Son olarak kullandığım proğramı ekleyeyimde proğramdan dolayı olumsuzluk olmasın.

ete_edit: kod değişti
@ 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 OSC 4
DEFINE PULSIN_MAX 12000
PORTB=0
PORTA=0
TRISB=%00000001        
TRISA=%00000000
OPTION_REG=%00000000  
CMCON = 7
SYMBOL IR_Goz=PORTB.0

Paket var word 56
TAMAM VAR WORD 58
Tus   Var Byte 60
IR_AL var BYTE(32)62
X     var Byte 100
Z     var BYTE 101
SAY   VAR WORD 102
XZ    VAR WORD 104
DUTY  VAR BYTE 106 
ESKI  VAR BYTE 107
I     VAR BYTE
W     VAR WORD
ALDIM VAR BIT
ILK   var bit
INTCON=%10010000          'Kesmeler aktif ve RB0/INT kesmesi aktif
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

T2CON =%000000101
PR2=49                   
CCP1CON.2=1  
CCP1CON.3=1


DUTY=1
GOSUB AYAR
DUTY=50
GOSUB AYAR

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

TUSA:      
       IF Tus=%01000110 THEN     
        DUTY=DUTY+10:IF DUTY=210 THEN DUTY=200  'DİM ARTIRILDI
        GOSUB AYAR    'DIM VERİLDİ
        GOSUB DELAY   'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
         ALDIM=0:SAY=0
         PAUSE 15
        PULSIN PORTB.0,0,TAMAM:ESKI=NCD(TAMAM)
        IF ESKI=10 THEN
            TUS=70
            GOTO TUSA
         ENDIF  
         TUS=0:ALDIM=0:INTCON.4=1 
         GOTO BASLA
       ENDIF           
      
       
TUSB:           
      IF Tus=%01000101 THEN    
        DUTY=DUTY-10 :IF DUTY>200 THEN DUTY=0
        GOSUB AYAR
        GOSUB DELAY  'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
        ALDIM=0:SAY=0
        PAUSE 15
        PULSIN PORTB.0,0,TAMAM:ESKI=NCD(TAMAM)
        IF ESKI=10 THEN
          TUS=69:GOTO TUSB
        ENDIF
  
      ENDIF
        TUS=0:ALDIM=0:INTCON.4=1
        GOTO BASLA       

DELAY:
      FOR W=0 TO 1000 
        PAUSEUS 5
      NEXT
      RETURN   

AYAR:
     XZ=DUTY
     CCP1CON.4=XZ.0
     CCP1CON.5=XZ.1
     CCPR1L=XZ>>2   
RETURN 

DISABLE 'yeniden kesme oluşması önleniyor  
KESME:   
      PULSIN PORTB.0,1,TAMAM:ESKI=NCD(tamam)
      IF ESKI=9 THEN      
         for I=0 to 31
           pulsin IR_Goz,1,IR_AL(I)   'YALNZCA low BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
         next 
         ALDIM=1 
         TUS=0
        for I=0 to 7
          IF IR_AL(16+I)>70 then TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
        next 
        INTCON.4=0        
      ENDIF 
         
GECGIT: SAY=0      
        INTCON.1=0   
        Resume       
	Enable       
End
 


ete

İşi alel acele çözmeye kalkınca bir sürü hatayıda yapmış olduk. Kendi simulasyon tuş değerlerimi değiştirip sana vermişim. Elbette çalışmayacaktır.
Her neyse programı epeyce değiştirdim ve denedim. Son verdiğin mesajdaki programı benimkisi ile değiştirdim. Oradan alıp deneyebilirsin.
Bu program tamamen senin sisteme göre düzenlendi. Göz çıkışında transistör yok.
Direk dene bak bakalım çalışacakmı. Buda çalışmaz ise pes edeceğim.

Ete

POWER

#19
Hocam tamam proğram kusursuz çalışıyor gerçek devresinde demedim.Hakkınızı helal edin hocam çok yordum sizi.Proğram bir hayli değişmiş önemli olan çalışması tabiki.Hocam birde NCD ne anlama geliyor.Daha önce sizin bir mesajınızdan hatırlıyorum ama anlamını hatırlayamadım.Tekrardan çok teşekkür ederim.İyi geceler.

ete

Çalıştığına sevindim.
NCD sayının en yüksek değerlikli bitinin numarasını veriyor. Bir nevi sayının küsüratlarını atmak gibi bir şey. Okumalar arasında ufak tefek farklar olur sayı bazen diyelimki 700 çıkar bazen 698 çıkar bazen 701 çıkar. NCD ile bu sayılara baktığın zaman hepsinin en yüksek değerlikli bit değeri tek bir sayıdır böylece okuma farklılıklarından kurtulmuş olursun.

Ete

POWER

#21
İyi çalışmalar hocam,
proğramı devresinde bir kaç gündür deniyordum.Zaman zaman işlem yapmaz hale geldiğini farkettim.Zamanı belli olmuyor.Tuşlar ile ayar yaparken oluyor ama.
Beslemeden olabilir diye devreyi pil ile çalıştırıyorum fakat sonuç değişmedi.Picin besleme uçlarında 100nf var.3 adet 628a ile denedim sonuç aynı.proğram donduğu zaman enerjiyi kesip yeniden vermeyince düzelmiyor.Başka neler yapabilirim hocam?

ete

Kilitlenme stack taşmasından olur genellikle ama programa baktım taşma yaratacak herhangi bir şey bulamadım. Sebebini anlamak zor. Sebep bulsak çözümde üretiriz. Kullanan sensin mutlaka bir istatistik yapmak ve ne olunca kilitlenme olduğuna dikkat etmek lazım. Benim yapabileceğim bir şey yok maalesef.

Ete

POWER

Teşekkürler hocam ben daha ayrıntılı inceleyelim.kilitlenmenin ne zaman olduğuna dair daha somut bilgiler çıkartayım.dediğiniz gibi sebebini bulmaya çalışayım.simülasyonu nasıl yapayım hocam yani verici kısmını?

POWER

#24
İyi geceler hocam,
Değişkenleri izlemek için lcd ekran ekleyerek basit bir simülasyon devresi kurdum.Ekranda "tus","eski","duty" ve "aldım" değişkenlerini gösterdim ve kilitlenme anında aldıkları değerleri görmek istedim.Duty değişkenine tuş ile - ve + yönde değer aldırarak denemeler yaptım uzun uzun.Kilitlenmeye bir zaman veremiyorum bazen hemen oluyor bazen daha geç.Kilitlenme anında hep "Aldım=1" değerini alıyor ve kilitleniyor.Bir ipucu olur temennisiyle bir kaç ekran görüntüsü ekliyorum.Ayrıca simülasyon dosyalarının hepsini ekliyorum.






ete

Bu sorun kesinlikle repeat yani tekrar sinyalinden kaynaklanıyor. Tuşu bıraktığın anda oluşuyor.
Şayet tam kesme anına denk gelir ve tuşu bıraktığın anda yeniden bir tekrar sinyali gelirse sistem ilk baştaki uzun HIGH (aslında 4,5 ms uzunluğundaki LOW) sinyalini bekliyor ve alamayınca bir şekilde kilitleniyor.

Bunu önlemek için türlü atraksiyonlar denedim ve elde ettiğim en iyi sonuç aşağıda verdiğim programla oldu.
Şunu unutma tuşa basıp basılı tuttuğun sürece sorun olmuyor kısa aralıklarla bas bırak yaparsan meydana geliyor.

Ete
'@ DEVICE pic16F628A
'@ DEVICE PIC16F628A, WDT_OFF
'@ DEVICE PIC16F628A, LVP_OFF
'@ DEVICE PIC16F628A, PWRT_OFF             'Power on timer açık
'@ DEVICE PIC16F628A, MCLR_OFF
'@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
#CONFIG
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
#ENDCONFIG 
define OSC 4

DEFINE LCD_DREG	    PORTB	
DEFINE LCD_DBIT	    4		
DEFINE LCD_RSREG	PORTB	
DEFINE LCD_RSBIT	1	
DEFINE LCD_EREG	    PORTB	
DEFINE LCD_EBIT	    2		
DEFINE LCD_BITS	    4	
DEFINE LCD_LINES	2

DEFINE PULSIN_MAX 12000

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

OPTION_REG=%00000000  
CMCON = 7
INTCON=%10010000          'Kesmeler aktif ve RB0/INT kesmesi aktif

SYMBOL GIRIS=PORTB.0

Paket var word 56
TAMAM VAR WORD 58
Tus   Var Byte 60
IR_AL var BYTE(32) 
X     var Byte 100
Z     var BYTE 101
SAY   VAR WORD 102
XZ    VAR WORD 104
DUTY  VAR BYTE 106 
ESKI  VAR BYTE 107
I     VAR BYTE
W     VAR WORD
ALDIM VAR BIT
ILK   var bit
POZ   VAR BIT

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

T2CON =%000000101
PR2=49                   

CCP1CON.2=1  
CCP1CON.3=1

DUTY=1
GOSUB AYAR
DUTY=50
GOSUB AYAR

BASLA:
      gosub EKRAN
      ALDIM=0
      while ALDIM=0
      wend
       ALDIM=0 

       TUS=0
       for I=0 to 7
         IF IR_AL(16+I)=8 then TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
       next 

TUSA:  INTCON.7=0   'kesmeyi iptal ediyoruz burada 
       IF Tus=%01000110 THEN     
        DUTY=DUTY+1
         IF DUTY=210 THEN DUTY=200  'DİM ARTIRILDI
         gosub EKRAN
        GOSUB AYAR    'DIM VERİLDİ
        GOSUB DELAY   
        ALDIM=0
        PAUSE 50
        ALDIM=0:SAY=0:ESKI=0
        WHILE ESKI<>10  
          PULSIN GIRIS,0,TAMAM
          ESKI=NCD(TAMAM)
          SAY=SAY+1:IF SAY=10 THEN TUSA_CIK
        WEND
TUSA_CIK:        
        IF ESKI=10 THEN
            TUS=70
            GOTO TUSA
         ENDIF  
         TUS=0
         ALDIM=0
         POZ=0 
         PAUSE 250
         INTCON.7=1 'kesmeyi yeniden aktif ediyoruz
         GOTO BASLA
       ENDIF           
 
TUSB:  INTCON.7=0         
      IF Tus=%01000101 THEN    
        DUTY=DUTY-1
        IF DUTY>200 THEN DUTY=0
        gosub EKRAN
        GOSUB AYAR
        GOSUB DELAY  
        ALDIM=0
        PAUSE 50
        ALDIM=0:SAY=0:ESKI=0
        WHILE ESKI<>10  
          PULSIN GIRIS,0,TAMAM
          ESKI=NCD(TAMAM)
          SAY=SAY+1:IF SAY=10 THEN TUSB_CIK
        WEND
TUSB_CIK: 
        IF ESKI=10 THEN
          TUS=69
          GOTO TUSB
        ENDIF
  
      ENDIF
        TUS=0
        ALDIM=0
        POZ=0
        PAUSE 250
        INTCON.7=1        
        GOTO BASLA       
EKRAN:
     LCDOUT $FE,$80,"TUS:",DEC2 Tus,"  DUTY:",DEC3 DUTY
     LCDOUT $FE,$C0,"E-TUS:",deC2 ESKI," ","ALDIM:",DEC ALDIM
     RETURN
DELAY:
      FOR W=0 TO 1000
        PAUSEUS 5
      NEXT
      RETURN       

AYAR:
     XZ=DUTY
     CCP1CON.4=XZ.0
     CCP1CON.5=XZ.1
     CCPR1L=XZ>>2   
RETURN 

DISABLE 
KESME:   
      IF POZ=1 THEN GECGIT
      PULSIN GIRIS,1,TAMAM
      ESKI=NCD(tamam)
      IF ESKI=9 THEN '9      
         for I=0 to 31  '31
           pulsin GIRIS,1,TAMAM:IR_AL(I)=ncd(tamam)   
         next 
         ALDIM=1  '1
         TUS=0
        POZ=1       
      ENDIF 
GECGIT:       
        INTCON.1=0   
        Resume       
        Enable       
End
 

ete

#26
Daha basit bir tekrarlama mantığı ile de olabiliyor. Zira tuşa basılmadığı müddetçe IR girişi hep HIGH da bekliyor. Arada bir LOW a düşüyor ise tuş tekrarı var demektir. Bu mantıkla çalışan programda aşağıdadır.

'@ DEVICE pic16F628A
'@ DEVICE PIC16F628A, WDT_OFF
'@ DEVICE PIC16F628A, LVP_OFF
'@ DEVICE PIC16F628A, PWRT_OFF             'Power on timer açık
'@ DEVICE PIC16F628A, MCLR_OFF
'@ DEVICE PIC16F628A, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT

#CONFIG
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
#ENDCONFIG

DEFINE LCD_DREG	    PORTB	
DEFINE LCD_DBIT	    4		
DEFINE LCD_RSREG	PORTB	
DEFINE LCD_RSBIT	1	
DEFINE LCD_EREG	    PORTB	
DEFINE LCD_EBIT	    2		
DEFINE LCD_BITS	    4	
DEFINE LCD_LINES	2

DEFINE PULSIN_MAX 12000

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

OPTION_REG=%00000000  
CMCON = 7
INTCON=%10010000          'Kesmeler aktif ve RB0/INT kesmesi aktif

SYMBOL GIRIS=PORTB.0

Paket var word 56
TAMAM VAR WORD 58
Tus   Var Byte 60
IR_AL var BYTE(32)62
X     var Byte 100
Z     var BYTE 101
SAY   VAR WORD 102
XZ    VAR WORD 104
DUTY  VAR BYTE 106 
ESKI  VAR BYTE 107
TEMP  VAR BYTE
I     VAR BYTE
W     VAR WORD
ALDIM VAR BIT
ILK   var bit

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

T2CON =%000000101
PR2=49                   

CCP1CON.2=1  
CCP1CON.3=1

DUTY=1
GOSUB AYAR
DUTY=50
GOSUB AYAR

BASLA: 

      gosub EKRAN
      SAY=0
      ALDIM=0
      while ALDIM=0
      wend
      ALDIM=0 
      INTCON.7=0
      TUS=0
      for I=0 to 7
        IF IR_AL(16+I)=8 then TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
      next

      
       IF Tus=%01000110 THEN 
TUSA:           
        DUTY=DUTY+1
        IF DUTY=210 THEN DUTY=200  'DİM ARTIRILDI
        gosub EKRAN
        GOSUB AYAR    'DIM VERİLDİ
        GOSUB DELAY   'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
         ALDIM=0
         SAY=0  
         PAUSE 40
         WHILE GIRIS=1
          SAY=SAY+1:IF SAY=500 THEN  A_CIK
         WEND
         GOTO TUSA
A_CIK :        
         TUS=0
         ALDIM=0
         INTCON.7=1:INTCON.1=0 
         GOTO BASLA
       ENDIF           
          
          
      IF Tus=%01000101 THEN   
TUSB:       
        DUTY=DUTY-1
        IF DUTY>200 THEN DUTY=0
        gosub EKRAN
        GOSUB AYAR
        GOSUB DELAY  'yaklaşık 10 ms lik bir gecikme verdirecek alt program olmalı döngüsel olarak
        ALDIM=0
        SAY=0
        PAUSE 40 
        WHILE GIRIS=1
          SAY=SAY+1:IF SAY=700 THEN B_CIK
        WEND
         
         GOTO TUSB  
      ENDIF
B_CIK:      
        TUS=0
        ALDIM=0
        INTCON.7=1:INTCON.1=0  
        GOTO BASLA       
EKRAN:
     LCDOUT $FE,$80,"TUS:",DEC2 Tus,"  DUTY:",DEC3 DUTY
     LCDOUT $FE,$C0,"E-TUS:",deC2 ESKI," ","ALDIM:",DEC ALDIM
     RETURN

EKRAN_BIR:
     LCDOUT $FE,$80,"TAMAM:",DEC4 TAMAM
     LCDOUT $FE,$C0,"ESKI:",deC2 ESKI," SAY=",DEC2 SAY
     RETURN     
DELAY:
      FOR W=0 TO 1000'1000
        PAUSEUS 5
      NEXT
      RETURN   

AYAR:
     XZ=DUTY
     CCP1CON.4=XZ.0
     CCP1CON.5=XZ.1
     CCPR1L=XZ>>2   
RETURN 

DISABLE 'yeniden kesme oluşması önleniyor  
KESME:   
      PULSIN GIRIS,1,TAMAM
      ESKI=NCD(tamam)
      IF ESKI=9 THEN '9      
         for I=0 to 31  '31
           pulsin GIRIS,1,TAMAM:IR_AL(I)=ncd(tamam)   'YALNZCA low BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
         next 
         ALDIM=1  '1
         TUS=0
      ENDIF   
GECGIT: 
        INTCON.1=0   
        Resume       
Enable       
End
 


POWER

#27
İyi akşamlar hocam,
Son iki proğramı verdiğiniz andan itibaren gerçek devresinde denedim.Sorun olmadı.Son proğramı kullanacağım.Gerci ikiside problemsiz.Teşekkürler.

POWER

#28
Bu konuyla ilgili olduğu için ayrı başlık açmak istemedim.
Aynı protokol ile çalışan birden fazla kumandaların işlevlerinin birbirine karışmaması için proğramda ne gibi önlemler alabiliriz? Zira nec protokolü kullanan 3 tane aynı tip kumandanın sinyallerine baktığım zaman sinyal sürelerinin aynı olduğunu gördüm.
Çözüme yönelik nasıl bir mantık yürütülebilir? 

ete

Aklıma gelen tek yol akıllı kumanda yapmak. Bu sistemle kumandaları tanıtırsın. Program kodları okur ve kayıt eder. Sonra kim çalışıyor ise onun işlevini yerine getirir.

Bildiğim kadarı ile aynı protokolü kullansa bile 24 bitlik şifre kodunda özellikle baş tarafta farklı değerler olması gerekir. Her bir bit bir birinin aynı ise zaten yapacak bir şey olduğunu sanmıyorum.

Ete

Powered by EzPortal