Assembly Yardım

Başlatan POWER, 23 Ağustos 2004, 10:59:29

POWER

Değerli Arkadaşlar,aşağıdaki programcıkla porta nın 1. bitine bağlı butona basıldığında gecikmeli olarak portb nin 7. bitindeki ledi yakan bir proğram.Benim yapmaya çalıştığımsa aynı proğramı porta nın 2.bitine bağlı butona basılınca portb nin 6.bitindeki ledi gecikmeli olarak yakmak.Hem porta nın 1.bitine bağlı butona basınca portb nin 7 bitindeki led gecikmeli yanacak hemde porta nın 2.bitine bağlı butona basılınca gecikmeli olarak portb nin 6. bitindeki ledi yanacak.Birtürlü bu işin mantığını kuramadım.Yardımcı olursanız sevinirim.Şimdiden teşekkürler.KOLAY GELSİN. Programcık aşağıda;




; Hazırlayan Salih Dinçer (t) 29.7.2004

; AYARLAR
	LIST    p=16F84A 
	#include "P16F84A.INC"
	RADIX HEX 
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_RC_OSC 

xBEKLE1	EQU	0x0C
xBEKLE2	EQU	0x0D
	ORG	0x00

BSF	STATUS, RP0		
MOVLW	b'00000001'		
MOVWF	PORTB			
BCF	STATUS, RP0		
BCF	PORTB, 7		
MOVLW	.200			

; ANA PROGRAM
BASLA	; ANA DÖNGÜ
YAN	BTFSC	PORTA, 1		
	GOTO	YAN		
	CALL	BEKLE		
	BSF	PORTB, 7		
	CALL	DEVAM		
SON	BTFSC	PORTA, 1		
	GOTO	SON		
	CALL	BEKLE		
	BCF	PORTB, 7		
	CALL	DEVAM
GOTO	BASLA

; ALT PROGRAMLAR
DEVAM	BTFSS	PORTA, 1		
	GOTO	DEVAM		
	RETURN			

BEKLE	; BEKLEME
	MOVWF	xBEKLE1		
BEKLE1	MOVLW	.255		
	MOVWF	xBEKLE2		
BEKLE2	DECFSZ	xBEKLE2, F	
	GOTO	BEKLE2		
	DECFSZ	xBEKLE1, F	
	GOTO	BEKLE1		 
	RETURN			

END
TB6BKG

DumrulBey

Merhaba,

Gönderdiğin özel mesaj sırasında yardımcı olamadığım için kusura bakma. İstediğin çok basit bir şeymiş. Gerçi şu zamanlama olayını hala anlayamadım ama netleştirirsen yardımcı oluruz. Yani basıldıktan sonramı yoksa basıldığı müddetçemi işlem yapacak...

Yapmak istediğin şeye gelince. Aslında ana programın bir başka kopyasını, iki kopya ve alt program olacak şekilde düzenleyeceksin. Sonra iki alt programa sırayla bakacak bir ana program yazacaksın. Yalnız burada işlerin karışmaması için lambaların yanıp yanmadığını bakmak lazım.

; AYARLAR
	LIST    p=16F84A 
	#include "P16F84A.INC"
	RADIX HEX 
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_RC_OSC 

xBEKLE1	EQU	0x0C
xBEKLE2	EQU	0x0D
	ORG	0x00

BSF	STATUS, RP0		; Ayar bölgesine geç
MOVLW	b'00000110'		; PORTB'yi devre göre
MOVWF	TRISA
CLRF	TRISB			; Ayarla...
BCF	STATUS, RP0		; Geçit bölgesine geç
BCF	PORTB, 7			; PORTB'deki LED'i kapa
MOVLW	.200			; Gecikme değeri

; ANA PROGRAM
	BASLA	; ANA DÖNGÜ
	CALL	YAN7
	CALL	YAN6
GOTO	BASLA

; ALT PROGRAMLAR
YAN6
	BTFSS	PORTB, 6		; Lamba yandı mı?
	GOTO	$+2		; Hayırsa iki satır atla...
	GOTO	SON6		; Evetse SON alt programına git
	BTFSC	PORTA, 2		; Düğmeye basıldı mı?
	RETURN			; Hayırsa ana programdan devam et...
	CALL	BEKLE		; Bir süre bekle,
	BSF	PORTB, 6		; Evetse PORTB'deki LED'i aç.
	CALL	DEVAM		; Düğme bırakıldıysa devam et...
SON6	BTFSC	PORTA, 2		; Düğmeye bırakıldıktan sonra basıldı mı?
	RETURN			; Hayırsa ana programdan devam et...
	CALL	BEKLE		; Bir süre bekle,
	BCF	PORTB, 6		; Evetse PORTB'deki LED'i kapa
	CALL	DEVAM
YAN7
	BTFSS	PORTB, 7		; Lamba yandı mı?
	GOTO	$+2		; Hayırsa iki satır atla...
	GOTO	SON7		; Evetse SON alt programına git
	BTFSC	PORTA, 1		; Düğmeye basıldı mı?
	RETURN			; Hayırsa ana programdan devam et...
	CALL	BEKLE		; Bir süre bekle,
	BSF	PORTB, 7		; Evetse PORTB'deki LED'i aç.
	CALL	DEVAM		; Düğme bırakıldıysa devam et...
SON7	BTFSC	PORTA, 1		; Düğmeye bırakıldıktan sonra basıldı mı?
	RETURN			; Hayırsa ana programdan devam et...
	CALL	BEKLE		; Bir süre bekle,
	BCF	PORTB, 7		; Evetse PORTB'deki LED'i kapa
DEVAM	BTFSS	PORTB, 0		; Düğme bırakıldı mı?
	GOTO	DEVAM		; Hayırsa üst satırdan devam et...
	GOTO	BASLA		; Evetse ana programdan devam et...

BEKLE	; BEKLEME
	MOVWF	xBEKLE1		; Hafızadaki değeri yükle...
BEKLE1	MOVLW	.255		; İkinci çarpanı
	MOVWF	xBEKLE2		; Yükle...
BEKLE2	DECFSZ	xBEKLE2, F	; Bir azalt, çarpan  sıfırlandı mı?
	GOTO	BEKLE2		; Değilse üst satırdan devam et...
	DECFSZ	xBEKLE1, F	; Bir azalt, çarpılan sıfırlandı mı?
	GOTO	BEKLE1		; Değilse üst satırdan devam et... 
	RETURN			; Bitince geri dön

END	; Programı sonlandır...

Yukarıdaki kodu denedim ve RC osilatör ile gayet iyi çalışıyor. Tabi programda başka işler yapılacaksa, bunları ana döngü içerisine ekleyip arada  denetlemesini sağlamalısın. Tek sorunu gecikme sırasında diğer tuşa basılırsa, yanacak olan lamba yanana kadar tuş devre dışı kalıyor. Tabii ki bir de aynı anda tuşa basmak fayda etmez. Ancak kesme (interrupt) oluşturmak lazım ki sorunlar aşılsın. İşini görür inşaallah.

Dip Not: Kod mesaj içerisinde fazla yer kaplamaması için gecikmenin olduğu son alt programa yer vermedim. Ayrıca başta geçitlerdeki (ports) giriş/çıkış ayarlarını ayar bölgesine (BANK 1) geçtikten sonra düzenlemeyi unutma. Ben unuttum devre flip-flop gibi çalıştı...:)

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

POWER

Dumrulbey Hocam
Evet, dediğiniz gibi düğmeye basıldığı sürece işlem yapacak.Bu programın amacı için önemli.Önceki mesajdada belirtmiştim.Vermiş olduğunuz program üzerinde uzun bir süre çalıştım.Bu işi yeni öğrenmeye çalıştığım için,kafama göre değişiklikler yaparak bir şeyler yapmaya çalıştım.Fakat flip-flop olayını çözemedim.Çok değişik uygulamalar yaparak denedim fakat olmadı.Program normal çalışıyor.Bank1'e geçtikten sonraki olması gereken düzenlemelerde başarılı olamadım.Bu konudada yardımcı olabilirmisiniz? KOLAY GELSİN :(
TB6BKG