7 Segment te 1 Saniye ve 0,4 Saniye Aralıklarla Sayan Sayaç

7 Segment te 1 Saniye ve 0,4 Saniye Aralıklarla Sayan Sayaç
      2x7 segment üzerinde 4mhz osilator hızında kullandığım tek Tmr0 kesmesi ve ortak gecikme hesabıyla 1 saniye ve 0.4 saniye aralıklarla sayan Tmr0 örneği. Tmr0 hesaplaması ve konfigürasyon ayarlarını da kod içerisinde detaylı olarak açıklamaya çalıştım.



							#INCLUDE "P16F877.INC"
SAY1 EQU 0X21
SAY2 EQU 0X22
SAYAC EQU 0X23
SAYAC2 EQU 0X24
GOSTERGE EQU 0X25
ORG 0X00
GOTO MAIN
ORG 0X04
GOTO KESME

MAIN				;4MHZ osilator değerine göre hesaplamalar yapılmıştır
BANKSEL ADCON1		;A portunu dijital yapıyoruz
MOVLW 0X06
MOVWF ADCON1

MOVLW 0X00
MOVWF TRISA		;Port A çıkış yapıldı

MOVLW 0X00		;PortB çıkış yapıldı 
MOVWF TRISB

BANKSEL PORTA
CLRF PORTA
CLRF PORTB
CLRF GOSTERGE
CLRF SAYAC
CLRF SAYAC2
CLRF SAY1
CLRF SAY2
BSF PORTA,0	
CALL AYARLAR

SON

	GOTO SON

AYARLAR
	BANKSEL OPTION_REG	;son 3 bit Tmr0 psa değerini verir
	MOVLW B'11010111'		 ;111 1:256 prescaler
	MOVWF OPTION_REG
	
BANKSEL TMR0
	MOVLW 0X20		;tmr0 başlangıç değeri 32
	MOVWF TMR0		;256-32=224 (FF-Tmr0)*psa*Tkomut 
	
	BSF INTCON,7 ;Genel Kesme İzni
	BSF INTCON,6 ; yerel kesme izni
	BSF INTCON,5 ;tmr0 kesme izni
	RETURN
				;4mhz osilatorde Tkomut = 1mikroSaniye
KESME			;(FF-tmr0)*psa*Tkomut = 224*256*1 = 57 mikroSaniye
	BTFSS INTCON,2 ; tmr0 etkin mi
	GOTO DONUS
	
	BCF INTCON,2 ;tmr0 kesme bayrağnı  kapat
	
	MOVLW 0X20		;yine 32 değerini tmr0 a yuklerız
	MOVWF TMR0		;32 yi yuklemezsek 0 dan başlar saymaya
	INCF SAYAC,F		;hata payı daha fazla olur
	INCF SAYAC2,F		;sayac ve sayac2 yi her kesmeye gelince 1 arttırıyoruz
					;
	MOVLW 0X11		;workinge 17 değerini yukleriz
	SUBWF SAYAC2,W 	; SAYAC2-17>0 ise  C=1 değerini alır (C=carry biti)
	BTFSS STATUS,C 	;Status Carry Biti 1 mi __ 1 ise 17 kere gelmiş demektir ve yaklaşık 975milisaniye geçmiştir 
	GOTO DEVAM 		; yaklaşık 1sn geçmediyse
	MOVF SAY2,W		;geçtiyse say2 yi workinge atalım
	BSF PORTA,1		;2.sıradaki segmenti kapatıp
	BCF PORTA,0		;1.sıradaki segmenti açıyoruz (soldaki)
	CALL RAKAMLAR	;say2 yi workinge atmıştık bununla rakamları çağırıyoruz
	MOVWF PORTB	
	INCF SAY2			;say2 yi bir sonraki döngü için hazırlıyoruz 1 artırdık
	CLRF SAYAC2		;yaklaşık 1 sanıye geçtiyse sayac2 17 olmuştur sayac 2 yi temizleyip 0 dan 17 ye kadar sayınca tekrar aynı işlemi yapacağız 1 saniye yine geçmiş olacak
	MOVLW 0X0A		;soldaki segmentin 9 a kadar sayması için 9 değerine ulaşıp ulaşmadığını kontrol ediyoruz		
	SUBWF SAY2,W 		; SAY2-9 > 0 ise C=1
	BTFSS STATUS,C
	GOTO DEVAM
	CLRF SAY2
DEVAM
		MOVF SAY2,W		;burdaki işlemler soldaki segment te görünen değeri belli bir süre tutması için yazılmıştır
		BSF PORTA,1		;yaklaşık 200ms kadar soldaki değeri görmemizi sağlıyor
		BCF PORTA,0
		CALL RAKAMLAR
		MOVWF PORTB	
		
		
		MOVLW 0X04		;200 ms kadar soldaki değeri görelim
		SUBWF GOSTERGE,W  ;GOSTERGE-4>0 C=1
		INCF GOSTERGE,F
		BTFSS STATUS,C 
		GOTO DEVAM2
		MOVF SAY1,W
		BSF PORTA,0
		BCF PORTA,1
		CALL RAKAMLAR
		MOVWF PORTB
		CLRF GOSTERGE
DEVAM2
	MOVLW 0X07		;sağdaki sayac değeri 400ms olduysa 1 artırma işlemini yapıyoruz
	SUBWF SAYAC,W 	;SAYAC-7 > 0 OLURSA CARRY 1 OLUR 
	
	BTFSS STATUS,C
	GOTO DONUS
	GOTO ISLEM
	
	ISLEM
		CLRF SAYAC
		MOVF SAY1,W
		BSF PORTA,0
		BCF PORTA,1
		CALL RAKAMLAR
		MOVWF PORTB
		INCF SAY1,F
		MOVLW 0X0A
		SUBWF SAY1,W  ;SAY1 - 10 > 0 ? C=1
		BTFSS STATUS,C 
		GOTO DONUS
		CLRF SAY1
		
	DONUS
		RETFIE
RAKAMLAR
	ADDWF PCL,F                       
	RETLW 0X3F                             
	RETLW 0X06                         
	RETLW 0X5B                             
	RETLW 0X4F                          
	RETLW 0X66                             
	RETLW 0X6D                        
	RETLW 0X7D                            
	RETLW 0X07                                                
	RETLW 0X7F
	RETLW 0X6F
RETURN			;~~ www.mikroislemcim.com ~~

END
						



Proje kodlarını ve Proteus ISIS Tasarımını İndirmek İçin Aşağıdaki Bağlantıya Tıklayınız
download





Gönderen : Erdoğan CANBAY
845
18-09-2018