Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: ete - 15 Şubat 2006, 15:30:55

Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 15 Şubat 2006, 15:30:55
Arkadaşlar,

Holtek firmasının HT6012 diye bir entegresi. Genelde Uzaktan kumanda verici devrelerinde kodlama için kullanılıyor.
Bu entegrenin yer aldığı devreden gönderilen  kodlanmış bilgileri pic ile çözmeye çalışıyorum.
Sistem yaklaşık 12 ms lik bir Low sinyali ve peşinden 666,666 us lik bir high sinyalinden oluşan bir pilot (header) sinyali ile başlıyor.
Peşinden 11 adet adres +data biti gönderiliyor.
Ancak bitlerin şekli aşağıdaki gibi.


High = __666,66us___|---333,33us--|____666,66us___|---333,33us--|
Low = __333,33us__|----666,66us---|__333,33us__|-----666,66us----|
Z(boş)=____666,66us___|---333,33us--|__333,33us__|---666,33us---|

İşin bütünü bir alarm devresi ile ilgili sisteme program öğrenme butonu koyacağım için kendi decoderini kullanamıyorum. İşin bu kısmını Assembly ile çözmem gerekiyor. Aslında kodların büyük kısmını yazdım.
Fakat bayağı uzun oldu ve kodun kısaltılması gerekiyor. yardımcı olabilirseniz sevinirim. Hatta daha akıllıca bir kod üretebilecek bir arkadaş varsa vede fikir verebilirse memnun olurum.

ETE


R_Pulse
          Call    RF_TEST
          movlw   0x05
          subwf   _tmp2,w
          btfss   status,z
          goto    R_Pulse   ;12 ms değil ohalde tekrar bak
          call    RF_TEST   ;Burada 12ms pilot bulundu, peşindeki bitleri oku
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    devam_a0  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,0 ;evet --o halde A0=0 mış şimdi A1'e bakmaya git
          Goto    A1
Devam_a0   Call    RF_TEST   ;şimdi A0 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA0     ; hayır ohalde 666us ve A0=1 dir
          bsf     _ZBOS1,0  ; evet ohalde A0=Z dir.
          goto    A1
BirA0      bsf     _Bilgi1.0

;----------------buraya kadar A0 bitinin durumu hesaplandı-----------------
A1         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A1  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,1 ;evet --o halde A1=0 mış şimdi A2'e bakmaya git
          Goto    A2
Devam_A1   Call    RF_TEST   ;şimdi A1 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA1     ; hayır ohalde 666us ve A1=1 dir
          bsf     _ZBOS1,1  ; evet ohalde A1=Z dir.
          goto    A2
BirA1      bsf     _Bilgi1.1
;----------------buraya kadar A1 bitinin durumu hesaplandı---------------------
A2         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A2  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,2 ;evet --o halde A2=0 mış şimdi A3'e bakmaya git
          Goto    A3
Devam_A2   Call    RF_TEST   ;şimdi A2 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA2     ; hayır ohalde 666us ve A2=1 dir
          bsf     _ZBOS1,2  ; evet ohalde A2=Z dir.
          goto    A3
BirA2      bsf     _Bilgi1.2
;----------------buraya kadar A2 bitinin durumu hesaplandı---------------------
A3         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A3  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,3 ;evet --o halde A3=0 mış şimdi A4'e bakmaya git
          Goto    A4
Devam_A3   Call    RF_TEST   ;şimdi A3 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA3     ; hayır ohalde 666us ve A3=1 dir
          bsf     _ZBOS1,3  ; evet ohalde A3=Z dir.
          goto    A4
BirA3      bsf     _Bilgi1.3
;----------------buraya kadar A3 bitinin durumu hesaplandı---------------------
A4         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A4  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,4 ;evet --o halde A4=0 mış şimdi A5'e bakmaya git
          Goto    A5
Devam_A4   Call    RF_TEST   ;şimdi A4 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA4     ; hayır ohalde 666us ve A4=1 dir
          bsf     _ZBOS1,4  ; evet ohalde A4=Z dir.
          goto    A5
BirA4      bsf     _Bilgi1.4
;----------------buraya kadar A4 bitinin durumu hesaplandı---------------------
A5         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A5  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,5 ;evet --o halde A5=0 mış şimdi A6'e bakmaya git
          Goto    A6
Devam_A5   Call    RF_TEST   ;şimdi A5 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA5     ; hayır ohalde 666us ve A5=1 dir
          bsf     _ZBOS1,5  ; evet ohalde A5=Z dir.
          goto    A6
BirA5      bsf     _Bilgi1.5
;----------------buraya kadar A5 bitinin durumu hesaplandı---------------------
A6         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A6  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,6 ;evet --o halde A6=0 mış şimdi A7'e bakmaya git
          Goto    A7
Devam_A6   Call    RF_TEST   ;şimdi A6 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA6     ; hayır ohalde 666us ve A6=1 dir
          bsf     _ZBOS1,6  ; evet ohalde A6=Z dir.
          goto    A7
BirA6      bsf     _Bilgi1.6
;----------------buraya kadar A6 bitinin durumu hesaplandı---------------------
A7         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A7  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi1,7 ;evet --o halde A7=0 mış şimdi A8'e bakmaya git
          Goto    A8
Devam_A7   Call    RF_TEST   ;şimdi A7 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA7     ; hayır ohalde 666us ve A7=1 dir
          bsf     _ZBOS1,7  ; evet ohalde A7=Z dir.
          goto    A8
BirA7      bsf     _Bilgi1.7
;----------------buraya kadar A7 bitinin durumu hesaplandı---------------------
A8         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A8  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi2,0 ;evet --o halde A8=0 mış şimdi A9'e bakmaya git
          Goto    A9
Devam_A8   Call    RF_TEST   ;şimdi A8 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA8     ; hayır ohalde 666us ve A8=1 dir
          bsf     _ZBOS2,0  ; evet ohalde A8=Z dir.
          goto    A9
BirA8      bsf     _Bilgi2.0
;----------------buraya kadar A8 bitinin durumu hesaplandı---------------------
A9         Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A9  ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi2,1 ;evet --o halde A9=0 mış şimdi A10'e bakmaya git
          Goto    A10
Devam_A9   Call    RF_TEST   ;şimdi A9 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA9     ; hayır ohalde 666us ve A9=1 dir
          bsf     _ZBOS2,1  ; evet ohalde A9=Z dir.
          goto    A10
BirA9      bsf     _Bilgi2.1
;----------------buraya kadar A9 bitinin durumu hesaplandı---------------------
endasm
asm
A10        Call    RF_TEST            
          call    BOY_TEST  ;bakalım High me - LOW mu - Z mi
          btfss   _Bayrak,0 ;Bayrak,0=1 mi
          goto    Devam_A10 ;hayır o halde diğer bitlere bakmak üzere devam et
          bcf     _Bilgi2,2 ;evet --o halde A10=0 mış şimdi A11'e bakmaya git
          Goto    A11
Devam_A10  Call    RF_TEST   ;şimdi A10 için diğer bitlere bakalım
          Call    BOY_TEST  ; bak bakalım boy ne uzunlukta
          btfss   _Bayrak,0 ; 333us mi
          goto    BIRA10    ; hayır ohalde 666us ve A10=1 dir
          bsf     _ZBOS2,2  ; evet ohalde A9=Z dir.
          goto    A11
BirA10     bsf     _Bilgi2.2
;----------------buraya kadar A9 bitinin durumu hesaplandı---------------------
A11        retlw   0x00

BOY_TEST
          clrf   _Bayrak
          movf   _tmp1,w
          addlw  255-27
          btfsc  status,c
          goto   zero  
          bsf    _Bayrak,0   ; 2 tmp2 =<4 ise
          retlw  0x00  
         
zero
          movf   _tmp1,w
          addlw  255-52
          btfsc  status,c
          goto   zero  
          bsf    _Bayrak,1   ; 2 tmp2 =<4 ise
          retlw  0x00    
       
RF_TEST
          clrf    _tmp1
          clrf    _tmp2
          clrf _tmp3
          clrf    _tmp4
          btfsc   PORTA, 0 ; RF girişi LOW mu?
          goto    $-1         ; hayır high ve tekrar bak
S_High   btfss   PortA,  0 ;RF girişi High mı?
          goto    SIFIROLC        ;Hayır LOW, ohalde git puls süresini say
  incfsz _tmp1,f
  goto S_High
  incfsz _tmp2,f
  goto S_High
  bsf    _Bayrak , 0
  goto S_High
SIFIROLC  
          btfsc   PortA,0
          goto    Bir_Olc
  NOP
  NOP
          incfsz _tmp1,f
          goto    SIFIROLC
          incfsz _tmp2,f
          retlw    0x00
          bsf    _Bayrak ,0  ;bayrak.0 biti set edildi yani taşma var.
          retlw   0x00

Bir_Olc    btfss   PortA,0     ;RF=1 mi
          retlw   0x00        ;Hayır RF=0 goto CHk_Pulse
          NOP                 ; Evet RF=1 saymaya devam
          NOP
          incfsz _tmp3,f
          goto    Bir_Olc
          incfsz _tmp4,f
          goto    Bir_Olc
          retlw   0x00
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: arslan74 - 15 Şubat 2006, 21:25:10
Ben Perfect Elektroik'e bahs ettiğin "6012 decoder" programı yazdım. Gayette düzgün çalışıyor. Bir tane 12f675 veya 12f629 chipi ile calışıyor. 4 tane farklı adres öğrenme modu var.

Lazım olursa sana oranın adresini vereyim. Holtek'in sitesinde onun için örnek program var yanlız Holtek'in MCU için yazılmış. Kendin yapmak istersen o örnekleri izle.

Selamlar,
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: sertac2003 - 15 Şubat 2006, 21:33:40
(http://i5.photobucket.com/albums/y197/sertac2003/picproje/baudd.jpg)

görüldüğü gibi sadece B noktasında kontrol yapılarak bilginin high yada low olduğu rahatlıkla anlaşılabilir... önce pilot sinyal alınır. alındığı anlaşıldığıktan sonra B noktasına kadar 500 us gecikme uyguladık..  sonraki tüm adres bilgileri için 1000 us gck uygulamak gerekli...


pilot sinyali aldıktan sonra şöyle bir algoritma kullanabilirsin...



movlw 0x08
movwf temp        ; ilk 8 datayı almak için.
;-------------
movlw 0x00
movwf adres_ilk_8
movwf adres_9_10_ve_11
call 500us         ; bu, pilottan sonraki ilk B ye gelmek için...
AL_ORTAK:
; şu anda kırmızı B noktasındayız...
btfsc giris
bcf status,c          ; B noktasındayken giriş 1, o halde
             ; bit low olarak değerlendirildi
btfss giris
bsf status,c          ; B noktasındayken giriş 0, o halde
              ; bit high olarak değerlendirildi
rrf adres_ilk_8
call 1000us          ; bu sonraki B noktasına gelmek için.
decfsz temp,f
goto AL_ORTAK
movf adres_ilk_8,w
movwf yedek
;burada iken adresin ilk 8 bitini aldık şimdi sonrakilerdeyiz.
;--------------------------
movlw 0x03          ; 8 datayı daha önce almıtık. şimdi
movwf temp          ; şimdi 3 adet daha ve toplam 11 olacak

AL_ORTAK2:
; şu anda kırmızı B noktasındayız...
btfsc giris
bcf status,c        ; B noktasındayken giriş 1, o halde
            ; bit low olarak değerlendirildi
btfss giris
bsf status,c         ; B noktasındayken giriş 0, o halde
            ; bit high olarak değerlendirildi
rrf adres_9_10_ve_11
call 1000us        ; bu sonraki B noktasına gelmek için.
decfsz temp,f
goto AL_ORTAK2
movf adres_9_10_ve_11,w
movwf yedek2
;ve artık "yedek" ve "yedek2" isimli değişkenlerde
;bilgiler mevcut istenildiği gibi kullanılır.
;proteus ile güzel bir simulasyon verimliliği arttıracaktır.
       vericiyi simule edecek bir kod yazarsın olur biter.
       bu arada High ile Z boş un patern ini aynı çizmişsin.


Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 15 Şubat 2006, 23:51:48
Sertac,
Cevabın için teşekkür ederim. Haklısın Z konumunu yanlış açıklamışım. Düzelttim şimdi.
Verdiğin koda baktım. Yalnızca low ve High konumunu bulmak açısından mantıklı görülüyor. Ancak Z konumu için geçerli değil. Bu kısmıda içeren birşeyler düşünebilirmisin.?
ETE
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: sertac2003 - 16 Şubat 2006, 00:28:29
şu an baktım...

yine kısa bir kod olacak yanlız çok enteresan, garip bir kod olacak. onu söyliyim...
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: sertac2003 - 16 Şubat 2006, 02:02:44
(http://i5.photobucket.com/albums/y197/sertac2003/picproje/baud3.gif)


  movlw   0x08
  movwf   temp        ; ilk 8 datayı almak için.
  ;-------------
  movlw   0x00
  movwf   adres_ilk_4
  movwf   adres_5_8_arasi
  movwf   adres_9_11_arasi
  call   gck500us         ; bu, pilottan sonraki ilk A ya gelmek için...  
movlw 0x01 ; ilk 4 adresin tespiti için bu sayı kullanılacak
movwf adres_temp
AL_ORTAK:  
  ; şu anda kırmızı B noktasındayız...
  btfsc   giris
  bcf   status,c          ; B noktasındayken giriş 1, o halde
                      ; bit low olarak değerlendirildi
  btfss   giris
  bsf   status,c          ; B noktasındayken giriş 0, o halde
                       ; bit high olarak değerlendirildi
  ;rrf   adres_ilk_4  bu satır burada derlenmeyecek
  ; bunu başka bir yerde yapıcaz
  movf adres_temp,w
;------------------------
  addwf pcl,f ; bunun altına retlw den başka şeylerde atabiliriz...
  nop
  goto  adr_ilk_4 ;adres_temp == 1 ise buradayiz
  goto   adr_5_8_arasi  ;adres_temp == 2 ise buradayiz
  goto   adr_9_11_arasi ;adres_temp == 3 ise buradayiz
  goto  tum_adresler_alindi
;------------------------
adr_ilk_4:
rrf   adres_ilk_4
  goto devam
adr_5_8_arasi:
rrf   adres_5_8_arasi
goto devam
adr_9_11_arasi:
  rrf   adres_9_11_arasi
nop
nop ; bu iki "nop" goto devam a eşdeğer olması için...
;------------------------
devam:
  call   gck2000us             ; bu sonraki B noktasına gelmek için.
  decfsz   temp,f
  goto   AL_ORTAK
  ;buraya (movf adres_temp,w)her geldiğimizde 4 bit alınmış oluyor
  ;( aslında 8, ama çiftli olduğundan 4 )
  ;buraya ilk geldiğimizde adresin ilk 4 bitini almış oluruz.
  ;ikinci gelişimizde 5 ve 8 arasını, 3ncüde 9-11 arasını...
  movf  adres_temp,w
;------------------------
  addwf pcl,f ; bunun altına retlw den başka şeylerde atabiliriz...
  nop
  goto  adr_ilk_4_kayit ;adres_temp == 1 ise buradayiz
  goto   adr_5_8_kayit  ;adres_temp == 2 ise buradayiz
  goto   adr_9_11_kayit ;adres_temp == 3 ise buradayiz
  goto  tum_adresler_alindi
;------------------------
adr_ilk_4_kayit:
movf   adres_ilk_4,w
  movwf   yedek1 ; ilk 4 bit
movlw 0x08
movwf temp
incf adres_temp,f ; adres_temp == 2 oldu.
goto AL_ORTAK ; şimdi 5-8 adresleri elde etmek için yine başlıyoruz
adr_5_8_kayit:  
movf   adres_5_8_arasi,w
  movwf   yedek2 ; 5-8 arası bitler
movlw 0x06   ; 9,10,11 nci bitler yani 3 bit.
      ; diğerlerinden farklı. bu yüzden
      ;3 bit için 6 döngü gerek.
movwf temp
incf adres_temp,f ;adres_temp == 3 oldu.
goto AL_ORTAK şimdi 9-11 adresleri elde etmek için yine başlıyoruz
adr_9_11_kayit:
movf   adres_9_11_arasi,w
  movwf   yedek3
       ; ve artık işlem tamamdır. tüm adresler elimizde...
;--------------------------------------------------------------
tum_adresler_alindi:
; adresler alındıktan sonra artık buradasın istediğin gibi at koşturabilirsin...
;--------------------------------------------------------------


grafikte görüldüğü gibi bitlerin cinsini tespit etmek  için en uygun yerler A ve B noktaları...

   her kare arası 333us dir.  00 == HIGH , 11 == low  ve 01 == z(boş) anlamındadır. bu yüzden örneğin yedek1 isimli değişkende b'01110011' şeklinde elde edilen bir   patern ZLHL( z, low, High, Low )dur. bu yüzden yedek1 == 4 bit, yedek2 == 4 bit, yedek3 te de 3 bit elde edilir...

 tüm adresler alındığında yedek1,yedek2,yedek3 isimli değişkenlerde
 11 adet adres bilgisi elde edilmiş olur.
 addwf pcl ve goto gibi işlemlerden dolayı her döngü tekrarında ( 4mhz için) 10-15 us bu işleme gidiyo. bu yüzden call gck2000 us sırasında
tam olarak 2000 us değilde 1950 us gibi bir gecikme kullanırsan daha iyi olur. çünkü adresin son bitlerine doğru tam 2000 us kullanılması durumunda artık orta noktalar kaymaya başlar bu değeri en iyi proteusta simule sırasında tespit edebilirsin...

 simuleden önce HT6012 çıkışını taklit eden basit bir kodu f84 gibi bir şeye   yazarak ondan sonra simule edersen zaten herşey ortaya çıkacaktır. sonucu bekliyoruz.
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 16 Şubat 2006, 11:53:27
Sertac,

Açıkladığın mantığı anladım. Ancak yazdığın örnek bana çok karışık geldi. Assembly bilgim o seviyede değil. Örneğin PCL kullanmasını bilmiyorum. Mantığını anlamadığım için bilmiyorum. Malum ben Basic konusunda bayağı ustayım. Assembly biraz biliyorum ama ileri seviyede değil. Yani assembly mantığı tamamen farklı bir şey. Henüz ASM düşünerek düşündüklerimi programa dökemiyorum. Zaman zaman ASM kullanıyorum Kendi programlarımın içinde. Bu yüzden bazı sorularım olacak;
Her şeyden önce senin örnek kodunda bir açıklama hatası var gibi geldi bana onu bir teyid edermisin;
AL_ORTAK:  etiketinin altına ;şu anda kırmızı B noktasındayız demişsin. Halbuki orası Kırmızı A noktası olması gerek. Hemen altındaki komutlarda yine B noktasındayken giriş 1 vs. açıklamalarında A noktası için olmalı.

İkincisi btfss giriş komutunun altında Status,c bitini neden set veya clear yapıyorsun bu kısmı anlamadım. Adres bitinin değerini 1 veya 0 yapmak için status , c biti nasıl kullanılıyor?. Sorularımı bağışla ama gerçekten anlamıyorum.
Aslında senin mantığından yola çıkarak okuma işlemini 3 parçaya ayırsak;
1. İlk 4 adresi (0-3) Kod_1 değişkenine ikili-bit mantığına göre koysak;
yani A noktasınd A0 biti için okuma yapsak ve Kod-1,0=okunan bit,
B noktasnda okuma yapsak ve Kod-1,1=okunan bit desek aynı işlemi ilk dört adres biti için tekrarlasak.
2. Aynı işi be sefer ikinci 4 lü adres gurubu (4-7) için yapsak ve
3. Aynı işi bu sefer 8-12 adres (10 adres+2 data toplam 12 şifre biti alınacak) ve sonuçta bu işi öyle çözsek diyorum.
Anladığım kadarı ile zaten verdiğin örnek kod bunu yapacak ham bir program ama beni aşıyor. Gerekirse ben anladığım şekilde bunu yapacağım.
Sana zahmet olmaz ise bu kısmı yazda ver diyeceğim ama zahmet olacağını biliyorum o yüzden bunu demiyorum.
Yinede verdiğin akıliçin teşekkürler.
Ete
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: sertac2003 - 16 Şubat 2006, 16:03:13
açıklamalardaki B noktası evet A noktası olacak. orası değiştirmeden vermişim çünkü eski örnek üzerinde edit yaparak uyguladım. orası kalmış.

sorularına gelince, verdiğim kod, senin 3 sorunda yazdıklarının cevabını birebir karşılıyo. yani 0-3 adresler yedek1'de( yedek1 içindeki 2 adet bit, 1 adet adres bitine eşittir ve bitler 00 ise high, 11 ise low, 01 ise Z anlamındadır bu yüzdende yedek1 içindeki 01011100 gibi bir bilgi : ZZLH yani sırasıyla
Z, Z , Low, High anlamındadır ) 4-7 yedek2'de ve 8-10 nolu adresler yedek3 isimli değişlende saklanıyo.

kodun ana mantığı asenkron seri iletişimin mantığına çok benziyo.
örneğin şuraya bak :


movlw 0x08
movwf temp
tekrarlandir:
btfsc seri_giris
bsf status,c
btfss seri_giris
bcf status,c
;------------------
rrf register,f
call baud_suresi
decfsz temp,f
goto tekrarlandir


burada seri iletişimde her bitin tam ortasında iken btfsc ile seri_giris kontrol edilir ve giris 1 ise carry biti 1 yapılır, 0 ise carry biti de 0 yapılır böylece "rrf register,f" dediğimizde register değişkeninin en sağ bitine carry biti taşınır. zaten carry bitinin 1 yada 0 olmasını biz seri_giris isimli giristen aldığımız bilgi ile doldurmuştuk. yani "rrf register,f" biz seri_giris isimli giristen aldığımız 1 yada 0 herneyse onu register isimli değişkenin en sağına attık. bunu 8 defa ardarda yapınca ilk okunan bir en sağa geçer ve son okunan bit en solda kalır çünkü rrf ile sağa kaydırıyoruz. bu kodun tamamını basicteki serin komutuna benzer bişiymiş gibi düşün. pcl ler ise seri giris rutinini 3 kez altalta yazmaktan kurtulmak için. eğer ilk verdiğimdeki gibi pcl siz bir kod kullanılmış olsaydı ilk kodun yaklaşık 2-3 katı fazladan program hafızası harcayacaktık. biraz karışıkta olsa olabilecek en kısa kod budur.


kodun tamamını yazardım. hatta sana HT6012 entegresini simule eden bir koduda yazayım yani hex kodunu proteusta  16f84 un içine atınca HT6012 gibi davranacak. sonra başka bir pic ile de sözkonusu decoder kodu simule edilecek. daha öncede buna benzer bişi yapmıştım 145026 ve 145027 entegrelerinin yapığı işi yapan kodları F84 e gönderdim, iş yapıyo.

garip bir gerçek ama bugun bilgisayar ve eşyaları memlekete gönderiyorum. yani istanbuldan ayrılıyorum.

orhan altınbaşak ın picbasic pro isimli kitabı sende varsa orada asenkron seri iletişimi çok iyi anlatıyo. yada netten biraz bakınca zaten birçok örnek çıkar karşına.

bu msj ı yazdıktan yarım saat sonra artık bilgisayar kutulanmış olacak. aslında asenkton seri iletişimin mantığını kavrarsan kendinde çok rahat çözersin bu işi. yada şöyle yapabilirsin 0-3 adresler için bir döngü, 4-7 için hemen altına 2nci bir döngü, ve son grup için yine bir döngü. bu şekildede yapabilirsin. bu şekilde çok 2-3 katına çıkacak ama pcl ye gerek kalmayacak. eğer aciliyeti yoksa memlekete gidince pilot sinyal vs tüm kodu asm ile yazarım hiç sorun değil.

bu arada hoşçakal istanbul :)
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 17 Şubat 2006, 15:12:40
Sertac,
Sonunda yazdığın örnek kodun mantığını anladım. Cahillik bende. Bir türlü carry bitinin orada ne işe yaradığını çözememiştim. Hep kendimi aritmetik işlemlerinde kullanılan bir şey orada ne işe yarıyor diyor idim. Meğerse düşünce çok akıllıca. Akümülatörde (W) tutulan sayının carry bitini set edersem bir nevi 8. bit 1 yapılmış oluyor ve sağa kaydırınca carry biti 7. bitin yerine yerleşiyor. Kaydırma devam ettikçe sonuda sayıyı bu mantıkla oluşturuyoruz. Gerçekten akıllıca. Şimdi bu mantık üzerinden yazmaya başlıyorum.bakalım ne olacak.

Tekrar teşekkürler.
Ete
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 22 Şubat 2006, 17:16:01
Arkadaşlar,

Sertac arkadaşın vermiş olduğu mantık üzerinden bir program yazdım. Ancak bir türlü çalıştıramadım. Sebebide programın WDT üzerinden sürekli reset atması. Aralara clrwdt yerleştirmeme rağmen sanırım doğru yeri bulamadığımdan reset olayı devam ediyor. Okumam gereken 12 adet adres biti var. Aralara return koyarak bazılarını okuyorum ve bakıyorum doğru. Sanırım program çalışacak ama reset yüzünden çalışamıyor. Öncelikle reset'i önlemenin bir yolu var ise sizden akıl istiyorum verirseniz memnun olacağım.
Bu sorunu yaşayınca taktik değiştirdim. Zira yaptığım tespitte reset olayının addwf  pcl,f    komutunda meydana geldiğini gördüm. Bende programı döngü şeklinde değil sıralı mantık ile yeniden yazdım ve sonunda çalıştırdım. Çalıştırdım derken kendi başına program çalışıyor ve kodları tespit edebiliyor. Ancak bu program parçasını bir başka program içinde kullanmam gerek ve onu yerine yerleştirince yeniden reset olayı ile karşılaştım. Anlayacağınız bir türlü şu WDT resetinden kurtulamıyorum.
Yazdığım programlar PBP ve ASM karışık olarak çalışıyor. PBP dan WDT iptal ediyorum banamısın demiyor. çünki yine reset ASM kısmında gerçekleşiyor. Hala araştırıyorum. Belki içinizde konu hakkında bilgisi olan vardır vede çözümü biliyordur. Bir akıl verirde beni bu dertten kurtarır.
İnceleyebilesiniz diye yazdığım programları bir paket halinde aşağıdaki linke koydum. Bu arada isis de Holtek'i simule eden bir program yazdım Ana programı onunla simule edebiliyorum. Zaten sizde göreceksiniz.

ETE

Not: Yine hemen paylaş bakımda,bu adamlarında bakımlarından bıktım. Bu yüzden yine rapid'e yükledim.

http://rapidshare.de/files/13869918/HTKOD.rar.html
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: micro_chip - 22 Şubat 2006, 17:48:16
Alıntı yapılan: eteArkadaşlar,Anlayacağınız bir türlü şu WDT resetinden kurtulamıyorum.
Senin protona geçme vaktin gelmiş. Elini bile sürmedin değilmi itiraf et!

Biz micro_chip olarak protonu öneriyoruz.
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 22 Şubat 2006, 17:53:58
Protonda ne fark edecek kş. Sorun PBP da değil zaten
ETE
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: micro_chip - 22 Şubat 2006, 17:58:27
ben konunun detayınnı incelemedim o kıusmına birşey diyemem.

Ancak wdt off yaptığımda  asm kod içindeki clrwdtlerin  komple silindiğini ve kodun acayip kısaldığını görmüştüm.

FArkeder kanaatindeyim tavsiye ederim. proton asm ile karışık kullanılabiliyor asm , endasm filan ggerekemz ayrıca labeller vs ortak olabiliyor.....
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 22 Şubat 2006, 18:05:34
Peki bir deneyeyim bakalım
Zira Basic kısmı zaten bir iki satır. Kalanı tamamı ASM programın.
Sırf ekran işi ile uğraşmayayım diye böyle yaptım zaten.
ETE
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: micro_chip - 22 Şubat 2006, 18:17:22
WATCHDOG = off derken sigortaları   da wdt off olacak şekilde ayarlayı unutmamak gerekir.
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: aster - 22 Şubat 2006, 20:04:52
Ben değil sen girince form kendiliğinden seni tanıyor zaten merak etme

Sevgili ETE,
bize PBP yu öğrettin sağolasın fakat gel şu C ye geç artıkın  ;)
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: graphpix - 19 Temmuz 2008, 12:00:58
@ETE, ht6012 entegresinin decoder entegresi nedir acaba? elimde ht6012 kullanan standart bir garaj kapısı kumandası var scorpion marka. dip switch ile kodu ayarlanıyor. buna basit bir alıcı devresi yapmak istiyorum ama bir türlü uygun devre şeması bulamadım. gördüğüm kadarıyla pt2262 ile aynı pin çıkışlarına sahip ht6012, bu durumda pt2272 ile çözebilirmiyiz?

Elinizde ht6012 kumandalarla ilgili şema varsa paylaşıranız sevinirim.
Başlık: HOLTEK firması encoder ların Pic ile okunması
Gönderen: ete - 19 Temmuz 2008, 18:59:13
HT6012 nin decoderi HT6032 dir.

Elimde şema falan yok maalesef.

Ete