	LIST P=12F629
	#INCLUDE <P12F629.INC>
	__CONFIG _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_ON & _INTRC_OSC_NOCLKOUT


	errorlevel -302


BANK0 MACRO
	BCF STATUS,RP0
	ENDM
BANK1 MACRO
	BSF STATUS,RP0
	ENDM

#DEFINE M0L LAT,0
#DEFINE M0R LAT,2
#DEFINE M1L LAT,4
#DEFINE M1R LAT,5
#DEFINE IRIN GPIO,3

#DEFINE LED GPIO,1


	CBLOCK	0x20
	STATUS_SAVE
	W_SAVE

	MSTIMER
	TIMERTEMP0
	TIMERTEMP1

	MOTOR0_PWM
	MOTOR1_PWM
	MOTOR_DIR


	PWM_TEMP


	Bit_Cntr
	TEMP1

	LAT
	SERIALDATA_MOTOR0
	SERIALDATA_MOTOR1
	SERIALDATA_CHECKSUM

	ENDC

	ORG 0
	GOTO BOOT


;-------------------------------------INT-------------------------------
	ORG 4
INTERRUPT
	MOVWF W_SAVE
	SWAPF STATUS, W
	MOVWF STATUS_SAVE
	BANK0
	BTFSC PIR1,CMIF
	GOTO COMPARATOR_INT

TIMERINT
	BCF INTCON, T0IF
	MOVLW D'128'
	MOVWF TMR0

	CLRF LAT ; MOTOROK KI
	INCF PWM_TEMP,F
	INCF PWM_TEMP,F
	
;RAM0 > RAM1

	MOVFW MOTOR0_PWM ;RAM0
	SUBWF PWM_TEMP,W ;RAM1
	BTFSS STATUS,C
	GOTO MOT0ON ; IGAZ

	MOVFW MOTOR1_PWM ;RAM0
	SUBWF PWM_TEMP,W ;RAM1
	BTFSS STATUS,C
	GOTO MOT1ON ; IGAZ

	MOVFW LAT
	MOVWF GPIO
INTERRUPT_END
	SWAPF STATUS_SAVE, W
	MOVWF STATUS
	SWAPF W_SAVE, 1
	SWAPF W_SAVE, 0
	RETFIE

MOT0ON
	BTFSS MOTOR_DIR,0
	BSF M0L
	BTFSC MOTOR_DIR,0
	BSF M0R

	MOVFW MOTOR1_PWM ;RAM0
	SUBWF PWM_TEMP,W ;RAM1
	BTFSS STATUS,C
	GOTO MOT1ON ; IGAZ

	MOVFW LAT
	MOVWF GPIO
	SWAPF STATUS_SAVE, W
	MOVWF STATUS
	SWAPF W_SAVE, 1
	SWAPF W_SAVE, 0
	RETFIE

MOT1ON
	BTFSS MOTOR_DIR,1
	BSF M1L
	BTFSC MOTOR_DIR,1
	BSF M1R

	MOVFW LAT
	MOVWF GPIO
	SWAPF STATUS_SAVE, W
	MOVWF STATUS
	SWAPF W_SAVE, 1
	SWAPF W_SAVE, 0
	RETFIE

COMPARATOR_INT
	BTFSS CMCON,COUT
	GOTO LOWVOLT
COMPINT_END
	BCF PIR1,CMIF
	BTFSC INTCON,T0IF
	GOTO TIMERINT

	SWAPF STATUS_SAVE, W
	MOVWF STATUS
	SWAPF W_SAVE, 1
	SWAPF W_SAVE, 0
	RETFIE

LOWVOLT
;	CLRF GPIO
;	NOP
;	NOP
;	NOP
;	NOP
;	NOP
;	NOP
;	NOP
;	NOP
;	BTFSC CMCON,COUT
;	GOTO COMPINT_END
LEMERULT_CONFIG
	MOVLW D'7'
	MOVWF CMCON
	BANK1
	CLRF VRCON
	MOVLW B'11001000'
	MOVWF TRISIO
	BANK0



	BCF T1CON, TMR1ON

LEMERULT
	CLRWDT
	MOVLW B'00000010'
	MOVWF GPIO
	CALL DELAY50MS
	CALL DELAY50MS
	CLRF GPIO
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	CALL DELAY50MS
	GOTO LEMERULT






DELAY50MS ;KÖZEL 50MS
	MOVLW D'10'
	MOVWF MSTIMER
	GOTO DELAY1MS_1

DELAY1MS_1 ;1 MS*5
	MOVLW D'100'
	MOVWF TIMERTEMP0

DELAY1MS_2 ;10uS*5
	NOP
	MOVLW D'15'
	MOVWF TIMERTEMP1

DELAY1MS_3
	DECFSZ TIMERTEMP1,F
	GOTO $-1
	NOP
	NOP

	DECFSZ TIMERTEMP0, F
	GOTO DELAY1MS_2

	DECFSZ MSTIMER
	GOTO DELAY1MS_1

	RETURN


;----------------------------------INT------------------------------------

BOOT
	BANK1
    call      3ffh               ;get the calibration value
    movwf  OSCCAL       ;calibrate

	BANK0
	CLRF GPIO
	BANK1
	MOVLW B'11001010'
	MOVWF TRISIO
	MOVLW B'10001110'
	MOVWF OPTION_REG
	MOVLW B'01100000'
	MOVWF INTCON

	BANK0
	CLRF GPIO

	MOVLW B'00000100'
	MOVWF CMCON

	BANK1
	MOVLW B'10100111'
	MOVWF VRCON

	CLRF PIE1
	BSF PIE1,CMIE
	BANK0

	CLRF T1CON


	CLRF MOTOR1_PWM
	CLRF MOTOR0_PWM
	CLRF LAT
	CLRF PWM_TEMP
	CLRF TEMP1
	CLRF MOTOR_DIR

	CALL DELAY50MS

	BTFSS CMCON,COUT
	GOTO LEMERULT_CONFIG

	BSF INTCON,GIE

	CLRWDT


MAIN


	CALL RS232_Rx
	MOVFW TEMP1
	CLRF TEMP1
	XORLW 0xAA
	BTFSS STATUS, Z
	GOTO MAIN ; CSOMAGKEZDET DETEKTÁLÁSA
PACKAGESTARTRECIVED

	CALL RS232_Rx
	MOVFW TEMP1
	CLRF TEMP1
	MOVWF SERIALDATA_MOTOR0

	CALL RS232_Rx
	MOVFW TEMP1
	CLRF TEMP1
	MOVWF SERIALDATA_MOTOR1

	CALL RS232_Rx
	MOVFW TEMP1
	CLRF TEMP1
	MOVWF SERIALDATA_CHECKSUM

CHECK_PACKAGE

	MOVFW SERIALDATA_MOTOR0
	ADDWF SERIALDATA_MOTOR1,W
	ADDLW D'1'

	XORWF SERIALDATA_CHECKSUM , W
	BTFSS STATUS,Z
	GOTO MAIN ; VISSZA AMíG NEM JÖN EGY "ÉP" CSOMAG
RECOVEOK

	CLRWDT

	BCF INTCON,GIE
	CLRF MOTOR_DIR
	BTFSC SERIALDATA_MOTOR0,7
	BSF MOTOR_DIR,0
	BTFSC SERIALDATA_MOTOR1,7
	BSF MOTOR_DIR,1
	MOVFW SERIALDATA_MOTOR0
	ANDLW B'01111111'
	MOVWF MOTOR0_PWM
	BCF STATUS,C
	RLF MOTOR0_PWM,F
	MOVFW SERIALDATA_MOTOR1
	ANDLW B'01111111'
	MOVWF MOTOR1_PWM
	BCF STATUS,C
	RLF MOTOR1_PWM,F
	
	BSF INTCON,GIE


	GOTO MAIN


; Egy RS-232 bájt vétele
;
RS232_Rx
	btfsc   IRIN    ; start bit detektálás (log0 szintű)
	goto    RS232_Rx	; nincs start jel, várakozik tovább
;----------------------------------------------------------------------
	call    Start_Delay     ; fél bitidőnyi késleltetés
	movlw   d'8'		; bitek száma
	movwf   Bit_Cntr
Rmit
	call    Bit_Delay       ; teljes bitidőnyi késleltetés
 	btfss   IRIN	; RxD bemenet másolása C bitbe
	bcf     STATUS,C
	btfsc   IRIN
	bsf     STATUS,C
	rrf     TEMP1,1		; Carry beléptetése Temp1-be
	decfsz	Bit_Cntr,1	; összes bit vétele megtörtént?
	goto	Rmit		; még nem
;----------------------------------------------------------------------
	call    Bit_Delay       ; Stop bit késleltetés
	return			; vétel kész, vett adat Temp1-ben
;----------------------------------------------------------------------

; RS232 startbit késleltetés
; 416 us / 1200 Baud
;Timer1 et használom mert egy sima ciklusnál "közbejöhet" az interrupt és elrontja az egészet...
; T1 be betöltöm az időt és nézem az interrupt flag et
Start_Delay 
	MOVLW D'254'
	MOVWF TMR1H
	MOVLW D'96' ; 54
	MOVWF TMR1L

	BSF T1CON, TMR1ON
CHECK_STARTD
	BTFSS PIR1, TMR1IF
	GOTO CHECK_STARTD

	BCF T1CON, TMR1ON
	BCF PIR1, TMR1IF

	RETURN
;----------------------------------------------------------------------
; RS232 bit idő beállitás
; 833 us / 1200 Baud
Bit_Delay
	MOVLW D'252'
	MOVWF TMR1H
	MOVLW D'191' ; 109
	MOVWF TMR1L

	BSF T1CON, TMR1ON
CHECK_Bit_Delay
	BTFSS PIR1, TMR1IF
	GOTO CHECK_Bit_Delay

	BCF T1CON, TMR1ON
	BCF PIR1, TMR1IF

	RETURN

;----------------------------------------------------------------------




	END