16f84 ile ayarlanabilir ileri sayıcı

Başlatan mustafaaxu, 19 Mayıs 2009, 12:42:26

mustafaaxu

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ı

;   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

dijital74

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.

Tagli

Ö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 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.
Gökçe Tağlıoğlu

mustafaaxu

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  

mustafaaxu

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