UYGULAMA: Gecikmeli Aç/Kapa

Başlatan DumrulBey, 06 Eylül 2004, 13:03:15

DumrulBey

Merhaba,

Bugün, ne zamandır yapmayı düşündüğüm bir uygulamaya başlıyoruz. Aslında uygulama yeni üyelerimizden POWER için. Arkadaşımıza assembly öğrenmesinde yardımcı olacağız. Ama bir yandan hiç olmazsa kendi eksiklerimizi görüp belki hepimizin faydalanacağız bir etkinlik olur.

Bundan önce bir kaç başlıkta tartıştığımız uygulamayı beraberce geliştirmeye çalışacağız. Benim takıldığım noktalarda yardımlarınızı beklerim. Aslında Basic veya C ile bu uygulamayı yapmak çocuk oyuncağı. Hatta Erol (ete), tam da arkadaşımız istediği programı yazdı. Fakat madem maksat öğrenmek o zaman Assembly ile PIC porgramlamada bir çok konuyu işleyerek program geliştirmek isabetli olacak.

Konu bütünlüğü açısından bu mesajı önceki başlıktan alıntılar alarak bitiriyorum:
https://www.picproje.org/index.php/topic,4031
Alıntı yapılan: "POWER"Arkadaşlar aşağıdaki proğramla PORTA 1 butonuna basılınca PORTB 7 deki ledi yakmak,PORTA 2 butonuna basılınca PORTB 7 deki ledi gecikmeli söndürmek.Daha sonrada PORTA 4 butonuna basılınca PORTB 6 daki ledi gecikmeli yakmak,tekrar PORTA 4 butonuna basılınca PORTB 6 daki ledi gecikmeli söndürmek.Salih arkadaşımızın verdiği rogramda bilgim dahilinde birtakım değişiklikler yaparak yapmaya çalıştım ama bir türlü beceremedim yardımcı olabilirmisiniz?
Alıntı yapılan: "DumrulBey"Anladığım kadarıyla bu işi öğrenmek için yapıyorsun. Zamanlayıcı kesmesi kullanarak yapalım mı? Ne dersin buna? Programı baştan itibaren yazıp yeniden geliştirelim. Ama senin de katkın olacak haa! Takıldığımız noktlarda da diğer arkadaşlar yardımcı olabilir. Yani tam bir etkileşimli program yazacağız. Yani öyle hazıra konma, ısmarlama türü olmayacak. Dene ve göre, yap işlet, her ne adla anılırsa anılsın böyle bir şey işte...
Alıntı yapılan: "POWER"Evet bu denemeleri asm yi öğrenmek için yapıyorum.Hocam yazacağımız proğram hakkında ipuçları verin ben kitaptan araştırıp birşeyler yapmaya çalışırım takıldığım yerlerde arkadaşların ğörüşlerini alırım.Bu konuda aklıma takılan o kadar soru varki hangisini soracağımı bimiyorum.Zamanla bu sorular cevabını bulacak herhalde.İpuçlarınızı bekliyorum.
Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

DumrulBey

Başlıyoruz...

Madem bir çok konuya değineceğiz, o zaman kesmeler (interrupts) ile başlamak ve böyle devam etmek iyi olabilir. Kesmeler önemli bir konu olsa gerek. Fakat bir kitap gibi tüm kesmeleri işlemekten çok uygulama için gerekli olan konuları işlemeye başlayacağım. Sonra gerekirse kitaptan veya gelen soru üzerine eksiklikleri tamamlarız.

Önce programların başlangıç (ORG: origin) noktaları...
ORG 0x00 
		GOTO AYARLA 

		ORG 0x04 
		GOTO ZAMANLAYICI

Tüm assembly dillerinde bu ORG komutu ortaktır. Genelde program bununla başlar ve PIC için kullanılması çok şart değildir. Ama kesme kullanacağımız zaman PIC için birincili kesme adresi olan hex4 (0x04) adresi belirtmemiz gerekir. Altındaki dallanma komutunu açıklamaya gerek yok sanırım. İleride yönlendirilen bu etiketlerin (label) altına kodlar yazacağız.
CBLOCK 0x0C 
	xBEKLE1, xBEKLE2 
	xGecikme, xSaniye 
	_w, _status
ENDC

Unutmadan hemen değineyim ORG komutları önce değişkenleri tanımlamak gereklidir. EQU ile tek tek uğraşmaktansa editör komutlarında olan CBLOCK bizim imdadımıza yetişiyor. Başlangıç adresini verip değişkenleri sıraladıkmı, kendisi gerekli adreslere sırasıyla eşitliyor. Dolayısıyla işimiz de kolaylaşıyor. Aslında bunun gibi daha bir çok derleyici komutu var ama şimdilik bununla başlayalım. Belki ileride MACRO komutunu da işleriz...

Program galiba yavaş yavaş şekillenmeye başlıyor. Başta bir kaç ayar (Fuses) daha olsa da şimdilik kafa karıştırmayalım. Bundan sonra program AYARLA etiketine dallanacak ve kesme ile geçit ayarlarını yapacağız. Ama önce gecikme (delay) alt programları ile zamanlayıcı (timer) alt programlarını bir karşılaştıralım derim. Bu sayede aradaki farkı anlarsak ayar bölümünde yapacaklarımızı daha iyi görürüz.
ZAMANLAYICI
	MOVWF	_w	; Working yazmaçının yedeğini al ve 
	SWAPF	_w, F	; Tersle
	SWAPF	STATUS, W ; STATUS yazmaçını tersle ve
	MOVWF	_status	; Yedeğini al
	...
	SWAPF   _status, W ; STATUS yazmaçının
	MOVWF   STATUS	; İçeriğini geri yükle
	SWAPF   _w, W	; Working yazmaçının içeriğini geri yükle
RETFIE		; Kaldığı yerden devam et...

Basit gecikme alt programını burada yer vermiyorum. Çünkü adı üstünde basit ve o kadar da hassas değil. Topu topu bir veya daha fazla döngüden oluşan sayaçlardan (counters) ibaret. Yaptığı mikrodenetleyiciyi boşuna çalıştırmak. Ama yukarıdaki kesme alt programı kurulan zamanlayıcı ile birlikte gerektiği zaman çalışır. Üstelik program kaldığı yerden devam eder. Aynı CALL ile çağrılan alt programın RETURN ile geri dönmesi gibidir. Buradaki RETURN komutu yerine RETFIE kullanılıyor hepsi o kadar.

Ancak şu halde program içinden GOTO ile ZAMANLAYICI alt programına dallanmadığı müddetçe yukarıda son yazdığım komutlar çalışmaz. Programın kesilmesi gerektiği anda ki bu kurulan bir zamanlayıcı ile olabildiği gibi başka donanım ve yazılım kesmeleridir, o zaman bu kodlar çalışıyor. Peki yukarıda yazılanlar nedir?

İlk bakışta karışık gelebilir ama tek yaptığı sıklıkla kullandığımız STATUS ve WORKING yazmaçlarının yedeğini almak. Gerçi yandaki tanımlardan bunu anlıyoruz. Aslında Intel mimarisinde yazılan assembly programlarında, PUT ve GET komutları bu işi bizim yerimize yapmaktadır. Bildiğim kadarıyla PIC 18F ailesinde bu komutları koymuşlar. Peki neden yedeğini almak gerekiyor?

Cevap çok basit. Program kesildiği anda yedeği alınan yazmaçları kullanıyor olabilir! Bu durumda alt programda değişikliğe uğrayacak yazmaçlar bizim programımızın kararlı çalışmasını etkileyecektir. Ama çok karışık olmayan ve yedeği alınan yazmaçların kullanılmadığı programlarda bu yedek alma işlemine pek gerek duyulmaz. Yani olsa da olur, olmasa da.

Gelelim diğer gecikme alt programları ile arasındaki farka! Eğer bildiğimiz saat gibi ayarlanabilir özelliği bulunan zamanlayıcıyı (örneğin TIMER0) kurduğumuzda, programın çalışması aksamadan arkada tarafta sayar. Gerektiği zaman ise kesme oluşturup alt programa dallanır. Yani önceki yazdığımız programlardaki BEKLE alt programında yer alan bir değişken (xBEKLE1, xBEKLE2...) tek tek azaltılıyordu. O anda program başka komutu icra etmezken kesmeler ile başka komutların icrası gerektiğinde kesilir. İşte hepsi bu kadar...

Bundan sonra biraz daha adım adım gideceğim. Her mesajda sadece programın bir kısmını işleyeceğim. O yüzden bu kadar uzun olmayacak. Kesme konusu ise daha irdelenmeli. Yani hemen geçmeyeceğiz. Çünkü daha ayarlama ve denetleme kısmı ile yukarıdaki üç nokta (...) ile ifade edilen kısımlar yazacaklarımız var. Sonra düğmelerin basit bir denetimini yapıp 3 saniyelik gecikmeyi de zamanlayıcıya yüklemeyi düşünüyorum. İnşaallah programı alnımızın akıyla tamamlarız. Takıldığım noktalarda ise diğer arkadaşların desteğini beklemekteyim. Şimdilik benden bu kadar...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

POWER

Hocam iyi çalışmalar,
Başlığı yakından takip ediyorum.Kitaptaki kesmeler konusunu 3 kez okudum.Teori olarak bir şeyler anladım ama kafamda işin mantığı oluşmadı.Kitapta bir uygulama devrsi var.Konunun en sonunda.Yani konuyu tam anlamam lazımki o uygulama prağramından bir şeyler anlayayım.Birde bizim üzerinde çalıştığımız proğramdaki butonlara bu kesmeler konusunu nasıl uygulayacağız?Bunu bilemediğim için fazla bir katkıda bulunamıyorum.Yorumlarınızı bekliyorum.Tabiki tüm arkadaşlardanda.KOLAY GELSİN.
TB6BKG