Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: mustafaaxu - 19 Mayıs 2009, 12:42:26

Başlık: 16f84 ile ayarlanabilir ileri sayıcı
Gönderen: mustafaaxu - 19 Mayıs 2009, 12:42:26
selamlar:
benim sizlere örnek olarak vermek istediğim ayarlanarak istediğiniz bir sayıdan
yukarıya doğru bir dakikalık zaman aralıkları ile sayan  pic 16f84A ile yapılmış bir devre
Buradaki amac benim gibi yeni başlıyanlara güzel bir örnek olacagını düşünerek paylaşmak istedim
özetle proğram şöyle çalışmakta:
birler-onlar-yüzler-binler önce bu dosyaların içine  4 haneli başlamasını istediğimiz sayıları
port,4 deki butona ile gireriz hane kaydırma port,7 deki buton ile yapılır son olarak binler
hanesinin değeri girildikten sonra yine port,7 butona basılarak bir dakikalık aralıkla sayma başlar.

Buradaki amaç sistemin nasıl çalıştığı görme İsteyen arkadaşlar yazılımı geliştirerek
ileri geri sayıcı yapabilir, istediği bir sayıda sistemden çıkış alabilir veya saat alarak geliştirebilirler.

devrenin şeması çok önemli değil ortak anotlu 4 dijit displeyi sırayla
segment a=portb,0 --b=portb,1--c=portb,2--d=portb,3--e=portb,4--f=portb,5--g=portb,6
segment ve portb arasına 7 adet  150 ohm direnç koyun
butonlar--- buton1 = portb,4  buton2 = portb,7 bağlanacak
hane  birler=porta,0 --onlar=porta,1 --yüzler=porta,2 --binler=porta,3 bağlanacak
buton1 hane arttırma --buton2 hane kaydırma ve start olarak
bu program daha kısa yazılabilir  mesela
farklı birşeyler ekliyebirseniz sevinirim
bu sitede emeği olanlara teşekkürler.  
devrenin asm kodu ve şeması
(http://img198.imageshack.us/img198/7889/upcount.th.jpg) (http://img198.imageshack.us/i/upcount.jpg/)

;   AYARLANABİLİR İLERİ SAYICI

LIST P=16F84
INCLUDE "P16F84A.INC"
__CONFIG  _CP_OFF &_WDT_OFF &_XT_OSC &_PWRTE_OFF

SAYACA EQU H'0A' ;
SAYACB EQU H'0B' ;
SAYAC1 EQU H'0C' ;
SAYAC2 EQU H'0D' ;
SAYAC3 EQU H'0E'
GCKSAY1 EQU H'0F'
GCKSAY2 EQU H'01'         ;
BİRLER                EQU H'11' ;
ONLAR EQU H'12' ;
YÜZLER EQU H'13' ;
BİNLER    EQU H'14'
SAYAC EQU H'15'
TEST EQU H'16'
SAY1 EQU H'17'
SAY2 EQU H'18'
KAY1 EQU H'19'
KAY2 EQU H'1A'
KAY3 EQU H'1B'
STEPP1 EQU H'1C
STEPP2 EQU H'1D
STEPP3 EQU H'1E

;----------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------
START
BSF STATUS, 5 ;BANK 1'E GEÇ
MOVLW B'00010000' ;0 değeri portu çıkış yapar 1 giriş
MOVWF TRISA ;PORT A ra0-ra1-ra2-ra3-ra4 çıkış (00000000) porta hepsi çıkış
      MOVLW B'10000000' ;0 değeri portu çıkış yapar
MOVWF TRISB ;PORT B rb0,1,2,3,4,5,6,7 ÇIKIŞ (00000000) portb hepsi çıkış
BCF STATUS, 5 ;BANK 0'A GEÇ
;----------------------------------------------------------------------------------------------------
CLR ;registerleri temizle
CLRF PORTA
CLRF PORTB
CLRF SAYAC
CLRF SAYACA
CLRF SAYACB
       CLRF BİRLER
CLRF ONLAR
CLRF YÜZLER
CLRF BİNLER

;----------------------------------------------------------------------------------------------------
MOVLW d'40'
MOVWF SAYAC ;ekranda sayılar sayac süresince yanar
;----------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------
DİSBİRLER
CALL DİSYAZ ;displeyde göster
CLRF TRISA
BSF PORTA, 3 ; DISPLAY 3
MOVF BİRLER, W ;w registere birleri yükle
CALL TESTTABLO ;tablodan değer al
MOVWF PORTB ;binleri DİSPLAY 3' BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER
BTFSC PORTA, 4 ;porta,4 0 mı 1 mi
INCF BİRLER,F ;birleri 1 arttır
MOVLW H'0A' ;w ye 10 sayısını yükle
SUBWF BİRLER,W ;birler den 10 cıkar status z değiştimi
BTFSC STATUS,2 ;sonuc 1 ise devam 0 sıfırsa 1 atla
CLRF BİRLER ;sonuç 1 ise birleri temizle
BTFSC PORTB, 7 ;porta,7 0 mı 1 mi
GOTO DİSONLAR
GOTO DİSBİRLER
;----------------------------------------------------------------------------------------------------
DİSONLAR
CALL DİSYAZ ;displeyde göster
CLRF TRISA
BSF PORTA, 2 ; DISPLAY 3
MOVF ONLAR, W ;w registere onları yükle
CALL TESTTABLO ;tablodan değer al
MOVWF PORTB ;onları DİSPLAY 2' BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER
BTFSC PORTA, 4 ;porta,4 0 mı 1 mi
INCF ONLAR,F ;onları 1 arttır
MOVLW H'0A' ;wregistere h'0a'yükle
SUBWF ONLAR,W ;onlar dan 10 cıkar status z değiştimi
BTFSC STATUS,2 ;sonuc1 ise devam 0 sıfırsa 1 atla
CLRF ONLAR ;sonuç 1 ise onları temizle
BTFSC PORTB, 7 ;porta,7 0 mı 1 mi
GOTO DİSYÜZLER
GOTO DİSONLAR
;----------------------------------------------------------------------------------------------------
DİSYÜZLER
CALL DİSYAZ
CLRF TRISA
BSF PORTA, 1
MOVF YÜZLER, W ;w registere yüzleri yükle
CALL TESTTABLO
MOVWF PORTB ;yüzleri DİSPLAY 1' BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER
BTFSC PORTA, 4 ;porta,4 0 mı 1 mi
INCF YÜZLER,F
MOVLW H'0A'
SUBWF YÜZLER,W
BTFSC STATUS,2
CLRF YÜZLER
BTFSC PORTB, 7 ;porta,7 0 mı 1 mi
GOTO DİSBİNLER
GOTO DİSYÜZLER
;----------------------------------------------------------------------------------------------------
DİSBİNLER
CALL DİSYAZ
CLRF TRISA
BSF PORTA, 0
MOVF BİNLER, W ;w registere onları yükle
CALL TESTTABLO
MOVWF PORTB ;BİRLERİ DİSPLAY 0'A BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER
BTFSC PORTA, 4 ;porta,4 0 mı 1 mi
INCF BİNLER,F ;registerdeki onları+1ekle file onlara yaz
MOVLW H'0A' ;wregistere h'0a'yükle
SUBWF BİNLER,W ;binler den 10 cıkar status z değiştimi
BTFSC STATUS,2 ;sonuc1 ise devam 0 sıfırsa 1 atla
CLRF BİNLER ;sonuç 1 ise binleri temizle
BTFSC PORTB, 7 ;porta,7 0 mı 1 mi
GOTO SBİRLER
GOTO DİSBİNLER

;-------------------------------------------------------------------------------------------------
SAY
;----------------------------------------------------------------------------------------------------
SBİRLER
CALL DAKİKA
MOVF BİRLER,W

CALL DİSYAZ
INCF BİRLER,F

MOVLW H'0A'
SUBWF BİRLER,W ;birler den 10 cıkar status z değiştir
BTFSC STATUS,2 ;sonuc1 ise devam 0 sıfırsa 1 atla
GOTO SONLAR
GOTO SBİRLER
;----------------------------------------------------------------------------------------------------
SONLAR
CLRF BİRLER ;birleri temizle
MOVF ONLAR,W ;w registere onları yükle

INCF ONLAR,F ;onları 1 arttır

MOVLW H'0A' ;wregistere h'0a'yükle
SUBWF ONLAR,W ;onlar dan 10 cıkar status z değiştimi
BTFSC STATUS,2 ;sonuc 1 ise devam 0 sıfırsa 1 atla
GOTO SYÜZLER
GOTO SBİRLER

;----------------------------------------------------------------------------------------------------
SYÜZLER
CLRF ONLAR
MOVF YÜZLER,W

INCF YÜZLER,F

MOVLW H'0A'
SUBWF YÜZLER,W
BTFSC STATUS,2
GOTO SBİNLER
GOTO SBİRLER
;----------------------------------------------------------------------------------------------------
SBİNLER
CLRF YÜZLER ;yüzleri temizle
MOVF BİNLER,W ;w registere binleri yükle

INCF BİNLER,F ;binleri 1 arttır

MOVLW H'0A' ;wregistere h'0a'yükle
SUBWF BİNLER,W ;binlerden 10 cıkar status z değiştimi
BTFSC STATUS,2 ;sonuc1 ise devam 0 sıfırsa 1 atla
GOTO CLRBİNLER
GOTO SBİRLER
CLRBİNLER
CLRF BİNLER
GOTO SAY
;-------------------------------------------------------------------------------------------------
DİSYAZ
CLRF TRISA
BSF PORTA, 0

MOVF BİNLER, W
CALL TABLO
MOVWF PORTB ;BİnLERİ DİSPLAY 0'A BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER

CLRF TRISA
BSF PORTA, 1

MOVF YÜZLER, W
CALL TABLO
MOVWF PORTB ;yüzleri DİSPLAY 1'A BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER

CLRF TRISA
BSF PORTA, 2

MOVF ONLAR, W
CALL TABLO
MOVWF PORTB ;onları DİSPLAY 2'A BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER

CLRF TRISA
BSF PORTA, 3 ; DISPLAY 3

MOVF BİRLER, W
CALL TABLO
MOVWF PORTB ;BİRLERİ DİSPLAY 3'A BASAR
CALL GECIKME        ;GECİKME DÖNGÜSÜ SONRA ALTA GECER

CLRF TRISA

DECFSZ SAYAC, F ;sayac 00  kadar  ekranda göster
GOTO DİSYAZ ;sayac 00 kadar goto disyaz git
GOTO DEVAM ;goto start git
DEVAM
     MOVLW d'20'
MOVWF SAYAC      
      RETURN
;-------------------------------------------------------------------------------------
TESTTABLO ;program hücresini degerleri
ADDWF PCL, F
RETLW H'3F' ;0
RETLW H'06' ;1
RETLW H'5B' ;2
RETLW H'4F' ;3
RETLW H'66' ;4
RETLW H'6D' ;5
RETLW H'7D' ;6
RETLW H'07' ;7
RETLW H'7F' ;8
RETLW H'6F' ;9
;----------------------------------------------------------------------------------------------------
TABLO ;normal sayıcı degerleri
ADDWF PCL,F
RETLW b'11000000' ; 0
RETLW b'11111001' ; 1
RETLW b'10100100' ; 2
RETLW b'10110000' ; 3
RETLW b'10011001' ; 4
RETLW b'10010010' ; 5
RETLW b'10000010' ; 6
RETLW b'11111000' ; 7
RETLW b'10000000' ; 8
RETLW b'10010000' ; 9
;-------------------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------------------
GECIKME ;
MOVLW d'10' ;
MOVWF SAYAC1 ;
G1
MOVLW d'10' ;
MOVWF SAYAC2 ;
G2
MOVLW d'10' ;
MOVWF SAYAC3 ;
G3
DECFSZ SAYAC3,F ; Sayac3 bir azalt ve sıfır mı? kontrol et
GOTO G3 ; Hayır G3'e git
DECFSZ SAYAC2,F ; Evet. Sayac2 bir azalt ve sıfır mı?
GOTO G2 ; Hayır G2'ye git
DECFSZ SAYAC1,F ; Evet. Sayac1 bir azalt ve sıfır mı?
GOTO G1 ; Hayır 'e git
RETURN
;-------------------------------------------------------------------------------------------------
DAKİKA ;bir dakikalık gecikme
MOVLW d'6' ;
MOVWF STEPP1 ;
SET1

MOVLW d'6' ;
MOVWF STEPP2 ;
SET2

MOVLW d'6' ;
MOVWF STEPP3 ;
SET3 ;burası önemli 1 dakika süreyi beklerken
CALL  DİSYAZ ;ekrana degerleri yazar görüntü devamlı kalır
DECFSZ STEPP3,F ; stepp3 bir azalt ve sıfır mı? kontrol et
GOTO SET3 ; Hayır set3'e git
DECFSZ STEPP2,F ; Evet. stepp2 bir azalt ve sıfır mı?
GOTO SET2 ; Hayır set2'ye git
DECFSZ STEPP1,F ; Evet. stepp1 bir azalt ve sıfır mı?
GOTO SET1 ; Hayır set1'e git
RETURN
;---------------------------------
END

değişiklik nedeni disyazdaki fazlalıkları sildim
   CLRF   TRISA   
   BSF   PORTA, 0
olarak derlendi
Başlık: 16f84 ile ayarlanabilir ileri sayıcı
Gönderen: dijital74 - 19 Mayıs 2009, 18:38:06
Bildiğim kadarı ile assemblerdeki etiket adları İ, Ğ, Ö Ç gibi sadece Türk alfabesinde bulunan harfler ile başlayamaz. Bu harfleri sadece açıklama satırlarında kullanabilirsiniz.
Başlık: 16f84 ile ayarlanabilir ileri sayıcı
Gönderen: Tagli - 20 Mayıs 2009, 01:18:55
Öncelikle paylaşım için teşekkürler.

Programı derleyip denemedim ama anladığım kadarıyla ayar sırasında haneler tek tek görünüyor. Bunun yerine tüm hanelerin birden görünmesi sağlanırsa daha hoş olur bence. Ayarlanan haneyi belirtmek için de alttaki nokta kullanılabilir (gerçi her göstergede olmayabiliyor sanırım). Ayrıca, daha önce bu başlıkta (http://picproje.org/index.php/topic,24684&postdays=0&postorder=asc&start=0) da bahsettiğim gibi, gösterge güncellemesi timer2 kesmesi ile yapılırsa yazılım daha düzenli ve anlaşılır olur.

Bir de programın sonunda DİSYAZ içindeki BSF BCF 4'lüleri garibime gitti. Yanlış değil ama neden MOVLW MOVWF ikilisini kullanmadığını anlamadım. Çünkü girişe ayarlanmış bacaklar zaten bu komuttan etkilenmezler.
Başlık: 16f84 ile ayarlanabilir ileri sayıcı
Gönderen: mustafaaxu - 20 Mayıs 2009, 15:20:44
sayın tagli hocam
dediğiniz gibi DİSYAZ içindeki BSF BCF 4'lüleri  temizledim kod icinde düzeltmeyi yaptım konuyu ben öyle öğrenmiştim fakat farklı şekillerde olabiliyor belirttiğiniz gibi MOVLW MOVWF ile yapabiliriz
Haneler tümü görülüyor start ile hangi dijit ayarlanacaksa o hanedeki sayının tersi aynı haneye basılarak ayarlanan haneyi izleyebiliyorsun
portb,7 deki buton ile hane kaydırıp saymaya başlıyor.
animasyonu böyle düşündüm sizce başka bir şey yapabilirmiyiz
HOCAM gördügün gibi
burada ayar yapılırken sadece ileri saydırdım burası eksik oldu
eğer fazla sayı girdiysen geri eksiltme yok  haneleri arttırırken kullandığımız
INCF    BİRLER,F   ;birleri 1 arttır
komutunu şu şekilde yazarsak
DECF   BİRLER,F   ;birleri 1 azalt
hem arttır ve azalt işlemi yapabilirmiyiz  birde hanedegerlerini örneğin birleri arttırmak için bu kadar kod yazdım bunları daha öz yapabilirmiyiz  tahminimce çok fazla kod yazıyorum.
Teşekkür ederim.

DİSBİRLER
  CALL    DİSYAZ      ;displeyde göster
  CLRF   TRISA    
  BSF   PORTA, 3   ; DISPLAY 3    
  MOVF   BİRLER, W   ;w registere birleri yükle
  CALL   TESTTABLO   ;tablodan değer al
  MOVWF   PORTB      ;binleri DİSPLAY 3' BASAR
  CALL GECIKME            ;GECİKME DÖNGÜSÜ SONRA ALTA GECER
  BTFSC   PORTA, 4   ;porta,4 0 mı 1 mi
  INCF    BİRLER,F   ;birleri 1 arttır
  MOVLW    H'0A'      ;w ye 10 sayısını yükle
  SUBWF    BİRLER,W   ;birler den 10 cıkar status z değiştimi
  BTFSC   STATUS,2   ;sonuc 1 ise devam 0 sıfırsa 1 atla
  CLRF   BİRLER      ;sonuç 1 ise birleri temizle
  BTFSC   PORTB, 7   ;porta,7 0 mı 1 mi
  GOTO   DİSONLAR
  GOTO    DİSBİRLER  
Başlık: 16f84 ile ayarlanabilir ileri sayıcı
Gönderen: mustafaaxu - 21 Mayıs 2009, 09:43:59
sayındijital74
Bildiğim kadarı ile assemblerdeki etiket adları İ, Ğ, Ö Ç gibi sadece Türk alfabesinde bulunan harfler ile başlayamaz. Bu harfleri sadece açıklama satırlarında kullanabilirsiniz.
değerli arkadaşım bu harflere dikkat etmedim ama yukarıda yazdığım kod yapmak istediğimiz şekilde calışıyor
dediğiniz konuyu okumuştum ama
mplab bunları label olarak değiştiriyor burada nasıl tanıyorsa komutu işliyor selamlar