Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ir dedektorun zaman ayari

Başlatan selvi, 11 Mayıs 2009, 07:49:37

selvi

asagida ir verici ve ir alici programlari var.ir verici programi  soyle:50ms 38khz sinyal yolluyor .100ms sinyali susturuyor .ir alici programinda bunu algilayacak sekilde duzenlemeye calistim olmadi.ir alici soyle olmasi gerekiyor.sinyal bir cisim tarafindan kesildiginde alarm calacak.fakat alici kismini ir vericiye gore duzenleyemiyorum.su sekilde yapmaya calistim.rb0/int ucundan yukselen kenarda tetikleme ye gore ayarladim.eger  sinyal 100ms den fazla  kesilmis ise bu sinyalin bir cisim tarafinda kesilmis kabul et.eger 100sn civari ise normal ir vericinin  sinyal susturmasi olarak kabul et ve basa don seklinde yapmaya calistim olmadi.
ir verici:
@ DEVICE pic16F628 'islemci 16F628A 
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_ON 'MCLR pini kullaniliyor. 
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

Header  CON  2000   
Cycles  var  WORD
 CMCON=7
TRISB=%00000011
TRISA=%00100000
PORTB=0
SEND: 
   Cycles = Header    '// Load header pulse time
   CALL Pulse         '// Send 2.4mS header/synch pulse
GOTO SEND  
Pulse:                '// Emits # of 40kHz bursts held in variable Cycles
ASM                   ;// with auto delay between bursts
   bsf portb, 3       ;// 1uS, LED=on [need 25uS total
   goto $+1           ;// 3uS (2uS per goto $+1)
   goto $+1           ;// 5uS
   goto $+1           ;// 7uS
   goto $+1           ;// 9uS
   goto $+1           ;// 11uS
   goto $+1           ;// 13uS 
   bcf portb, 3       ;// 14uS, LED=off 
   goto $+1           ;// 16uS
   goto $+1           ;// 18uS
   goto $+1           ;// 20uS
   goto $+1           ;// 22uS
   nop                ;// 23us 
   decfsz _Cycles,F   ;// 24uS
   goto _Pulse        ;// 26us
ENDASM
PAUSE 100
return
END

ir_alici:
@ DEVICE pic16F628 'islemci 16F628A 
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_ON 'MCLR pini kullaniliyor. 
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

SYMBOL GIE  =INTCON.7   'genel interruptlarý açýyor
SYMBOL INTE=INTCON.4    'RB0  interrupt enable bit
SYMBOL INTF=INTCON.1    'RB0  interrupt flag bit

INTE=1
GIE=1
ON INTERRUPT GOTO KESME 

OPTION_REG=%11000000   
CMCON=7
TRISB=%00000011
TRISA=%00100000
PORTB=0

M      VAR  WORD
m=0
LOOP: 
FOR M=0 TO 20000
PAUSEUS  5
NEXT M
IF PORTB.0=0 THEN LOOP  
PORTB.3=1 
PAUSE 500
PORTB.3=0 
GOTO LOOP
;---------RB0     KESME-----------
DISABLE
KESME:
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
INTF=0 'kesme bayrag(? s?f?rlanacak)
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
RESUME
ENABLE 
END
Yaşam anlamlandırıldıkça kutsaldır....

selvi

ir_alici kisminda pulsin komutu kullanarak yapmak daha uygun duser mi?sonucta ir_verici 50ms sinyal yolluyor.100ms sinyal susturuluyor.bu sureler rastgele secilmistir.uzun veya kisa olabilir.alici kismini pulsin komutuyla yapmak istersek nasil yazilim gerekli.0 yada 1 puls larina gore okuma yapmak gerekiyor.
  pulsin komutuyla sinyal kontrol edilirken ve sinyal bir cisim tarafinda kesildiginde alarm calmasi gerekiyor.boyle bir kosul nasil olusturulabilir?
Yaşam anlamlandırıldıkça kutsaldır....

selvi

ir_verici ve ir_aliciyi en son asagidaki sekilde duzenledim.1m e kadar saglikli calisiyor.1m den sonra mesafe artirildiginda sorun cikiyor.ayriyeten ir dedektorun uzerinde ir sinyal olmadiginda surekli role cekiyor.1m den daha buyuk mesafede ayni sorun oluyor.ir_verici de 2 tane seri bagli ir led kullandim.
ir_verici:
CMCON=7
    PORTB=0
	TRISB=%00100100
	PORTA=0
	TRISA=%00001111 
	
	Header  con 96 
	Cycles  var word
	
SEND:
Cycles=Header
call pulse
GOTO SEND
Pulse:                '// Emits # of 40kHz bursts held in variable Cycles
ASM                   ;// with auto delay between bursts
   bsf portb,3       ;// 1uS, LED=on [need 25uS total
   goto $+1           ;// 3uS (2uS per goto $+1)
   goto $+1           ;// 5uS
   goto $+1           ;// 7uS
   goto $+1           ;// 9uS
   goto $+1           ;// 11uS
   goto $+1           ;// 13uS 
   bcf portb,3      ;// 14uS, LED=off
   goto $+1           ;// 16uS
   goto $+1           ;// 18uS
   goto $+1           ;// 20uS
   goto $+1           ;// 22uS
   nop
   decfsz _Cycles,F   ;// 23uS
   goto _Pulse        ;// 25us
ENDASM
   PAUSEus   500         '// 500uS delay between each data bit
   RETURN             '// Return to Main	
end

ir_alici:
DEFINE PULSIN_MAX 3000  '// MAX wait time for pulsin
PULSIN_IN  VAR WORD
SAYI       VAR BYTE 
SAYI=0
CMCON=7
PORTB=0
TRISB=%00000001
PORTA=0
TRISA=%00000000 
LOOP:
pulsin PORTB.0,0,PULSIN_IN
IF PULSIN_IN>200 THEN  LOOP
SAYI=SAYI+1
IF SAYI=1 THEN
PORTB.3=1
PAUSE 500
PORTB.3=0
sayi=0
ENDIF
PORTB.6=1
PAUSE 500
PORTB.6=0 
GOTO LOOP
END
Yaşam anlamlandırıldıkça kutsaldır....

selvi

"IF PULSIN_IN>200 OR PULSIN_IN=0 THEN  LOOP " su sekilde bir degisiklik yaptim mesafe biraz daha artti.5-6m arasi.
  pulsin komutunu kullanmamin sebebi ir dedektorun datasheetinde ir sinyalin surekli yollanmamasi soylenmis.simdiye kadar surekli ir sinyali(38khz ON konumunda tutuyordum).sinyal kesilmedigi halde kesilmis kabul edip yanlis alarm caliyordu.bazen gunde birden fazla yanlis alarma neden oluyordu.son bu degisiklikle nekadar duzelecek onu da bilemiyorum.
Yaşam anlamlandırıldıkça kutsaldır....

OG

Birkaç mesaj önce SIRC verici ve alıcı örneği verdim. Ondan faydalanabilirsin.

Vericiden sıra ile farklı rakamlar yollarsın, alıcıda aynı data sırasını alıyormu ona bakarsın. Sıranın her bozulduğunda hata isimli bir sayıyı 1 arttırırsın, hata sayısı istediğin kadar bir degere çıktı ise alarm verirsin.

Verici:
1 gönder (SIRC Oolarak)
5 gönder
12 gönder
goto verici


Alıcı:
hata=0

adim_1:
gosub sirc_al
if gelen<>1 then
hata=hata+1
if hata>hata_siniri then alarm_ver
goto adim_1
endif

adim_2:
gosub sirc_al
if gelen<>12 then
hata=hata+1
if hata>hata_siniri then alarm_ver
goto adim_1
endif

adim_3:
gosub sirc_al
if gelen<>1 then
hata=hata+1
if hata>hata_siniri then alarm_ver
goto adim_1
endif

Goto Alici




sirc_al:
' Burada SIRC data alacaksın, alırkende SIRC gelmezse hata sayısını arttıracaksın. SIRC gelmediğini anlamak için Header pulse bakarken içine bir döngü koyarsın, header gelmedikçe hata sayısını arttırırsın, hata belli bir değere ulaşırsa yine alarm verirsin.
return
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

selvi

pulsin komutunu kullanarak kismi cozum oluyor.ama kodlama mantigi cok basit oldugu icin yanlis alarm vermeye acik.tabi uzun bir sure denemedim.fakat verdiginiz SIRC kodlamasi daha karmasik belirttiginiz tarzda bir degisiklik yapip sonuc alinirsa daha saglikli olacagi net.
  yapmami istediginiz verici ve alici icin o kismi anladim.fakat dun aksamdan beri ugrasiyorum bu verdiginiz sekliyle sirc verici ve alici kisminiyla bir turlu uyumlu hale getiremedim.sirc kodlamasinda tus ve aygit icin sayi1 degiskeni var.1,5 ve 12 degerlerini hangi kisma yazacagim.birden fazla degiskenler var.onlar ayni sekilde mi kalacak.alici kisminda bu verilerin gelip gelmedigini nasil uyarlayacigim.
 hocam eger mumkunse vericide "1" gonderirken ve alici bunu alirken yapilmasi gereken degisiklikleri  sirc kodlari uzerinde vermeniz mumkun mu?
Yaşam anlamlandırıldıkça kutsaldır....

selvi

ir_verici ve ir_aliciyi biraz degistirerek    asagidaki sekilde duzenledim.bu sefer sinyali kestigim halde alarm calmiyor.
ir_verici:
@ DEVICE pic16F628 'islemci 16F628A 
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_ON 'MCLR pini kullaniliyor. 
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

'// For PIC16F62x & A versions
CMCON = 7           '// Comparators Off
VRCON = 0           '// Vref Off
                 
'// Setup IR bit widths / carrier cycle times     
Header  CON 92      '// Header = (92 * 26uS) = 2.4mS burst
Zero    CON 23      '// Zero = (23 * 26uS) = 0.6mS burst
One     CON 46      '// One = (46 * 26uS) = 1.2mS burst

'// Define variables 
Cycles   VAR BYTE     '// Holds number of 40KHz carrier cycles
Index    VAR BYTE     '// Index counter
DBYTE    VAR BYTE     '// Holds 8-bit data byte
ABYTE    VAR BYTE     '// Holds 5-bit hardware address
DBYTE=0
'// Test for encode or decode function & configure I/O
  PAUSE 10            '// Stabilize on power-up
  TRISA = %00000000
  TRISB = %00000000   '// PORTB.3 = output LED drive. Rest inputs for address
  GOTO Encode         '// Mode = Encode, jump over sub to Encode routine

Pulse:                '// Emits # of 38kHz bursts held in variable Cycles
ASM                   ;// with auto delay between bursts
   bsf portb, 3       ;// 1uS, LED=on [need 25uS total
   goto $+1           ;// 3uS (2uS per goto $+1)
   goto $+1           ;// 5uS
   goto $+1           ;// 7uS
   goto $+1           ;// 9uS
   goto $+1           ;// 11uS
   goto $+1           ;// 13uS 
   bcf portb, 3       ;// 14uS, LED=off
   goto $+1           ;// 16uS
   goto $+1           ;// 18uS
   goto $+1           ;// 20uS
   goto $+1           ;// 22uS
   nop                ;// 23uS
   decfsz _Cycles,F   ;// 24uS
   goto _Pulse        ;// 26us
ENDASM
   PAUSEUS 500        '// 500uS delay between each data bit
   RETURN             '// Return to Main
   
   '// Send header pulse + 13-bit data/address packet on keypress
Send:    
   Cycles = Header    '// Load header pulse time
   CALL Pulse         '// Send 2.4mS header/synch pulse
                        
   '// Header sent, now send 8 data bits   
   FOR Index = 0 TO 7 '// Loop for 8 bits data
    IF DBYTE.0[Index] = 0 THEN '// Get polarity of each data bit to send
      Cycles = Zero   '// Pulse time = 0.6mS for a "0" data bit
    ELSE
      Cycles = One    '// Pulse time = 1.2mS for a "1" data bit
    ENDIF
    CALL Pulse        '// Send Zero or One data bit/burst
   NEXT Index         '// Loop until 8 data-bits sent
     
  '// 8 data bits sent, now send 5-bit address
   ABYTE = %00010101 '// ABYTE = address  
   FOR Index = 0 TO 4 '// Loop for 5-bits to complete address code
    IF ABYTE.0[Index] = 0 THEN '// Get polarity of each address bit to send
      Cycles = Zero   '// Pulse time = 0.6mS for a "0" address bit
    ELSE
      Cycles = One    '// Pulse time = 1.2mS for a "1" address bit
    ENDIF
    CALL Pulse        '// Send bit
   NEXT Index         '// Loop until 5-bits sent
   PAUSE  25          '// 25mS delay between packets (40kHz bursts)
        
Encode:
   DBYTE = DBYTE + 3
   IF DBYTE != 12  THEN '// Loop until key-press
   GOTO Send
   ENDIF
   DBYTE = 0
   GOTO Encode
   END


ir_alici:
@ DEVICE pic16F628 'islemci 16F628A 
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik 
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_ON 'MCLR pini kullaniliyor. 
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

DEFINE PULSIN_MAX 3000  '// MAX wait time for pulsin
DEFINE NO_CLRWDT        '// Saves 17 words code space
 
'// For PIC16F62x & A versions
CMCON = 7           '// Comparators Off
VRCON = 0           '// Vref Off
HATA_SINIRI  con  5 
'// Define variables
Index    VAR BYTE     '// Index counter
IR_PULSE VAR BYTE(13) '// 13-bytes. 8 data ; 5 address
PULSE_IN VAR WORD     '// Raw pulsin value
DBYTE    VAR BYTE     '// Holds 8-bit data byte
ABYTE    VAR BYTE     '// Holds 5-bit hardware address
X        VAR BYTE     '// Bit pointer for loop
HATA     var byte
HATA=0
 
'// Test for encode or decode function & configure I/O
OPTION_REG.7 = 1    '// PORTB internal pull-ups = off
TRISA= %00000000    
TRISB= %00000001
  PAUSE 10            '// Stabilize on power-up

ALICI:
    HATA=0
ADIM_1:
    GOSUB   Decode
   IF DBYTE <> 3 THEN
    HATA=HATA+1
   IF HATA>HATA_SINIRI THEN ALARM_VER
    GOTO ADIM_1 
   ENDIF
ADIM_2:
    GOSUB   Decode
   IF DBYTE <> 6 THEN
    HATA=HATA+1
   IF HATA>HATA_SINIRI THEN ALARM_VER
    GOTO ADIM_1 
   ENDIF 
ADIM_3:
     GOSUB   Decode
    IF DBYTE <> 9 THEN
    HATA=HATA+1
   IF HATA>HATA_SINIRI THEN ALARM_VER
    GOTO ADIM_1 
   ENDIF 
GOTO ALICI 
             
Decode:
   PULSIN PORTB.0,0,PULSE_IN        '// Read-in start pulse
   IF (PULSE_IN < 200) OR (PULSE_IN = 0)  THEN  Decode '// Less than Start pulse, then keep looking
     
Verify:                              '// Read, Decode, then verify data
   FOR Index = 0 TO 12               '// Setup to read-in 13 pulses
    PULSIN PORTB.0,0,IR_PULSE[Index] '// Read 13 low-going pulses on RB.3
   NEXT Index                        '// Loop x times
   DBYTE = $FF                       '// Start with all 1's and find each 0
   FOR Index = 0 TO 7                '// Get 8 "data" bits
    IF IR_PULSE[Index] < 100 THEN DBYTE.0[Index]=0 '// Less than 1mS = 0
   NEXT Index
   ABYTE = $FF           '// Start with all 1's and find each 0 in pattern
   X=0                   '// Initialize address bit index pointer to bit 0
   FOR Index = 8 TO 12   '// Get 5 address bits from IR_PULSE bits 8-12
    IF IR_PULSE[Index] < 100 THEN ABYTE.0[X]=0
    X = X + 1            '// Increment address bit index pointer
   NEXT Index
   ABYTE = ABYTE & %00011111 '// Mask out upper 3-bits. Result = 5-bit address.
   RETURN

   ALARM_VER:
   PORTB.3=1:PAUSE 500:PORTB.3=0:hata=0
   GOTO ALICI
   
   END
Yaşam anlamlandırıldıkça kutsaldır....

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

selvi

ir_vericideki her paket bilgiden sonraki 25ms alicida sorun yaratir mi?cunku alici header kontrol ederken hata durumunu kontrol ediyor.25ms dusurulup veya kaldirilirsa sorun cikar mi?
verici acikken aliciyi actigimda alarm caliyor.bunun onune gecmek icin soyle bir ekleme yaptim.bu durumda icerde 2 kere sinyal kesilince alarm caliyor.disarda bazen sinyalkesilince alarm calmiyor.bu son ekledigim kosul olmayinca veya gecikme 2 sn altinda olunca da  aliciyi actigimda alarm caliyor.
alarm_ver:
I=I+1
IF I=2 THEN  
    PORTB.3=1 
        hata_data = 0                            ' hatalarý sil
        hata_header = 0
        I=0  
ENDIF
PAUSE 3000       
goto Decode        
Yaşam anlamlandırıldıkça kutsaldır....

OG

Şunu denermisin, http://rapidshare.com/files/237051716/IR.rar
kendin bazı değişiklikler yapabilirsin.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

selvi

belirtilen degisikleri yaptim.bu sefer acilis siniri fazla oluyor.onu 2 e dusurdum.sinyali bir kez kestigimde alarm calmadi.2 kere sinyal kesildiginde alarm caliyor.sonra acilis sinirini 1 e dusurdum.bu sefer  alarm_hazir kismindaki led yanmadan alarm caliyor.  
 sonra soyle bir degisiklik yaptim.buda saglikli olmadi.yani vericiyi actiktan sonra aliciyi actigimda uyari ledi 2.5 saniye yaniyor.bazen uyari ledi yanmiyor.uyari ledin yanmasi icin kendim bir kez sinyali kesip alarma hazir hale getiriyorum.kod kismi asagidaki sekilde duzenledim.
 en temel sorun olarak  verici-aliciyi actiktan sonra bulutlu havada soyle bir durum aciga cikti.bulutlar gunesin onune gecince alarm caliyor.yada tam tersi.bulutlu iken sistemi calistirdigimda ve sonrasinda gunes cikinca bu sefer alarm caliyor.
 ir dedektorun onune 8 cm uzunlugunda silindir kalem var.siyah bantla izole edilmis halde.bulutlu havalarda oumsuz etkilenmemesi icin.fakat usten bahsedigim sorunlar buna ragmen oluyor.
ALARM_VER:
 I=I+1
 IF I=0 THEN I=2
 IF I=1 THEN
 PORTB.6=1:PAUSE  2500 :PORTB.6=0
 ENDIF
 IF I<>1 THEN
 PORTB.3=1   
 ENDIF
 GOTO Decode
Yaşam anlamlandırıldıkça kutsaldır....

selvi

head_alarm = 20    
data_alarm = 2
bu degerler neye gore seciliyor.sinyali elimle kestigimde yada hizli onunde gectigimde alarm calmiyor.ancak yavas gecildiginde alarm verebiliyor.hassasiyeti artirmam icin degerleri dusurmem gerekiyor.bunu neye gore yapmaliyim.bu degerleri dusurdugumde kendi kendine tetikleme yapma durumundan cekiniyorum.
 mesafe 8m de cok ciddi bir sorun cikmiyor.biraz bu mesafenin ustune ciktigimda gunesten,bulutlu havadan hatta gece bile kendi kendine alarm calabiliyor.
  vericide 2 tane bc337 i darlington tarzi bagladim.2 ir ledi 2.transistorun emiterine 4r2 direncle seri bagladim.mesafeyi 15m civarina cikarmam mumkun mu?
 onceden 38khz surekli on konumunda tutarak(protokol kullanmadan) 20m e yakin sonuc aliyordum.tabi bu durumda kendi kendine alarm caliyordu.
kullandigim ir ledin datasheeti asagidaki linktedir.sirc protokolune gore en fazla kac ampere dayaniklidir.3 farkli akim degerleri var.mevcut durumda direncten gecen akim=460ma simulasyondaki deger.simulasyonda seri dirence ir led baglamadan olctugum degerler.simulasyonda ir led olmadiginda busekilde olcum yaptim.gercekte olcmedim.ir ledlere bagli seri direnci 2r2 yada 1r dusurursem ir ledler yanar mi?
http://pdf1.alldatasheet.com/datasheet-pdf/view/183628/VISAY/TSUS5202.html
Yaşam anlamlandırıldıkça kutsaldır....

selvi

mevcut durumda sirc protokolu ile yaptigim infrared verici-alici devresi gece veya gunduz fark etmeden yanlis alarm veriyor.
  og hacanin verdigi sirc protokolu iyi bir yontemdi.ozellikle hata_siniri seklinde tanimlar sorunun  cozulecegine donuk bayagi umutlanmistim.gelinen noktada bu yontemde tutmadi.og hocanin verdigi son sekliyle aciga cikan sonuclari paylasmak istedim.yanlis bir uygulama yapacak bir sey yok.verici-alici programlari netti.
  bu yontem datasheet e en uygunuydu.bazi arastirmalar yapmistim.sinyalin protokola gore yollanmasi en uygun yontem denilmis.
acaba cikan bu sorunlar dis ortamda  kullanmamdan kaynakli olabilir.dis ortamda ruzgar,bulutlu ve ruzgarli hava v.b etkenler olumsuz mu etkiliyor?yoksa farkli durumlar mi?bunun onune gecilebilir mi?
dis ortamda infrared sitemini saglikli calistiran var mi?benim kullandigim sistem sinyal kesildiginde alarm caliyor.
Yaşam anlamlandırıldıkça kutsaldır....