1024 encoder 4x mod 16f877a konum kontrolü assembly

camby

Üye
Katılım
12 Mar 2009
Mesajlar
426
Puanları
1
Encoder : 1024 puls
4x mod + ileri geri pozisyon takibi : 1 tur 4096 parça
MCU : Pic 16f877a , 20MHz
Kesme : PORTB <4:7> değişim kesmesi
Display : 4'lü 7 segment
Display tarama frekansı : 76.21 Hz
Display zamanlaması : Timer1
Kesme alt programının işlenme süresi : 8.4 us


HIZ------------2 Kesme arası süre---------------Durum
---------------------------------------------------------------------
60 RPM------------250 us------------Test Başarılı
600 RPM-----------25 us ------------Test Başarılı
1200 RPM---------12.5 us-----------Test Başarılı
1800 RPM---------8.33 us-----------Test Başarısız --- Sınır Değeri


Hesap yaparken encoder'ı 1000'lik kabul ettim

Özetle A ve B fazından gelen kesmelerin okunması ve yön tespitinin yapılabilmesi için 2 kesme arası sürenin 8.4 us 'den fazla olması gerekiyor. Bu da yaklaşık 1800 RPM'e denk geliyor. 2 kesme ( puls ) arası süre 8.4 us'nin altına indiğinde program puls kaçırıyor.

Sonuç olarak 1200 rpm'de konum hatası yapmıyor .

Kod:
; Encoder ile konum takibi
		LIST 		P=16F877A    	
		include 	"P16F877A.inc"
		__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_HS_OSC &_BODEN_OFF &_LVP_OFF &_CPD_OFF 	
		ORG 		0x00			
		GOTO 		AYAR
		ORG		0X04
		GOTO		KESME

		#DEFINE		FAZA		PORTB,7
		#DEFINE		FAZB		PORTB,6
;===============Registers=================================================
w_sakla 	EQU  	20
s_sakla		EQU 	21
konum_bir	EQU  	22
konum_on	EQU 	23
Flag		EQU  	24
konum_yuz	EQU	25
konum_bin 	EQU	26
eski_a		EQU 	27
yeni_a		EQU	28
eski_b		EQU	29
yeni_b		EQU	2A
saatyonu	EQU  	2B
tersyon		EQU 	2C
basamaksayaci	EQU	2D


;===============if========================================================
LKAE		macro 		f,k, etiket
		movlw 		k
		subwf 		f,0
		btfsc		STATUS,2
		CALL		etiket
		endm

;===============KESME ALT PROGRAMI========================================

KESME		movwf		w_sakla		; W yazmacı kaydedildi
		movf		STATUS,w
		movwf		s_sakla		; Status yazmacı kaydedildi
		
		btfsc		PIR1,0		; Timer kesmesi oldu mu?
		GOTO		TIMER

		btfss		FAZA		; A fazının okunması 
		clrf		yeni_a
		btfsc		FAZA
		movlw		.1
		btfsc		FAZA
		movwf		yeni_a	

		btfss		FAZB		; B fazının okunması
		clrf		yeni_b
		btfsc		FAZB
		movlw		.1
		btfsc		FAZB
		movwf		yeni_b

		movf		yeni_b,w	; eskiA xor yeniB
		xorwf		eski_a,f	
		
 		btfss		eski_a,0
		incf		saatyonu
		btfsc		eski_a,0
		incf		tersyon
 
		movf		yeni_a,w	; yeni değerler , eski oldu
		movwf		eski_a
		movf		yeni_b,w
		movwf		eski_b
 	
		movf		PORTB,f
		nop
		bcf		INTCON,0 	; (RBIF) RB Port Change Interrupt Flag bit		
		nop
		movf		PORTB,f

		movf		s_sakla,w
		movwf		STATUS		; Status yazmacı geri yüklendi
		movf		w_sakla,w	; W yazmacı geri yüklendi
	
		retfie

TIMER		bsf		Flag,0		; LCD yenileme bayrağı
		bcf		PIR1,0		; (TMR1IF) TMR1 Overflow Interrupt Flag bit
		bsf		TMR1H,7
		nop
		bsf		TMR1H,6
		movf		s_sakla,w
		movwf		STATUS		; Status yazmacı geri yüklendi
		movf		w_sakla,w	; W yazmacı geri yüklendi	
		retfie	

;===============Gösterilecek Sayının binary karşılığı ORTAK KATOT=========
TABLO		addwf		PCL,1
		DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F
		return

;===============Display Tarama============================================
LCD_REFRESH 	movf		basamaksayaci,w	; 5.4 us , 27 komut
		addwf		PCL,f
		GOTO		Binlergonder
		GOTO		Yuzlergonder
		GOTO		Onlargonder
		GOTO		Birlergonder

DEVAM		incf		basamaksayaci	; 7 segment tarama sırası
		
		movlw		.4
		subwf		basamaksayaci,w	; Basamak Sayacı taştı mı
		btfsc		STATUS,Z	
		clrf		basamaksayaci	

		bcf		Flag,0		; LCD yenileme bayrağı temizlendi
		return

;===============7 Segment TARAMA==========================================
Binlergonder
		movf		konum_bin,w
		CALL		TABLO
		movwf		PORTC
          
		movlw		b'00000001'
		movwf		PORTD
		GOTO		DEVAM
   		
Yuzlergonder   
 		movf		konum_yuz,w
		CALL		TABLO
		movwf		PORTC
          
		movlw		b'00000010'
		movwf		PORTD
		GOTO		DEVAM
       
Onlargonder 		
		movf		konum_on,w
		CALL		TABLO
		movwf		PORTC
          
		movlw		b'00000100'
		movwf		PORTD
		GOTO		DEVAM
       
Birlergonder
		movf		konum_bir,w
		CALL		TABLO
		movwf		PORTC
          
		movlw		b'00001000'
		movwf		PORTD
		GOTO		DEVAM

;===============Konumu Değişkeni==========================================
ARTTIR		incf		konum_bir

		movlw		.10		
		subwf		konum_bir,w
		btfss		STATUS,Z
		GOTO		ARTTIR1
		clrf		konum_bir
		
		incf		konum_on

		movlw		.10		
		subwf		konum_on,w
		btfss		STATUS,Z
		GOTO		ARTTIR1
		clrf		konum_on

		incf		konum_yuz

		movlw		.10		
		subwf		konum_yuz,w
		btfss		STATUS,Z
		GOTO		ARTTIR1
		clrf		konum_yuz

		incf		konum_bin
		GOTO		ARTTIR2

ARTTIR1		movlw		.4		; 4096 oldu mu?
		subwf		konum_bin,w
		btfss		STATUS,Z
		GOTO		ARTTIR2

		movlw		.0
		subwf		konum_yuz,w
		btfss		STATUS,Z
		GOTO		ARTTIR2
	
		movlw		.9
		subwf		konum_on,w
		btfss		STATUS,Z
		GOTO		ARTTIR2
	
		movlw		.6
		subwf		konum_bir,w
		btfss		STATUS,Z
		GOTO		ARTTIR2
		
		clrf		konum_bin
		clrf		konum_yuz
		clrf		konum_on
		clrf		konum_bir

ARTTIR2		decfsz		saatyonu,f
		GOTO		ARTTIR
		return
;===============Konumu Değişkeni==========================================
AZALT		movf		konum_bin,w 
		btfss		STATUS,Z
		GOTO		AZALT1

		movf		konum_yuz,w
		btfss		STATUS,Z
		GOTO		AZALT1
	
		movf		konum_on,w
		btfss		STATUS,Z
		GOTO		AZALT1
	
		movf		konum_bir,w
		btfss		STATUS,Z
		GOTO		AZALT1

		movlw		.4
		movwf		konum_bin
		movlw		.0	
		movwf		konum_yuz
		movlw		.9
		movwf		konum_on
		movlw		.5
		movwf		konum_bir
		GOTO		AZALT2
AZALT1		decf		konum_bir

		movlw		.255
		subwf		konum_bir,w
		btfss		STATUS,Z
		GOTO		AZALT2
		
		movlw		.9
		movwf		konum_bir

		decf		konum_on

		movlw		.255
		subwf		konum_on,w
		btfss		STATUS,Z
		GOTO		AZALT2
		
		movlw		.9
		movwf		konum_on

		decf		konum_yuz

		movlw		.255
		subwf		konum_yuz,w
		btfss		STATUS,Z
		GOTO		AZALT2
		
		movlw		.9
		movwf		konum_yuz

		decf		konum_bin

AZALT2		decfsz		tersyon,f
		GOTO		AZALT
		return

;===============KONFİGÜRASYON=============================================

AYAR		clrf		PORTC
		clrf		PORTD

		bsf 		STATUS,5	; Bank1'e geç	
		clrf		TRISD		; 
		clrf		TRISC
		movlw		.255	
		movwf		TRISB
		bsf		PIE1,0		; TMR1 interrupt enable
		bcf 		STATUS,5	; Bank0'a geç
		bsf		INTCON,6	; (PEIE) Peripheral Interrupt Enable bit
		bsf		INTCON,3 	; (RBIE) RB Port Change Interrupt Enable bit
		movlw		b'00000001'	; 1:1 , internal clock
		movwf		T1CON
				
		clrf		konum_bir
		clrf		konum_on
		clrf		konum_yuz
		clrf		konum_bin
		clrf		eski_a
		clrf		yeni_a
		clrf		eski_b
		clrf		yeni_b
		clrf		saatyonu
		clrf		tersyon

		clrf		TMR1L	
		movlw		b'11000000'
		movwf		TMR1H
	
		movf		PORTB,w
		nop
		bcf		INTCON,0 	; (RBIF) RB Port Change Interrupt Flag bit		
		nop
		bsf		INTCON,7	; (GIE) Global Interrupt Enable bit
		
		btfss		FAZA		; A fazının okunması 
		clrf		eski_a
		btfsc		FAZA
		movlw		.1
		btfsc		FAZA
		movwf		eski_a	

		btfss		FAZB		; B fazının okunması
		clrf		eski_b
		btfsc		FAZB
		movlw		.1
		btfsc		FAZB
		movwf		eski_b

		clrf		Flag

;===============ANA PROGRAM===============================================

ANA		btfsc		Flag,0
		CALL		LCD_REFRESH	; 5.4 us , 27 komut
			
		movf		saatyonu,w	; 0 mı ?
		btfss		STATUS,Z
		CALL		ARTTIR		; max 6.4 us

		movf		tersyon,w	; 0 mı ?
		btfss		STATUS,Z
		CALL		AZALT		; max 6.4 us

		GOTO 		ANA

		END
 

Forum istatistikleri

Konular
130,118
Mesajlar
933,301
Kullanıcılar
453,191
Son üye
ParaNora

Yeni konular

Geri
Üst