;******************************************************************************
;                                                                             *
;    Date                :  29/08/2008                                        *
;    File Version        :  1.00                                              *
;                                                                             *
;    Other Files Required: p30F2020.gld, p30f2020.inc                         *
;    Tools Used:	MPLAB IDE : 8.10.00                                       *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Notes:				                                                      *
;    2Msps A/D tesztelése 2uS impulzussal  30F2020-on (SMPS DSP PIC)     *
;    																		  *
;                                                                             *
;                                                                             *
;******************************************************************************

    ;    .equ __30F2020, 1
        .include "p30f2020.inc"
        
;..............................................................................
;Konfigurálás:
;..............................................................................
	config __FOSC, CSW_FSCM_OFF	& FRC_HI_RANGE & OSC2_IO & HS_EC_DIS
										    ; külső oszci kikapcs, OSC2 láb I/O
										    ; Belsó oszci magas frekis										    
										    
	config __FOSCSEL, FRC_PLL				; Belső oszci(15MHz), PLL-el (32x)

	config __FWDT, FWDTEN_OFF			 	; Watchdog Timer Off

	config __FPOR, PWRT_128                 ; set Power-up Timer to 128msecs

	config __FGS, CODE_PROT_OFF        		; Set Code Protection Off for the 
                                            ; General Segment
                                            
	config __FBS, BSS_NO_FLASH
	
	config	__FICD, ICS_NONE

;..............................................................................
;Globális deklarációk:
;..............................................................................

        .global __reset      		; Reset címke deklarálás	 
        .global	__T1Interrupt   	; T1 interrupt címke deklarálása
        .global	__U1TXInterrupt		; USART megszakítási pont
		.global	__StackError		; Stack hiba megszakítás
		.global	__ADCInterrupt		; ADC megszakítás lekezelése
		.global	__ADCP0Interrupt	; 0-ás ADC pár megszakításpont

;..............................................................................
;Állandók definiálása: (#DEFINE = .macro)
;..............................................................................

	.macro	m_Unsigned_Multiple_Set
		 bset	CORCON,#US	; 1 = Unsigned mode enabled for DSP multiply operations
	.endm					; 0 = Signed mode enabled for DSP multiply operations
	
	.macro	m_Integer_DSP_Multiply
		bset	CORCON,#IF	; 1 = Integer mode enabled for DSP multiply operations
	.endm					; 0 = Fractional mode enabled for DSP multiply operations

        .equ	TSGRC00, #0
        .equ	TSGRC01, #1
        .equ	TSGRC02, #2
        .equ	TSGRC03, #3
        .equ	TSGRC04, #4
        .equ	TSGRC10, #8
        .equ	TSGRC11, #9
        .equ	TSGRC12, #10
        .equ	TSGRC13, #11
        .equ	TSGRC14, #12        
        .equ	T1_ADC_Trig_Flag, #0
        

  	; I/O makrók _______________________________________
	.macro	LAB_Be
		bset	LATA, #LATA9
	.endm
	.macro	LAB_Ki
		bclr	LATA, #LATA9
	.endm	
	
	.equ 	LED1, #LATB5	
	
	.equ	Gomb1, #RE6 
	.equ	Gomb2, #RE7
	
	.equ	Poti_plus, #LATB3
	.equ	Poti_minus, #LATB2

	.equ	AD_Teszt_Lab, #LATE2

	
	;USART makrók _______________________________________
	.equ	Fcy, 	#30000000	; Programvégrehajtási freki
	.macro	Baud_Rate_BRGH_0, Br
		bclr	U1MODE, #BRGH
		mov		#Fcy/(&Br&*16)-1,w0
		;mov		#Fcy/(&Br&*16),w0	; Ha felfelé kell kerekíteni
		mov		w0, U1BRG	
	.endm
	.macro	Baud_Rate_BRGH_1, Br
		bset	U1MODE, #BRGH
		;mov		#Fcy/(&Br&*4)-1,w0
		mov		#Fcy/(&Br&*4),w0
		mov		w0, U1BRG	
	.endm ; vissza kell ellenőrizni, mert csak lefelé tud kerekíteni a fordító!
		

;..............................................................................
;Változó deklarálások:
;..............................................................................
;				.section .xbss, bss, xmemory
;Stack:			.space	32

;OSC_TUNE_Count:	.space 2	; Oszcillátor hangolás számláló
;Counter:		.space 2	; Teszt idő számláló
;Flag0:			.space 2	; Flageknek


;				.section .ybss, bss, ymemory
;ADC_Buffer_y:   .space	256	
				.section A, bss, address(0x86E)	
ADC_Buffer_y:   .space	400						

;******************************************************************************
;Program terület:
;******************************************************************************

.text
__reset:
;Stack beállítása
	mov #__SP_init, w15  	; A deklarált változóktól függ.
	mov #__SPLIM_init, w0  ; 
;	mov	#0x08F8, w0  		; x terület vége
	mov w0, _SPLIM
;..............................................................................
;Perifériák alap konfigurálása:
;..............................................................................

	m_Unsigned_Multiple_Set	; Unsigned mode enabled for DSP multiply operations	
	m_Integer_DSP_Multiply	; Integer mode enabled for DSP multiply operations
	
	; INT előbeállítás
	bclr INTCON2, #ALTIVT		; Alternatív megszakítás táblázat mód kikapcsolása
	
	;___ Oszci beállítás _____________________________________________________________
	mov	#0b0101, W0
	mov	W0, OSCTUN			; Belső RC oszci 15MHz
	
	;___ I/O beállítások ___________________________________________________________
	mov	#0b0000000000000000, W0
	mov	W0, TRISA
	mov W0, TRISB
	mov W0, TRISD
	mov W0, TRISE
	mov W0, TRISF			; minden port kimenet
	
	bset	TRISE, #RE6		; Alternatív RX vonal bemenet
	bclr	TRISE, #RE7		; Alternatív TX vonal kimenet
	
	bset	CNPU1, #CN0PUE	; felhúzó ellenállás bekapcs (RX-re nem tudom működik-e, de jól jönne)
;	bset	CNPU1, #CN1PUE	; felhúzó ellenállás bekapcs (TX-re nem kell)		
	

	;__ Timer beállítások ___________________________________________________________
	;_ T1 _________________________
	bclr T1CON, #TSIDL			;?
	bclr T1CON, #TGATE			;?
	
;	bset T1CON, #TCKPS0
;	bset T1CON, #TCKPS1			; Előosztó 256

;	bclr T1CON, #TCKPS0	
;	bset T1CON, #TCKPS1			; 64

;	bset T1CON, #TCKPS0	
;	bclr T1CON, #TCKPS1			; 8

	bclr T1CON, #TCKPS0
	bclr T1CON, #TCKPS1			; Előosztó 1	

;	MOV  #1776, W0 				; T1 osztás 
;	MOV  #1810, W0
;	mov  #3016, w0
;	mov #3040, w0				; 2Msps-hez tartozó T1 INT idő (200 mintavétel)
	mov #5000, w0				; 1,25Msps-hez tartozó T1 INT idő (200 mintavétel)	
	MOV  W0, PR1 				; Periódus regiszter betöltése

	bclr T1CON, #TCS			; Internal clock (FOSC/4)
	clr	 TMR1					; T1 számláló törölve	

	bset IPC0, #T1IP0 			; 
	bclr IPC0, #T1IP1 			; 	
	bclr IPC0, #T1IP2 			; Prioritás 1-es szintű

	bclr IFS0, #T1IF			; T1 megszakítás jelző törölve
	bset IEC0, #T1IE			; T1 megszakítás engedélyezve
;	bclr IEC0, #T1IE			; T1 megszakítás tiltva	
	
	
	;_T2 _______________________
	bclr	T2CON, #T32			; 2x16bites mód (ADC trig T3-ról)
	bclr	T2CON, #TCS			; Belső oszci forrás
	bclr	T2CON, #TCKPS0
	bclr	T2CON, #TCKPS0		; előosztó 1 (1,8,64,256) (bemeneti freki Fosc/4 = 60MHz/4= 15MHz)
;	mov		#29, w0				; ADC 2Msps
	mov		#55, w0				; triggerelés idő 
;	mov		#24, w0					
	mov		w0, PR2				; T3 periódusregiszter ADC Triggereléshez beállít
	clr 	TMR2	
;	bset	T2CON, #TON			; T2 bekapcs	
	
;	bset	T2CON, #T32			; 32bites mód. (ADC trig T2+T3-ról)
	

	;_ T3 ______________________
	bclr	T3CON, #TCS			; Belső oszci forrás
	bclr	T3CON, #TCKPS0
	bclr	T3CON, #TCKPS0		; előosztó 1 (1,8,64,256) (bemeneti freki Fosc/4 = 60MHz/4= 15MHz)

	mov		#0xFF, w0
	mov		w0, PR3				; T3 periódusregiszter 
;	bset	T3CON, #TON			; T3 bekapcs	


	; AD konfig________________________________________________
	;• ADCON: ADC Control Register
	;• ADSTAT: ADC Status Register1
	;• ADBASE: ADC Base Register
	;• ADPCFG: ADC Port Configuration Register
	;• ADCPC0: ADC Pair Control Register 0
	;• ADCPC1: ADC Pair Control Register 1
	;• ADCPC2: ADC Pair Control Register 2	
	;• ADBUF0-ADBUF11 12 data output registers

	.macro AD_modul_Bekapcs
		bset	ADCON, #ADON
	.endm
	.macro AD_modul_Kikapcs
		bclr	ADCON, #ADON
	.endm
	


	; ADC port 1=> Digital port, 0=> Analog mode
	mov		#0b1111111111111100, w0
	mov		w0, ADPCFG
	bset	TRISB,#RB0		; AN0 Analog bemenet
	bset	TRISB,#RB1		; AN1 Analog bemenet
		
	; ADC conversion Clock Divider (ADCS<2:0>	
	;	000 = FADC/4	60MHz	
	;	001 = FADC/6	40MHz
	;	010 = FADC/8	30MHz
	;	011 = FADC/10 (default)	24MHz
	;	100 = FADC/12	20MHz
	;	101 = FADC/14	17,14MHz
	;	110 = FADC/16	15MHz
	;	111 = FADC/18	13,33MHz
	mov		#0b110, w0
	mov		w0, ADCON

	bclr	ADCON, #ADSIDL	; Operate in Idle Mode	

	; ADC data format
	; 1 = AD_Data_Fractional
	; 0 = AD_Data_Integer
	bclr	ADCON, #FORM	; AD_Data_Integer
	
	; Konverziós sorrend beállítása
	bclr	ADCON,#ORDER
	bset	ADCON,#SEQSAMP	; A0 minta, majd konverzió, A1 minta, majd konverzió.
	;bclr	ADCON,#SEQSAMP	; A0+A1 minta, majd konverzió 
		
	;	Selects trigger source for conversion of analog channels ANn and ANn.
	;	00000 = No conversion enabled
	;	00001 = Individual software trigger selected
	;	00010 = Global software trigger selected
	;	00011 = PWM Special Event Trigger selected
	;	00100 = PWM generator 1 trigger selected
	;	00101 = PWM generator 2 trigger selected
	;	00110 = PWM generator 3 trigger selected
	;	00111 = PWM generator 4 trigger selected
	;	01100 = Timer 1 period match
	;	01101 = Timer 2 period match
	;	01110 = PWM generator 1 current-limit ADC trigger
	;	01111 = PWM generator 2 current-limit ADC trigger
	;	10000 = PWM generator 3 current-limit ADC trigger
	;	10001 = PWM generator 4 current-limit ADC trigger
	;	10110 = PWM generator 1 fault ADC trigger
	;	10111 = PWM generator 2 fault ADC trigger
	;	11000 = PWM generator 3 fault ADC trigger
	;	11001 = PWM generator 4 fault ADC trigger		
	bset	ADCPC0,#TSGRC00
;	bclr	ADCPC0,#TSGRC00	
;	bset	ADCPC0,#TSGRC01
	bclr	ADCPC0,#TSGRC01
	bset	ADCPC0,#TSGRC02
;	bclr	ADCPC0,#TSGRC02
	bset	ADCPC0,#TSGRC03
;	bclr	ADCPC0,#TSGRC03
;	bset	ADCPC0,#TSGRC04 	
	bclr	ADCPC0,#TSGRC04 	; 01101 = Timer 2 period match
	
	; IRQ, Trigger, Pending
	bset	IPC2, #ADIP0
	bset	IPC2, #ADIP1
	bset	IPC2, #ADIP2		; prioritás szint 7
	
	bclr	ADCON, #EIE			; Early Interrupt
	
	bclr	IFS0,#ADIF			; megszakításjelző törlése
;	bclr	ADCPC0, #IRQEN0		; A0-A1 IRQ nincs engedélyezve
	bset	ADCPC0, #IRQEN0		; A0-A1 IRQ engedélyezve
;	bclr	IEC0, #ADIE			; ADC megszakítás nincs engedélyezve	
	bset	IEC0, #ADIE			; ADC megszakítás engedélyezve	
	clr		ADSTAT


	; PWM konfig __________________________________________________________
	call	Set_PWM

	; USART konfig _________________________________________________________
	call	Set_USART

;	bra		AD_teszt			; Címzés teszt kihagyása
;______________________________________
	;Címzés teszt
;	mov		#0x0C0A,w0
;	mov		w0,OSC_TUNE_Count
;	mov		#0x800,w4		; forráscím
;	mov		#0x900,w6		; célcím
kovetkezo:		
;	mov		[w4++],[w6++]	; adat átvitel, utána W5 címpointer növelése
;	mov		[w4--],[w6++]	; következő szó...		
;	bra		kovetkezo	


;______________________________________
	
	; AD teszt
AD_teszt:
	bset	LATB, #Poti_plus
	bclr	LATB, #Poti_minus
	
	mov		#ADC_Buffer_y,w5
	mov		#ADCBUF0, w4
	mov		#ADCBUF1, w6
		
	AD_modul_Bekapcs
	
	;teszt
	bset	PTCON, #PTEN	; PWM modul bekapcs
	
	; szimuláció miatt átugorja az időzítést
	bra	jump
	
	
	; AD modul feléledésére várakozás
		DO		#900,loop_2
		nop
		DO		#8000,loop_3
		nop
loop_3: nop
loop_2: nop

jump:
			nop
			DO		#200, MemTorol
			clr		[w5++]
MemTorol: 	nop

	mov		#ADC_Buffer_y,w5

	bclr	IFS0,#ADIF		; megszakításjelző törlése

	bset	T1CON, #TON			; T1 bekapcs 
	

;	mov		#28, w0		
;	mov		w0, TMR2			; Tmr2 kezdő érték betöltve
	bset	T2CON, #TON			; T2 bekapcs (ADC trigg)

ADC_Ciklus:
	bset	LATB, #LED1			
	bra		ADC_Ciklus	


;_____________________________________________________________________________
; Szubrutinok:
;_____________________________________________________________________________

; Várakozás a mérő freki periódus idejéhez:
;_____________________________________________________________________________
Wait_1:						
;		mov		#17, W0
;		mov		W0, Counter
;P_Cikl:	dec		Counter
;		bra		NZ, P_Cikl
;		nop
;		return		

; USART beállítások:
;_____________________________________________________________________________
Set_USART:
		bset	U1MODE, #ALTIO	 ; alternatív USART kimenet (11.(U1ATX) és 12.(U1ARX) láb)
		Baud_Rate_BRGH_1 #19200	 ; vissza kell ellenőrizni, mert csak lefelé tud kerekíteni a fordító!
		bclr	U1MODE, #STSEL	 ; 1-stop bit
		bclr	U1MODE, #PDSEL0		
		bclr	U1MODE, #PDSEL1	 ; No Parity, 8-data bits
		bclr	U1MODE, #ABAUD	 ; Autobaud Disabled
	;USART ON-OFF
		bset	U1MODE, #UARTEN	 ; USART bekapcsolva
		bset	U1STA, #UTXEN	 ; TX adás engedélyezve	
	;Interrupt 
		bclr	U1STA, #13	 	 ; UTXISEL0
		bclr	U1STA, #15		 ; UTXISEL1 Interrupt for every data transfer	
		bset	IPC2, #U1TXIP0
		bclr	IPC2, #U1TXIP1
  		bclr	IPC2, #U1TXIP2	 ; Prioritás 1- es	
		bclr	IFS0, #U1TXIF 	 ; TX INt flag törölve	
		bclr	IEC0, #U1TXIE	 ; USART TX interrupt tiltva
		;bset	IEC0, #U1TXIE	 ; USART TX interrupt engedély
		;bclr	IEC0, #U1RXIE	 ; USART RX interrupt tiltva
		;bset	IEC0, #U1RXIE	 ; USART RX interrupt engedély
	

		; Várakozni kell az első karakter kivitele előtt 104 usec (1/9600) időtartamot.
		DO		#1558,loop_1
		nop
loop_1: nop
		return 

TX_Redy:
		btss	U1STA, #TRMT		; TX kész?
		bra		TX_Redy	
		return


; PWM beállítások:
;_____________________________________________________________________________
Set_PWM:
	clr	PWMCON1
	clr	PWMCON2
	clr	PWMCON3
	clr	PWMCON4
	clr	TRGCON1
	clr	TRGCON2
	clr	TRGCON3
	clr	TRGCON4
	clr	IOCON1
	clr	IOCON2
	clr	IOCON3
	clr	IOCON4
	
	; bit 7-6 DTC<1:0>: Dead-Time Control bits
	; 00 = Positive dead time actively applied for all output modes
	; 01 = Negative dead time actively applied for all output modes
	; 10 = Dead-Time function is disabled
	; 11 = Reserved
	bclr	PWMCON1, #DTC0 	
	bset	PWMCON1, #DTC1 	; 10 = Dead-Time function is disabled	
		
	; bit 8 MDCS: Master Duty Cycle Register Select bit
	; 1 = MDC register provides duty cycle information for this PWM generator
	; 0 = PDCx register provides duty cycle information for this PWM generator
	bclr	PWMCON1,#MDCS	; 	PDCx register provides duty cycle information
	
	bset	PWMCON1, #IUE	; Enable immediate duty cycle updates
	
	; IO CONFIG .....
	bset	IOCON1, #PENL	; 26. láb PWM kimenet.
	bset	IOCON1, #PENH	; 25. láb PWM kimenet.
		
	; bit 11-10 PMOD<1:0>: PWM #x I/O Pin Mode bits
	; 00 = PWM I/O pin pair is in the Complementary PWM Output mode
	; 01 = PWM I/O pin pair is in the Independent Output mode
	; 10 = PWM I/O pin pair is in the Push-Pull Output mode
	; 11 = Reserved
	bclr	IOCON1, #PMOD0
	bclr	IOCON1, #PMOD1	; 00 = PWM I/O pin pair is in the Complementary PWM Output mode
	
	; Code for PWM Current Limit and Fault Inputs
	mov 	#0x0003, w0
	mov 	w0, FCLCON1 ; Disable current limit and fault inputs
	
	
	mov		#0x0F40, w0			; 245900Hz
;	mov		#19192, w0			; 20uS -> 50KHz	
	mov		w0, PTPER			; periódus beállítása
	
	mov 	#0x0000, w0
	mov 	w0, PHASE1			; nincs fázis tolás
	
	mov		#0x07A0, w0			; pl. 50% akkor PDC1 = PTPER*0,5
;	mov		#9596, w0			; 50%
;	mov		#19000, w0			; 50%
	mov		w0, PDC1			; kitöltési tényező beállítása
	
;	bset	PTCON, #PTEN	; PWM modul bekapcs	
		return

;_____________________________________________________________________________
; Megszakítások lekezelése:
;_____________________________________________________________________________
	;_______ TIMER1 INT __________
__T1Interrupt:
	bclr	T2CON, #TON			; T1 kikapcs
	AD_modul_Kikapcs
	bclr 	IFS0, #T1IF 		; Megszakítás jelző törölve
	bclr	T1CON, #TON			; T1 kikapcs
			
			mov		#ADC_Buffer_y,w5
			
			DO		#199,loop_usart
		;	DO		#59,loop_usart	; csak A0 műkszik
			mov		[w5++],w1		; egy karakter kivitele	
			call	TX_Redy			; Adásra kész?			
			mov		w1, U1TXREG
			swap	w1
			call	TX_Redy			; Adásra kész?			
loop_usart:	mov		w1, U1TXREG			

			call	TX_Redy			; Adásra kész?
			btss	ADSTAT, #P0RDY	; 
			bra		int
			mov		#1 w1
			mov		w1, U1TXREG		; Ha nem törlődött a P0RDY bit az ADC INT-ben(hiba!)
int:
	bra		int
	
	retfie 
	
	;________ STACK ERR INT __________
__StackError:
	bclr	INTCON1,#STKERR
;	mov		#0x0800,W15
	bset	LATB,#LED1		; folyamat ellenőrzés
	retfie
	
	;_________ USART INT _________
__U1TXInterrupt:	
	bclr	IFS0, #U1TXIF	; Megszakítás jelző törölve
	bset	LATB,#LED1		; folyamat ellenőrzés
	retfie
	
	;________ ADC INT ____________
__ADCInterrupt:
	;AD érték tárolása
	bclr	ADSTAT, #P0RDY
	bclr	IFS0,#ADIF		; megszakításjelző törlése	
 	bclr	LATB, #LED1	
;	bra 	kesz

	
;	btss	PORTB,#LED1		; LED világít?
;	bra		LED_bekapcs
;	bclr	LATB, #LED1
	
;	bra		kesz
LED_bekapcs:	
;	bset	LATB, #LED1		
kesz:	
	
	mov		[w4],[w5++]		; w4=ADCBUF0 címe	
	mov		[w6],[w5++]		; w6=ADCBUF1 címe
;	bset	ADCPC0,#SWTRG0	; "kézi" Trigger (mintavétel indítása)	

	
	
	retfie
	
.end        