;********************************************************************
; Léptetomotor vezérlés
;********************************************************************
; Lukácsy Gergely
;********************************************************************
; Panel:
;	PIC 16F628A
;	Kimenet:	PORTB(RB0, RB1, RB2, RB3)
;	Bemenet:	-
;********************************************************************

#include <P16F628A.INC>
	__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF)

	cblock 0x20
	irany	; 0 = elore, 1 = hátra
	fazis	; Léptetomotor aktuális fázisa	(0-7 között mozoghat)
	lepes	; Motor által megtett ütemek száma
  	endc

org 0x0000
	goto 	Init

org 0x0004
	goto 	Interrupt

Init
	bsf		STATUS,RP0
	clrf	TRISB
	bcf 	OPTION_REG,T0CS	;Timer0 órajelforrása - belso oszcillátor
	bcf		OPTION_REG,PSA	;Prescaler TMR0-hoz illesztve
	bcf		OPTION_REG,PS0	;Prescaler = 1:256-hoz
	bcf		OPTION_REG,PS1
	bcf		OPTION_REG,PS2

	movlw	0xA0	;megszakítás, Timer0 túlcsordulás engedélyezve
	movwf	INTCON

	goto	Main

Main:
	nop
	goto $-1	;végtelen ciklus

Interrupt:
	bcf 	INTCON,T0IF	;Timer0 Interrupt Flag törlése
	btfss	irany,0		;Irány ellenorzése
	goto	Forward
	goto	Backward
	retfie				;Interrupt újra egnedélyezése / return

Forward:
	movf	fazis,0		;Aktuális ütem # => WREG 
	call	Pattern
	bcf		STATUS,RP0	;Váltás BANK0-ra
	movwf	PORTB		;A Pattern függvény visszatérési értéke => PORTB-be
	incf	fazis		;Fázis növelése eggyel	

	movlw	.8
	xorwf	fazis,0
	btfss	STATUS,Z
	retfie
	clrf	fazis
	retfie

Backward:
	movf	fazis,0		;aktuális ütem # => WREG
	call	Pattern
	bcf		STATUS,RP0
	movwf	PORTB
	decf	fazis

	movlw	0xFF
	xorwf	fazis,0		
	btfss	STATUS,Z	;Átfordult a fázis? (fazis == 0xFF)
	retfie				;	-> nem: ugrás vissza 
	movlw	.7			;	-> igen:
	movwf	fazis		;		fazis = 7
	retfie

Pattern:				;Ez a függvény az ütemnek megfelelo mintázattal tér vissza
	addwf	PCL				;ugrás fázisra
	retlw	b'00001000'		;fazis = 0
	retlw	b'00001100'		;fazis = 1
	retlw	b'00000100'		;fazis = 2
	retlw	b'00000110'		;fazis = 3
	retlw	b'00000010'		;fazis = 4
	retlw	b'00000011'		;fazis = 5
	retlw	b'00000001'		;fazis = 6
	retlw	b'00001001'		;fazis = 7
	return
end