 #include <xc.inc>
 PROCESSOR 16F1615    
 RADIX HEX

; PIC16F1615 Configuration Bit Settings

; Assembly source line config statements

; CONFIG1
  CONFIG  FOSC = INTOSC         ; Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
  CONFIG  PWRTE = OFF           ; Power-up Timer Enable (PWRT disabled)
  CONFIG  MCLRE = ON            ; MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
  CONFIG  CP = OFF              ; Flash Program Memory Code Protection (Program memory code protection is disabled)
  CONFIG  BOREN = ON            ; Brown-out Reset Enable (Brown-out Reset enabled)
  CONFIG  CLKOUTEN = OFF        ; Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
  CONFIG  IESO = ON             ; Internal/External Switch Over (Internal External Switch Over mode is enabled)
  CONFIG  FCMEN = ON            ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

; CONFIG2
  CONFIG  WRT = OFF             ; Flash Memory Self-Write Protection (Write protection off)
  CONFIG  PPS1WAY = ON          ; Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software)
  CONFIG  ZCD = OFF             ; Zero Cross Detect Disable Bit (ZCD disable.  ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
  CONFIG  PLLEN = ON            ; PLL Enable Bit (4x PLL is always enabled)
  CONFIG  STVREN = ON           ; Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
  CONFIG  BORV = LO             ; Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
  CONFIG  LPBOR = OFF           ; Low-Power Brown Out Reset (Low-Power BOR is disabled)
  CONFIG  LVP = ON              ; Low-Voltage Programming Enable (Low-voltage programming enabled)

; CONFIG3
  CONFIG  WDTCPS = WDTCPS1F     ; WDT Period Select (Software Control (WDTPS))
  CONFIG  WDTE = OFF            ; Watchdog Timer Enable (WDT disabled)
  CONFIG  WDTCWS = WDTCWSSW     ; WDT Window Select (Software WDT window size control (WDTWS bits))
  CONFIG  WDTCCS = SWC          ; WDT Input Clock Selector (Software control, controlled by WDTCS bits)

#define BE() bcf LATC3
#define KI() bsf LATC3





;------------------------------------------------------------------------RESETVECT
PSECT   Por_Vec,global,class=CODE,delta=2
    global  resetVec
resetVec:
     PAGESEL start
     goto start
     
;------------------------------------------------------------------------BANK0    
PSECT   MainData,global,class=RAM,space=1,delta=1,noexec
global  avar,bvar,AARGB,REMB,LOOPCOUNT,LIMITER,RPM
     
avar:    DS      1
bvar:    DS      1
AARGB:  DS	 3
RPM:	 DS      2
REMB:	 DS	 2
LOOPCOUNT: DS    1
LIMITER:    DS    2
;------------------------------------------------------------------------------
;--------------------------------------------------------------------global vars
PSECT   Isr_Data,global,class=COMMON,space=1,delta=1,noexec
global  RUN,CHANGED,BARGB,LIMIT

BARGB:   DS      2 
RUN:     DS	 1
LIMIT:   DS	 1
CHANGED: DS	 1
;-------------------------------------------------------------------------------
;--------------------------------------------------------------------------int    
     
PSECT   Isr_Vec, delta=2,class=CODE
GLOBAL IsrVec
  IsrVec:  
    
    banksel PIR4
    btfsc SMT1PRAIF
    goto period
    btfsc  SMT1IF
    goto overflow
   // banksel PIR5
   // btfsc  AT1IF
   // goto atint
   // goto endisr
    period:
	movlw 0X01
	movwf RUN
	movwf CHANGED
	bcf   SMT1PRAIF
    goto endisr
    
    overflow:
	movlw 0X00
	movwf RUN
	bcf  SMT1IF
    goto endisr
    

 endisr:
RETFIE
 ;----------------------------------------------------------------------------    
     
  
 start:
     banksel OSCCON
     movlw 0XFB
     movwf OSCCON     ;SWITCH TO 16M
    
	goto	$+1 ;2uS delay
	goto	$+1
	goto	$+1
	goto	$+1
     banksel ATINPPS
     movlw 0X15
     movwf ATINPPS ;Angular timer bemenete rc5
     banksel RC3PPS
     movlw 0X04
     movwf RC3PPS  ;CLC sr flipflop kimenete rc3
     banksel AT1CCON1
     movlw 0X80
     movwf AT1CCON1
     movwf AT1CCON2
     movlw 0X00;
     movwf AT1CCON3
     movwf AT1CLK
     movwf AT1CC1H
     movwf AT1CC2H
     movlw 0X62	
     movwf AT1CC1L       ;30%LOW 70%HIGH bosch tsz-h elosztó fém serleg
     movlw 0XAA
     movwf AT1CC2L  
     movlw 0X00;
     banksel AT1CON1
     movwf AT1CON1 ;!
     movwf RUN
     movlw 0XB3
     movwf AT1RESH ;!
     movlw 0X67
     movwf AT1RESL  ;!
     movlw 0X03
     movwf AT1IE1 ;!
     movlw 0XB0
     movwf AT1CON0 ;!
     
     
     
     movlw 0X00
     banksel SMT1CLK
     movwf SMT1CLK
     movlw 0X80
     movwf SMT1CON0
     movlw 0x16
     movwf SMT1WIN
     movlw 0xFF
     movwf SMT1PRL
     movwf SMT1PRH
     movwf SMT1PRU
     movlw 0XC4
     movwf SMT1CON1
     banksel PIE4
     movlw 0X03
     movwf PIE4    ;aq complete / overflow
   //movlw 0x04
   //movwf PIE5    ;at compare
     banksel CLC1CON
     
     movlw 0X02
     movwf CLC1GLS0
     movlw 0X00
     movwf CLC1GLS1
     movwf CLC1GLS3
     movwf CLC1SEL2
     movwf CLC1SEL3
     movwf CLC1POL
     movlw 0x08
     movwf CLC1GLS2
     movlw 0X10
     movwf CLC1SEL0
     movlw 0X11
     movwf CLC1SEL1
     movlw 0X83
     movwf CLC1CON
     
     movlw 0XC0
     movwf INTCON
     
     
    
     movlw 0XF7  ; rc3 kimenet
     banksel TRISC     
     movwf TRISC
     banksel ANSELC
     clrf ANSELC
     banksel LIMITER
     MOVLW 0X00
     MOVWF RPM
     MOVWF RPM+1
     MOVWF LIMITER+1
     MOVLW 0X08
     MOVWF LIMITER  //tesztként 800 fordulatra tiltás, pc ventillátor 5v ról ezret pörög
    
  pagesel main
  goto main 
  
 ;----------------------------------------------------------------------mainloop 
 PSECT   MainCode,global,class=CODE,delta=2
     
     main:

BANKSEL AARGB+2	   ;;;; 18750(00) osztandó
MOVLW 0X3E;0x38
MOVWF AARGB
MOVLW 0X49;0x9C
MOVWF AARGB+1
MOVLW 0X00;0x1C
MOVWF AARGB+2


  ;;;;;;;;;;;;;;;;;;;;;periódusidő feltöltése bargb osztóba
 banksel SMT1CPRU   
reassign:
MOVLW 0X00
MOVWF CHANGED
MOVF SMT1CPRU, W
MOVWF BARGB+1
MOVF SMT1CPRH, W
MOVWF BARGB
MOVF CHANGED ,F   ;ha menet közben smt aq interrupt jött volna
BTFSS ZERO
GOTO reassign 
    ;;;;;;;;;;;;;;;;;;;;;fordulatszám számítása
banksel REMB+1
FXD2416U:
        CLRF REMB+1
        CLRF REMB
        MOVLW 0X18  //24LOOP
        MOVWF LOOPCOUNT
LOOPU2416:
        RLF AARGB, W           
        RLF AARGB+1, F           
        RLF AARGB+2, F          
        RLF REMB, F       
        RLF REMB+1, F
        RLF AARGB, F           
        MOVF BARGB, W          
        SUBWF REMB, F          
        MOVF BARGB+1, W          
        BTFSS CARRY         
        INCFSZ BARGB+1, W        
        SUBWF REMB+1, F          
        BTFSC CARRY                 
        BSF AARGB, 0          
        BTFSC AARGB, 0         
        GOTO UOK46LL          
        ADDWF REMB+1, F         
        MOVF BARGB, W          
        ADDWF REMB, F 
UOK46LL:	
        DECFSZ LOOPCOUNT, f     
        GOTO LOOPU2416
	
	MOVF AARGB,W
	ADDWF RPM,F
	BTFSC CARRY
	INCFSZ RPM+1
	MOVF AARGB+1,W
	ADDWF RPM+1,F
	RRF RPM+1,F
	RRF RPM,F        ; két számítás átlagának használata rpm értékként
	
	
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;fszm osztás vége
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;limiter	
	
	movf RPM+1,w  
	subwf LIMITER+1,w 
	btfss ZERO
	goto results16
	movf RPM,w
	subwf LIMITER,w	
results16:
	
	banksel CLC1GLS2
	btfss CARRY     
	bcf CLC1GLS2,3  ; c=0 tiltás be, rpm túl magas
	btfsc CARRY
	bsf CLC1GLS2,3  ;tiltás ki
	
	
	
	
goto main 


	END resetVec