Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: POWER - 23 Ağustos 2004, 10:59:29

Başlık: Assembly Yardım
Gönderen: POWER - 23 Ağustos 2004, 10:59:29
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
Başlık: Çiftli Tasarım...
Gönderen: DumrulBey - 24 Ağustos 2004, 01:30:54
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...
Başlık: GECİKMELİ ON-OFF
Gönderen: POWER - 26 Ağustos 2004, 10:21:17
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 :(