HOLTEK firması encoder ların Pic ile okunması

Başlatan ete, 15 Şubat 2006, 15:30:55

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

arslan74

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,

sertac2003



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.
Şirketteki herkes en üst yöneticinin müşterisidir.

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

sertac2003

şu an baktım...

yine kısa bir kod olacak yanlız çok enteresan, garip bir kod olacak. onu söyliyim...
Şirketteki herkes en üst yöneticinin müşterisidir.

sertac2003



  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.
Şirketteki herkes en üst yöneticinin müşterisidir.

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

sertac2003

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 :)
Şirketteki herkes en üst yöneticinin müşterisidir.

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

micro_chip

Alıntı yapılan: "ete"Arkadaş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.

ete

Protonda ne fark edecek kş. Sorun PBP da değil zaten
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

micro_chip

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.....

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

micro_chip

WATCHDOG = off derken sigortaları   da wdt off olacak şekilde ayarlayı unutmamak gerekir.