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
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,
(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.
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
şu an baktım...
yine kısa bir kod olacak yanlız çok enteresan, garip bir kod olacak. onu söyliyim...
(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.
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
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 :)
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
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
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.
Protonda ne fark edecek kş. Sorun PBP da değil zaten
ETE
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.....
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
WATCHDOG = off derken sigortaları da wdt off olacak şekilde ayarlayı unutmamak gerekir.
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 ;)
@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.
HT6012 nin decoderi HT6032 dir.
Elimde şema falan yok maalesef.
Ete