dış ortamda infrared

Başlatan selvi, 14 Haziran 2009, 16:50:31

selvi

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 2500  '// 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
 
'// Define variables
Index    VAR BYTE     '// Index counter
IR_PULSE VAR BYTE(12) '// 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_header var byte
hata_data var byte
head_alarm var byte
data_alarm var byte

head_alarm = 15        ' header gelmezse alarm verme sýnýrý,header süresi (2,4msn) ile alakalýdýr, belli bir limit altýna inemez, inerse alarm alýnýr  
data_alarm = 2         ' data yanlýþ gelirse alarm verme sýnýrý
'// Test for encode or decode function & configure I/O
OPTION_REG.7 = 1    '// PORTB internal pull-ups = off
TRISA= %00000000    
TRISB= %00000001
PORTB=0
PAUSE 60            '// Stabilize on power-up
  
Decode:
   PULSIN PORTB.0,0,PULSE_IN        '// Read-in start pulse
   IF (PULSE_IN < 200) OR (PULSE_IN = 0)  THEN      '// Less than Start pulse, then keep looking  
     hata_header = hata_header + 1                   ' header gelmediyse hatayý 1 arttýr
    if hata_header > head_alarm then alarm_ver      ' Hata sýnýrý gecildiyse alarm ver
    GOTO Decode                                    ' Hata sýnýrý gecilmediyse tekrar headera bak
   ENDIF
   hata_header = 0                                  ' header geldi hata ölçücüsünü sýfýrla

Verify:                              '// Read, Decode, then verify data
   FOR Index = 0 TO 11               '// 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 = 127                       '// Start with all 1's and find each 0
   FOR Index = 0 TO 6                '// Get 8 "data" bits
    IF IR_PULSE[Index] < 100 THEN DBYTE.0[Index]=0 '// Less than 1mS = 0
   NEXT Index
   ABYTE = 255           '// Start with all 1's and find each 0 in pattern
   X=0                   '// Initialize address bit index pointer to bit 0
   FOR Index = 7 TO 11   '// 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.
     
   '' Karþýdan gelen 1. (3 gönderildi) ve 2. (1 gönderildi) data alýndý
   '' Saðlama yapalým
   
   if DBYTE <> 3 or ABYTE <> 1 then               ' Gelenler gönderilenlerden farklý ise
        hata_data = hata_data + 1
        if hata_data > data_alarm then alarm_ver ' 
   ENDIF     
        goto Decode
 ALARM_VER:
  PORTB.3=1
 GOTO Decode
END
 
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
 
'// Test for encode or decode function & configure I/O
              '// Stabilize on power-up
  TRISA = %00000000
  TRISB = %00000000   '// PORTB.3 = output LED drive. Rest inputs for address
  PAUSE 50
  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
ENCODE:
DBYTE = 3   
   '// 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 6 '// 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 = 1  '// 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)
GOTO ENCODE        
 
   END
  

ir_sema:
asagidaki link ir gozun islemciyle baglarken ki semasi.ben 16f628 kullaniyorum.ir gozun cikisi rb0 ayagina bagli.ayni semayi kullandim.
http://img461.imageshack.us/i/tsop1738ch2.jpg/
ir verici semasida asagidaki gibi:
http://rapidshare.com/files/253288809/ir_verici_sema.rar.html
Yaşam anlamlandırıldıkça kutsaldır....

gladi

isis çizimler yok

selvi neden on/off şeklinde yapmıyorsun ... böle protokollü birşey yaptıgında ... zamanlamalar da önemli alıcı verici senkron şekilde kurgulaman lazım ... zamanlamaları ... mesala alıcı bekliyorki veri gelsin ...arada alarm vermesi gerekirken ... o hala veri bekiliyorki hata verecek ... veya tersi ...
misafir olan kimse, beraberce getiremediği birşeye kalbini bağlamaz.

selvi

Alıntı yapılan: "nonstradam"TSOP1738 ile kutu yani devren arasında mesafe uzun ise elektriksel gürültülerede maruz kalıyor olabilirsin. yazılımında problemler oluyor olabilir. kapalı ortamda sorunsuz çalıştığına eminsen yani programının hata yapmadığına eminsen arkadaşların fleksi ve mercek uyarılarınıda gerçekleştirirsen sorun olacağını düşünmüyorum. tsop türü ır alıcılar dış ışık kaynaklarında gelebilecek gürültüleri minimize eder. benim şu anda dış ortamda sorunsuz çalışan bir projem var dediğin gibi bir problemle karşılaşmadım. mercekte koymadım sadece fleksi var.yazılımını kontrol etmeni tavsiye ederim. gönderdiğin kod sayısınıda arttırman faydalı olabilir sadece bir byte yerine "picproje12345" gibi bir kod gönderirsen daha iyi olur kanaatindeyim. iyi çalışmalar kolay gelsin...


not: bu şekildede sorunun çözülmez ise
alarm devresi demişsin, bir taraf sürekli yolluyor bir taraf sürekli alıyor arada kesim olursa alarmın devreye giriyor. sanırım sistemin bu şekilde çalışıyor. gönderme alma zamanların arasında ki çok küçük farklılıklarda sistemini tetikleyebilir. alıcı tarafında kesilimin olduğu bölüme for next döngüsü gibi bir uygulama yapabilirsin. kesilimin devamlılığına bakarsın mesela bir datanın gelmemesi durumunda alarmı aktif et yerine. peş peşe 200ms süresince gelen veri olmazsa alarmı aktif et gibi bir döngü kurarsan arada kaçabilecek bir byte ı veya çevreden gelebilecek küçükte olsa ışık veya elektriksel parazitleride böylelikle filtrelemiş olursun
hocam siz disortamdan saglikli calisan infrared sisteminden bahsettiniz.ben uzun bir suredir ugrasiyorum.fakat tam sonuc alamadim.kendi kendine alarm caliyor.
sony sirc protokulene gore islem yapiyorum.sizin  kullandiginizin infrared sistemin kac metrede saglikli iletisim yapiyor.dis ortam faktorlerinden ne kadar etkileniyor.belirttiginiz sistem hep acik mi?yani surekli calisiyor mu?mumkunse bu yonlu bilgilerinizi aylasabilir misiniz?ir dedektor olarak ne kullandiniz?
Yaşam anlamlandırıldıkça kutsaldır....

nonstradam

Benim yaptığım proje alarm devresi değilde dış ortamda çalışan bir cihazın kontrolüydü. piyasada bulunan sony tv kumandaları ile benim yaptığım devreyi kontrol ettim. devre dış ortamda çalışıyor. güneşin altında 5m civarından sorunsuz haberleşiyor. geceleri bu mesafe 7m civarına çıkıyor. şimdiye kadar kumandanın almaması gibi bir durumla karşılaşmadım. ir sensör olarak tsop 1138 kullandım. yanlız şöyle birşey var. benim yazdığım program hi-tech ile yazıldı tamamen interrupt düzeyinde çalışıyordu. bit veya byte kaçırması çok zor. timer lar ile time outlar kurulu. protokolü gerçek anlamda decode ettik diyebilirim. senin programın ise basic ile yazılmış. bu yazılımın bit-byte kaçırma olasılığı çok fazla. basic in hazır komutları kullanılmış birde, güvenmek zor. birde şu konu var ir sensör ün besleme bacaklarının dibine 10uF gibi bir kondansatör koymanında büyük faydaları var.

picusta

Elektronikten biraz uzak bir cevap olacak ama,
Bu projeyi soyutlarsak, ve sadece ihtiyacimiz olan fonksyona bakarsak söyle teoriye dökebiliriz:
Gürültülü bir ortama X süre boyunca önceden belirlenmis bir sinyal veriliyor (istedigimiz sekilde bir sinyal verebiliyoruz). çikis olarak bu sinyal + ortam gurültüsünü ölçüyoruz.
Istedigimiz ise bu sinyalin gönderiliyor olup olmadigini bilmek.
Radarlarda ve sonarlarda benzer sorunla karsilasiyoruz.

Sinyal teorisi dersi isleyen arakadaslarin cevaplayabilecegi bir soru :
Nasil bir sinyal vermeliyiz ki (beyaz)gürültüden sinyalimizi rahatlikla çikaralim (ayni genligi olan sinyallere göre)?
Sinyali ölçtügümüz çikistan çikartmak için nasil bir isleme tutmaliyiz?
Bu islemi hangi elektronik düzenekler yapabilir (veya mcu algoritmasi)?