avatar_ete

Sony TV kumandası ile röle kontrolü

Başlatan ete, 13 Kasım 2011, 19:56:19

halilgaliç

kardeş ben uzun süredir verdiğim yazılımı kullanıyorum hiç bir sıkıntı yok ır olarak tsop1138 kullanıyorum

ete

Serkan,
Sorunun aşağıdaki kodlarda olması gerekir.
	For Sony_Lp=0 to 11			
Pulsin IR_Sensor,0,P_Val
  If P_Val >= 100 then
    Packet.0[Sony_Lp]=1
  Else    
    Packet.0[Sony_Lp]=0
  Endif
Next

Yanlış anlama kodlar yanlış değil ama zamana bağlı bir kayıt yapacak isen o kaydı önce yapar sonra değerlendirirsin. Şayet hem değerlendireyim hemde kayıt yapayım dersen sonuç sürekli farklı olur. Bunu sebebide komut ların yaratacağı gecikmelerdir.
Bu nedenle önce süreleri kayıt et , kayıt et derken değişkenlerine yarleştir sonra onların 1 veya sıfır olduğunu irdele.
Bu dediklerimden bir şey anlamadı isen belirt daha detaylı anlatayım.

Ete


serkan_31_31

pardon hocam o for döngüsünde şu satırı değiştirmişdim, düzeltmeyi unutmuşum;
    For Sony_Lp=0 to 11         
    Pulsin IR_Sensor,0,P_Val   
      If P_Val >= 90 then       
        Packet.0[Sony_Lp]=1      
      Else                   
        Packet.0[Sony_Lp]=0      
      Endif
    Next

ve ben bu satırı anlıyorum hocam.bunlar sorun değil ama bu kodların aslı çalışıyor.bu kodlar  micro işlemciler hocama ait'tir ama ben düzdün çalıştıramadım
Serkan Ünaldı

ete

Serkan,

Bu kodların çalışmamasının bir sebebi de işlemcinin 20 Mhz de çalışıyor olmasıdır.
Nedne olduğunu açıklamadan önce Sony protokolü hakkında biraz bilgi edinmen gerekiyor.
Protokolde paket başı sinyali 2400us dir. Programda ince bu sinyal yakalanır. Ardından 12 adet data biti alınır.
Data bitlerinin tanımlaması ise şöyledir.
HIGH= 1200us HIHG peşinden 600 us LOW
LOW= 600us HIGH ve peşinden 600 us LOW
Bu durumda PULSIN komutları ile okuman gereken değerler şayet 4 Mhz kristal kullansa idin;
Paket Başı için 240  sen bunu 150 ile 300 arası ise şeklinde almışsın.
HIGH için 120 , sen bunu 90 veya üzeri şeklinde almışsın
LOW için 60  , otomatikman 90 dan küçük ise LOW kabul etmişsin.

Ancak sistem 20 Mhz de çalışınca Pulsin komutu ile okuyacağın değerler 2us nin katları şeklinde gelecektir. Bu durumda;
Paket başı sinyali için ortalama 1200 okuman gerekir
HIGH için ortalama 600 okuman gerekir
LOW için ortalama 300 okuman gerekir.
Bu durumda hem paket başı sinyalini okuyan değişkenin WORD tipinde hemde bitleri okuyan değişkenlerin Word tipinde olması gerekir.
Bunu sağladıktan sonra süreleri yeni değerlere göre ayarlaman gerekiyor.

Header için 1000 ile 1250 arası diyebilirsin Bnece oraya 1000 den büyükse desen daha uygun olur.
High biti için 500 den büyük ise
LOW biti için 500 den küçük ise demen yeterlidir.

Ete

serkan_31_31

#34
çok teşekkür ederm hocam galiba sorunu anladım :)
bu devrenin orjinalinde 4 mhz kristal kullanılmış ben lcd çalışmıyor diye onu 20mhz yaptım bu seerde sony ir kodları düzgün çalışmıyormuş, çok sağolun hocam iyi akşamlar
Serkan Ünaldı

serkan_31_31

olmadı hocam MCS da bu yapmak biraz zor gibi ama ben protonun hazır kodlarını kullanarak yaptım. kusursuz ve gayet iyi bir sonuç aldım isteyen olursa verebilirim açık kodları
Serkan Ünaldı

ete

Çalışsa idi şaşardım zaten. En başta çalışmasının şansa bağlı olduğunu söyledim. O kodlar o şekilde çalışmaz.
Ancak dediğim şekilde çalışabilir.

Ete

hkalaycioglu

ETE hocam bende bu devreyı yaptım  (asm ile çalısanı) gayet güzel çalışıyor elinize saglık col guzel olmus bu devreyı tusa basılı oldugu surece cıkısı aktif hale getiren bır sekılde nasıl yapabiliriz herhalde button komutuylamı yapmamız lazım veya olurmu


hkalaycioglu

ETE hocam bende bu devreyı yaptım  (asm ile çalısanı) gayet güzel çalışıyor elinize saglık col guzel olmus bu devreyı tusa basılı oldugu surece cıkısı aktif hale getiren bır sekılde nasıl yapabiliriz herhalde button komutuylamı yapmamız lazım veya olurmu

ete

Buton ile çalışan sistemlerin iki değişik şekilde çalışabileceklerini biliyoruz.
Bunlardan birincisi butona bir kere basılıp bırakılınca bağlı sistemin açılması ve açık kalması yeniden butona basılınca kapanması ve kapalı kalması yani TOGGLE dediğimiz sistem,
Diğeri ise basbırak sistemidir. Butona basıldığı müddetçe sistem açık kalır ve buton bırakılınca sistem kendiliğinden kapalı konuma geçer.

Şimdi sendeki program birinci çalışma şekline göre çalışıyor ve sen ikinci şekli istiyorsun. Bunu yapmanın temel mantığı şöyledir.

IR girişine bakarsın. Diyelimki 1 nolu butona bastık ve 1 nolu röle çekti. Elimi butona basılı tutuyorum . Program yeniden UR girişine bakar ve hala aynı buton basılı tutyor ise yeniden başa dönüp aynı işi tekrarlar. Şayet butonu bırakmış isem program buton kontrolünü aşar ve röleyi resetler. Böylece röle bırakmış olur.
Sistemin temeli budur. Şİmdi gerekli değişikliği yapabilmek için kullandığın programa bakmak lazım. Sen en iyisi asm kısmı hariç basic kısmını buraya yaz veya bana yolla bakıp ne yapman gerektiğini söyleyeyim.
Elimdekilere bakamıyorum çünki bir sürü versiyon var elimde hangisini kullanıyorsun bilemiyorum.
Ete

hkalaycioglu

hocam kullandıgım bu program

@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_on
@ DEVICE pic16F628, PWRT_On
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_On
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
'@ DEVICE pic16F628, XT_OSC
CMCON=7
clearwdt
'INCLUDE "MODEDEFS.BAS"
TRISA=%00000001
TRISB=0               '            TUS KODLARI:
DEFINE OSC 4         '            (0 = 1 Tusu)-(8 = 9 Tusu)-(9 = 0 Tusu)               
'PAKET   Equ   12                     16= PROGRAM +
'P_Val   Equ   14                     17= PROGRAM -
'BUTON   Equ   15                     18= VOLUM +
'ALET   Equ   16                     19= VOLUM -
'Cntr   Equ   17                     20= MUTE
'Bitcnt   Equ   18                     21= ON/OFF
'---------------------- DEĞİŞKENLERİMİZ --------------------------------------------------
'TUS    VAR BYTE            'Alet kodları, 1=TV , 2=VCR-1, 4=VCR-2
Tmp1   var byte         '              6=lazer disk, 12=ses cihazları
Tmp2   VAR BYTE            '              16=mini kaset radyo, 17=CD Çalar
Bayrak VAR BYTE
flama  var BYTE            '              18=Ekolizier
ERO    VAR BYTE
Bit_Cntr VAR BYTE
Cmd_Byte var byte
Dev_Byte  var byte
POZ    VAR BIT
LoX    VAR BYTE
'PAKET  VAR WORD
'PAKETL VAR PAKET.BYTE0
'PAKETH VAR PAKET.BYTE1
'P_VAL  VAR BYTE
BUTON  VAR BYTE
ALET   VAR BYTE
'CNTR   VAR BYTE
'BITCNT VAR BYTE
'DELAYL VAR BYTE
'DELAYH VAR BYTE
'------------------------------------------------------------------------------------------
clear
'data @0,0
PORTB=0:PORTA=2
Pause 200
porta=0
pause 200
porta=2
pause 200
porta=0
pause 200
porta=2
pause 200
ero=0
PORTA=0
poz=0
read 0,buton
portb=buton
if buton>0 then HIGH PORTA.1
'------------------------ PROGRAM BAŞLANGICI ----------------------------------------------
BASLA: BUTON=200
       IF PORTB=0 THEN PORTA=0
ARA:   low bayrak.7: gosub TUSBAK
       pause 10
       if bayrak.7=1 then
        poz=0
        goto ara
        endif
       IF (BUTON>21) AND (ero=1) THEN       
        POZ=0
        goto ara
       endif
      IF BUTON=0 Then KIRKSEKIZ
      IF BUTON=1 Then KIRKDOKUZ  ' -->>| TUŞU
      IF BUTON=2 Then ELLIBIR      ' <<-- TUŞU 'ALT SIRA'
      IF BUTON=3 Then ELLIIKI    ' -->> TUŞU 'ALT ORTADA'
       IF BUTON=4 Then KIRKDORT   ' REPEAT TUŞU
      IF BUTON=21 Then YIRMIBIR   ' ON/OFF
      Ero=1
       GOTO BASLA
'-----------------------------------------------------------------------------------
YIRMIBIR:   
         IF POZ=1 THEN basla
              IF PORTB=0 THEN
                PORTB=31:PORTA=2
              ELSE
                PORTB=0:PORTA=0
              ENDIF
            goto CIK
               
KIRKSEKIZ:    
           IF POZ=1 THEN basla
           TOGGLE PORTB.0
GIT:       IF PORTB>0 THEN PORTA=2
           
CIK:       POZ=1
           ero=0
           ALET=portb & %00011111
           write 0,ALET
           PAUSE 10
           GOTO basla

KIRKDOKUZ:
           IF POZ=1 THEN basla
           TOGGLE PORTB.1
           GOTO GIT
           
ELLIBIR:   
           IF POZ=1 THEN basla
           TOGGLE PORTB.2
           GOTO GIT
           
ELLIIKI: 
           IF POZ=1 THEN basla
           TOGGLE PORTB.3
           GOTO GIT
           
KIRKDORT: 
           IF POZ=1 THEN basla
           TOGGLE PORTB.4
           GOTO GIT   
'---------------------------------------------------------------------------------------
TUSBAK:
Asm
Start   clrwdt
        call   ReadIR         ;read IR signal
endasm
return

';       retlw   0x00
ASM
ReadIR   clrwdt
        call   R_Pulse
      btfss   _flama,   1
      goto   ReadIR         ;wait for start pulse (2.4mS)

Get_Data
        clrwdt
       movlw   0x07         ;set up to read 7 bits
        movwf   _Bit_Cntr
        clrf    _Buton
Next_RcvBit2   
        call   R_Pulse
      btfsc   _flama,   1   ;abort if another Start bit
      goto   ReadIR
      btfsc   _flama,   0      ;abort if error
      goto   ReadIR

        bcf     STATUS    , C
        btfss   _flama,    3
        bsf     STATUS    , C
        rrf     _Buton  , f
        decfsz  _Bit_Cntr  , f
        goto    Next_RcvBit2

        rrf     _Buton  , f      ;correct bit alignment for 7 bits

Get_Cmd   movlw   0x05         ;set up to read 5 bits
        movwf   _Bit_Cntr
        clrf    _Dev_Byte
Next_RcvBit
        call   R_Pulse
      btfsc   _flama,   1   ;abort if another Start bit
      goto   ReadIR
      btfsc   _flama,   0      ;abort if error
      goto   ReadIR

        bcf     STATUS    , C
        btfss   _flama,    3
        bsf     STATUS    , C
        rrf     _Dev_Byte  , f
        decfsz  _Bit_Cntr  , f
        goto    Next_RcvBit

        rrf     _Dev_Byte  , f      ;correct bit alignment for 5 bits
        rrf     _Dev_Byte  , f      
        rrf     _Dev_Byte  , f      
        retlw   0x00
;end of ReadIR

R_Pulse clrwdt
        clrf   _LoX
      btfss   PORTA,    0   ;wait until high
        goto    $-1
      clrf   _tmp1
      movlw   0xC0         ;delay to decide new keypress
      movwf   _tmp2         ;for keys that need to toggle
S_High   clrwdt
        btfss   PortA,  0   ;and wait until goes low
        goto    Next
      incfsz   _tmp1,f
      goto   S_High
      incfsz   _tmp2,f
      goto   S_High
      bsf       _Bayrak ,   7      ;set New flag if no button pressed
      goto   S_High
Next   
        nop
      nop
      nop
      nop
      nop            ;waste time to scale pulse
      nop            ;width to 8 bits
      nop
      nop
      nop
      nop
      nop
      nop
      incf   _LoX,   f
        btfss   PortA,0
        goto    Next         ;loop until input high again
;read pulse width, return flag for StartFlag, One, Zero, or ErrFlag
;output from IR receiver is normally high, and goes low when signal received
; test if Zero, One, or Start (or error)
      
Chk_Pulse   clrf   _flama

TryError
        movf    _LoX,   w      ; check if pulse too small
        addlw    255 - 20      ; if LoX <= 20
        btfsc   STATUS    , C
        goto    TryZero
      bsf       _flama,   0      ; Error found, set flag
      retlw   0x00

TryZero   
       movf   _LoX,   w      ; check if zero
        addlw    255 - 60      ; if LoX <= 60
        btfsc   STATUS    , C
        goto    TryOne
      bsf       _flama,   3      ; Zero found, set flag
      retlw   0x00

TryOne    movf  _LoX,   w      ; check if one
        addlw    255 - 112      ; if LoX <= 112
        btfsc   STATUS    , C
        goto    TryStart
      bsf       _flama,   2      ; One found, set flag
      retlw   0x00

TryStart    movf    _LoX,   w      ; check if start
        addlw    255 - 180      ; if LoX <= 180
        btfsc   STATUS    , C
        goto    NoMatch
      bsf       _flama,   1   ; Start pulse found
      retlw   0x00
NoMatch                  ; pulse too long
      bsf       _flama,   0      ; Error found, set flag      
      retlw   0x00
EndAsm
End
      

ete

#41
Sorunun cevabını yalnızca bir tuş üzerinden vereceğim. Burada On/off butonunu bu konu haricinde tutacağız. Zira onun toggle çalışması gerekiyor ama istersen onuda kendin değiştirebilirsin.

Şimdi kumanda üzerinde 1 tuşuna basıldığı zaman aşağıda gördüğün KIRKSEKIZ isimli etiket çalışmaktadır.
Mevcut programda TOGGLE PORTB.0 komutu PortB.0 pinini bir kere basıldımı HIGH bırakıp yeniden basıldımı LOW yapmaktadır. Anlayacağın her basılışta PORTB.0 pini konum değiştirmektedir.
Şimdi bunu butona basıldığı süre zarfında HIGH da tutup buton bırakılınca aynı pini LOW olacak şekilde değiştireceğiz.
KIRKSEKIZ:    
           IF POZ=1 THEN basla
           TOGGLE PORTB.0
GIT:       IF PORTB>0 THEN PORTA=2
           
CIK:       POZ=1
           ero=0
           ALET=portb & %00011111
           write 0,ALET
           PAUSE 10
           GOTO basla

TOGGLE PORTB.0 komutu yerine HIGH PORTB.0 yazarsam. sorun büyük ölçüde hallolmuş sayılıyor. Bu şekilde butona basıldımı PORTB.0 HIGH olacak ve program GOTO BASLA komutu ile yeniden başla satırına gidecektir. Orada yeniden GOSUB TUSBAK komutu ile hangi tuşa basılmış bakmaya gidecek ve hala aynı tuş basılmış ise yeniden KIRKSEKIZ etiketine gidilecektir.
Dikkat edersen O etiketin hemen altında şu komut satırı bulunuyor;
IF POZ=1 THEN basla
Bu şu anlama geliyor. İlk defa 1 tuşuna basıldığı zaman POZ=0 olduğu için altındaki HIGH PORTB.0 komutu çalışmış oldu ve altında yer alan POZ=1 komutu ile poz değeri 1 yapıldı. Şimdi tuşu bırakmadığım sürece Poz=1 kalacağı için program Kırsekiz etiketinden Basla etiketine dönecektir. Bu ise bize tuşa basıldığı sürece PortB.0 pinini HIGH da tutma imkanı sağlayacaktır.
Peki tuuşu bırakınca ne olacak. İşte bir değişiklikte burada yapmak gerekecek.
Tuşu bırakınca hiç bir tuş basılı olmayacağı için bayrak.7 biti 1 olarak geri dönecektir. Bu durumda bu durumu kontrol eden aşağıdaki program satırlarında değişiklik yapacağız.
if bayrak.7=1 then
        poz=0
        goto ara
        endif

Bu satırları şöyle değiştirmemiz gerekecek.
if bayrak.7=1 then
        poz=0
        Buton=200
        endif

Bu sayede tuşa basılmadığı zaman program hemen başa tekrar dönmeyecek ve alt satırlara geçecektir.
Altta şu satır mevcut;
Ero=1 bu satıra şunları ilave edersek;
PortB=0 :pause 1 işimiz hallolmuş olacaktır.
Program alt satırlara geçip PortB de set edilmiş pinleri reset edecek ve böylece onlara röle bağlı ise röleler bırakmış olacaktır.
Hepsi bu kadar.
Anlattıklarımdan bir şeyler anladı ise yap bakalım görelim ne anlamışsın.

Ete

hkalaycioglu

#42
ete  hocam dediğiniz değişikleri yaptım fakat 1 tuşuna basınca açıyor bırakınca o şekilde kalıyor değişiklik olmuyor söylediklerinizi yaptım program bu şekilde oldu ama çalışmıyor. yoksa benmı yanlıs anladım en son halini gonderdım
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_on
@ DEVICE pic16F628, PWRT_On
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_On
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
'@ DEVICE pic16F628, XT_OSC
CMCON=7
clearwdt
'INCLUDE "MODEDEFS.BAS"
TRISA=%00000001
TRISB=0 ' TUS KODLARI:
DEFINE OSC 4 ' (0 = 1 Tusu)-(8 = 9 Tusu)-(9 = 0 Tusu)
'PAKET Equ 12 16= PROGRAM +
'P_Val Equ 14 17= PROGRAM -
'BUTON Equ 15 18= VOLUM +
'ALET Equ 16 19= VOLUM -
'Cntr Equ 17 20= MUTE
'Bitcnt Equ 18 21= ON/OFF
'---------------------- DEĞİŞKENLERİMİZ --------------------------------------------------
'TUS    VAR BYTE            'Alet kodları, 1=TV , 2=VCR-1, 4=VCR-2
Tmp1   var byte         '              6=lazer disk, 12=ses cihazları
Tmp2   VAR BYTE            '              16=mini kaset radyo, 17=CD Çalar
Bayrak VAR BYTE
flama  var BYTE            '              18=Ekolizier
ERO    VAR BYTE
Bit_Cntr VAR BYTE
Cmd_Byte var byte
Dev_Byte  var byte
POZ    VAR BIT
LoX    VAR BYTE
'PAKET  VAR WORD
'PAKETL VAR PAKET.BYTE0
'PAKETH VAR PAKET.BYTE1
'P_VAL  VAR BYTE
BUTON  VAR BYTE
ALET   VAR BYTE
'CNTR   VAR BYTE
'BITCNT VAR BYTE
'DELAYL VAR BYTE
'DELAYH VAR BYTE
'------------------------------------------------------------------------------------------
clear
'data @0,0
PORTB=0:PORTA=2
Pause 200
porta=0
pause 200
porta=2
pause 200
porta=0
pause 200
porta=2
pause 200
ero=0
PORTA=0
poz=0
read 0,buton
portb=buton
if buton>0 then HIGH PORTA.1
'------------------------ PROGRAM BAŞLANGICI ----------------------------------------------
BASLA: BUTON=200
       IF PORTB=0 THEN PORTA=0
ARA:   low bayrak.7: gosub TUSBAK
       pause 10
       if bayrak.7=1 then
        poz=0
       Buton=200
        endif
       IF (BUTON>21) AND (ero=1) THEN       
        POZ=0
       PortB=0 :pause 1
        goto ara
       endif
   IF BUTON=0 Then KIRKSEKIZ
   IF BUTON=1 Then KIRKDOKUZ  ' -->>| TUŞU
   IF BUTON=2 Then ELLIBIR    ' <<-- TUŞU 'ALT SIRA'
   IF BUTON=3 Then ELLIIKI    ' -->> TUŞU 'ALT ORTADA'
       IF BUTON=4 Then KIRKDORT   ' REPEAT TUŞU
   IF BUTON=21 Then YIRMIBIR   ' ON/OFF
   Ero=1
       GOTO BASLA
'-----------------------------------------------------------------------------------
YIRMIBIR:
IF POZ=1 THEN basla
              IF PORTB=0 THEN
                PORTB=31:PORTA=2
              ELSE
                PORTB=0:PORTA=0
              ENDIF
            goto CIK

KIRKSEKIZ:
           IF POZ=1 THEN basla
         HIGH PORTB.0
GIT:       IF PORTB>0 THEN PORTA=2
           
CIK:       POZ=1
           ero=0
           ALET=portb & %00011111
           write 0,ALET
           PAUSE 10
           GOTO basla

KIRKDOKUZ:
           IF POZ=1 THEN basla
           TOGGLE PORTB.1
           GOTO GIT
           
ELLIBIR:   
           IF POZ=1 THEN basla
           TOGGLE PORTB.2
           GOTO GIT
           
ELLIIKI: 
           IF POZ=1 THEN basla
           TOGGLE PORTB.3
           GOTO GIT
           
KIRKDORT: 
           IF POZ=1 THEN basla
           TOGGLE PORTB.4
           GOTO GIT   
'---------------------------------------------------------------------------------------
TUSBAK:
Asm
Start   clrwdt
        call ReadIR ;read IR signal
endasm
return

';    retlw 0x00
ASM
ReadIR clrwdt
        call R_Pulse
btfss _flama, 1
goto ReadIR ;wait for start pulse (2.4mS)

Get_Data
        clrwdt
    movlw   0x07 ;set up to read 7 bits
        movwf   _Bit_Cntr
        clrf    _Buton
Next_RcvBit2   
        call R_Pulse
btfsc _flama, 1 ;abort if another Start bit
goto ReadIR
btfsc _flama, 0 ;abort if error
goto ReadIR

        bcf     STATUS    , C
        btfss   _flama, 3
        bsf     STATUS    , C
        rrf     _Buton  , f
        decfsz  _Bit_Cntr  , f
        goto    Next_RcvBit2

        rrf     _Buton  , f ;correct bit alignment for 7 bits

Get_Cmd movlw   0x05 ;set up to read 5 bits
        movwf   _Bit_Cntr
        clrf    _Dev_Byte
Next_RcvBit
        call R_Pulse
btfsc _flama, 1 ;abort if another Start bit
goto ReadIR
btfsc _flama, 0 ;abort if error
goto ReadIR

        bcf     STATUS    , C
        btfss   _flama, 3
        bsf     STATUS    , C
        rrf     _Dev_Byte  , f
        decfsz  _Bit_Cntr  , f
        goto    Next_RcvBit

        rrf     _Dev_Byte  , f ;correct bit alignment for 5 bits
        rrf     _Dev_Byte  , f
        rrf     _Dev_Byte  , f
        retlw 0x00
;end of ReadIR

R_Pulse clrwdt
        clrf _LoX
btfss   PORTA, 0 ;wait until high
        goto    $-1
clrf _tmp1
movlw 0xC0 ;delay to decide new keypress
movwf _tmp2 ;for keys that need to toggle
S_High clrwdt
        btfss   PortA,  0 ;and wait until goes low
        goto    Next
incfsz _tmp1,f
goto S_High
incfsz _tmp2,f
goto S_High
bsf     _Bayrak , 7 ;set New flag if no button pressed
goto S_High
Next
        nop
nop
nop
nop
nop ;waste time to scale pulse
nop ;width to 8 bits
nop
nop
nop
nop
nop
nop
incf _LoX, f
        btfss   PortA,0
        goto    Next ;loop until input high again
;read pulse width, return flag for StartFlag, One, Zero, or ErrFlag
;output from IR receiver is normally high, and goes low when signal received
; test if Zero, One, or Start (or error)

Chk_Pulse clrf _flama

TryError
        movf _LoX, w ; check if pulse too small
  addlw 255 - 20 ; if LoX <= 20
  btfsc   STATUS    , C
  goto TryZero
bsf     _flama, 0 ; Error found, set flag
retlw 0x00

TryZero
    movf   _LoX, w ; check if zero
  addlw 255 - 60 ; if LoX <= 60
  btfsc   STATUS    , C
  goto TryOne
bsf     _flama, 3 ; Zero found, set flag
retlw 0x00

TryOne movf  _LoX, w ; check if one
  addlw 255 - 112 ; if LoX <= 112
  btfsc   STATUS    , C
  goto TryStart
bsf     _flama, 2 ; One found, set flag
retlw 0x00

TryStart movf _LoX, w ; check if start
  addlw 255 - 180 ; if LoX <= 180
  btfsc   STATUS    , C
  goto NoMatch
bsf     _flama, 1 ; Start pulse found
retlw 0x00
NoMatch ; pulse too long
bsf     _flama, 0 ; Error found, set flag
retlw 0x00
EndAsm
End

ete

Bir şey daha deneyelim.
Aşağıdaki satırları bul;
      
if bayrak.7=1 then
        poz=0
        Buton=200
endif

Bu satırları yine aşağıdaki şekilde değiştir.
      
if bayrak.7=1 then
        poz=0
        Buton=200
        PORTB=0
endif

Bakalım bu  şekilde çalışacakmı.

Ete

hkalaycioglu

ete hocam bu dedıgınızıde denedım 48 nolu etıket kendı kendıne kumanda kontrolu dısında acılıp kapatıyor

Powered by EzPortal