please dont rip this site

Microchip Fft Picspect.asm

;============================================================================
; PROJECT     : <B style="color:black;background-color:#ffff66">pic</B>'<B style="color:black;background-color:#ffff66">spectrum</B>
;
; FILE        : <B style="color:black;background-color:#ffff66">pic</B>SPECT.ASM
;
; VERSION     : 1.0
;
; DESCRIPTION :
;
; <B style="color:black;background-color:#ffff66">pic</B>'SCOPE digital audio <B style="color:black;background-color:#ffff66">spectrum</B> analyser - Main source file
;
; This project is a complete audio <B style="color:black;background-color:#ffff66">spectrum</B> analyser with output on a
; standard VGA display, done entirely with a <B style="color:black;background-color:#ffff66">pic</B>17C756 microcontroler.
;
; The controler is in charge of :
; - ADC acquisition of the incoming signal
; - Fast Fourier Transform of the signal
; - Power calculation and if required logarithmic scaling
; - Video generation entirely in software
; of course in real time.
;
; Developped on MICROCHIP's MPLAB 3.31.0
; To be embedded in a <B style="color:black;background-color:#ffff66">pic</B>17C756 (32MHz crystal)
;
;============================================================================
;                Developped & Copyrighted by Robert LACOSTE
;============================================================================


;----------------------------------------------------------------------------
; System definitions
;----------------------------------------------------------------------------

		PROCESSOR  17C756	; Assembler directives
		RADIX 	   HEX
		ERRORLEVEL 0
		ERRORLEVEL -302		; no bank control warnings

		TITLE 	   "<B style="color:black;background-color:#ffff66">pic</B>'<B style="color:black;background-color:#ffff66">spectrum</B>"
		SUBTITLE   "(C) Robert Lacoste"
		
#include	"P17C756.INC"		; Processor dependant declarations

		; config register :
		; XT osc, no watchdog, brown-out reset active, microcontroler
		__CONFIG (_XT_OSC & _WDT_OFF & _BODEN_ON & _MC_MODE)


;----------------------------------------------------------------------------
; Application constants
;----------------------------------------------------------------------------

MAXPIXVAL	equ D'127'		; maximum scaled pixel value

INITTIM		equ H'FFFF'-D'254'+D'13'+D'5'; timer load value,
					; 254 because 31.77µS=254*4/32MHz
					; minus 13 for irq to reload delay
					; minus 5 for timer to irq delay

BKG_COLOR	equ B'00000100'		; background=Blue
SLINE_COLOR	equ B'00000011'		; separation lines=Yellow
SHORTS_COLOR	equ B'00000011'		; small scale indicator=Yellow
LONGS_COLOR	equ B'00000011'		; long scale indicator=Yellow
FREQ_COLOR	equ B'00000001'		; Frequency bars=Red
BKGTITLE_COLOR	equ B'00000010'		; Background title=Green
TITLE_COLOR	equ B'00000000'		; Title=Black
HOLD_COLOR	equ B'00000001'		; Hold=Red


;----------------------------------------------------------------------------
; Vectors
;----------------------------------------------------------------------------

reset_vector	org H'0000'
		goto start		; Initialisation

intpin_vector	org H'0008'
		goto start		; should not occur

timer0_vector	org H'0010'
		goto it_timer		; horizontal sync interrupt

t0cki_vector	org H'0018'
		goto start		; should not occur

periph_vector	org H'0020'
		goto start		; should not occur
 
start_appl	org H'0050'		; start of application area

		
;----------------------------------------------------------------------------
; Inclusion of extern application files
;----------------------------------------------------------------------------

#include 	"vars.inc"		; Variables declarations
#include	"fixed.inc"		; Fixed point arithmetic
#include	"testsig.inc"		; Test signals generation
#include	"fft.inc"		; FFT calculation routines
#include	"powers.inc"		; power calculation & display access
#include	"irq.inc"		; interrupt routine & video generation


;----------------------------------------------------------------------------
; Main starting point
;----------------------------------------------------------------------------

start		nop
		BANKSEL zone_main

;-- Initialisation

		call initialize		; initialization of ports & variables
		call realfft		; do the first FFT (on the test signal)
		call init_timer		; launch timer0 interrupts
	
mainloop	nop

;-- Power <B style="color:black;background-color:#ffff66">spectrum</B> calculation & scaling

		movlb 0			; if RB7=0 (mode log),
		btfsc PORTB,7
		goto spectlin
spectlog	call powerlog		; calculate <B style="color:black;background-color:#ffff66">spectrum</B> in log scale
		goto main1
spectlin	call powerlin		; else calculate <B style="color:black;background-color:#ffff66">spectrum</B> in lin scale

main1		nop

;-- Analog acquisition

		movlb 0			; if RB6=1 (non hold mode),
		btfss PORTB,6		; do analog sample acquisition :
		goto main2
		movlb 1			; RD1=1 (debug line : ADC going on)
		bsf PORTD,1
		BANKSEL num_sample	; sample number=0
		clrf num_sample,F
		call init_adc		; initialize analog acquisition
		BANKSEL acq_request
		movlw 1			; put acqrequest flag to 1
		movwf acq_request

		clrf WREG,F		; and wait for it to be 0
acqwait		cpfseq acq_request
		goto acqwait

		movlb 1			; RD1=0 (debug line : ADC going on)
		bcf PORTD,1

;-- Do the FFT

		movlb 1			; RD0=1 (debug line : FFT going on)
		bsf PORTD,0

		BANKSEL zone_main
		call realfft		; do the FFT

		movlb 1			; RD0=0 (debug line : FFT going on)
		bcf PORTD,0

;-- And loop !
		
main2		goto mainloop


;----------------------------------------------------------------------------
; Ports & variables initialization
;----------------------------------------------------------------------------

initialize	nop

;-- Variables initialization

		BANKSEL acq_request	; reset adc control registers
		clrf acq_request,F
		clrf num_sample,F

		BANKSEL scan_line	; reset scan line number
		clrf scan_line,F	; (will be incremented to 1 at the
		clrf scan_line+1,F	; first interrupt)

		BANKSEL displ0		; reset displ0 buffer
		movlw low displ0
		movwf FSR0
		bcf ALUSTA,FS1		; auto increment mode
		bsf ALUSTA,FS0
		bcf ALUSTA,C
		movlw low displ0+D'64'
rstdispl0	clrf INDF0,F
		cpfseq FSR0
		goto rstdispl0

		BANKSEL displ1		; reset displ1 buffer
		movlw low displ1
		movwf FSR0
		bcf ALUSTA,FS1		; auto increment mode
		bsf ALUSTA,FS0
		bcf ALUSTA,C
		movlw low displ0+D'64'
rstdispl1	clrf INDF0,F
		cpfseq FSR0
		goto rstdispl1

		bsf ALUSTA,FS1		; return to non-increment mode

		BANKSEL zone_main
		m_ldaconst H'2000'	; generate test square signal
		movlw D'16'
		call test_square

;-- Ports initialization

		movlw B'11111000'	; RB0 to RB2 are outputs
		movlb 0
		movwf DDRB
		clrf PORTB,F		; initialized to 0

		movlw B'10101111'	; RC4 and RC6 are outputs
		movlb 1
		movwf DDRC
		bcf PORTC,4		; RC4=0 (Hsync)
		bsf PORTC,6		; RC6=1 (Vsync)

		movlw B'11111000'	; RD0 to RD2 are outputs
		movlb 1
		movwf DDRD
		clrf PORTD,F		; initialized to 0

		movlw B'01111111'	; RG7 is output
		movlb 5
		movwf DDRG
		clrf PORTG,F		; initialized to 0

		return


;----------------------------------------------------------------------------
; Initialization of timer0
; 
; Generate an interrupt every 31.77 micro-second (horizontal refresh
; rate for VGA display in 640x350 mode = 31.476KHz)
;
; Warning : interrupts will start immediatly after calling this routine
;----------------------------------------------------------------------------

init_timer	nop

		bsf CPUSTA,GLINTD	; disable global interrupts

		bsf T0STA,T0CS		; select internal clock
		bcf T0STA,T0PS3		; and prescale factor 1:1
		bcf T0STA,T0PS2
		bcf T0STA,T0PS1
		bcf T0STA,T0PS0

		BANKSEL tmpcpt
		movlw high INITTIM	; load timer
		movwf tmpcpt
		movlw low INITTIM
		movwf TMR0L
		movfp tmpcpt,TMR0H
 
		bcf INTSTA,PEIE		; disable PEI interrupts
		bcf INTSTA,T0CKIE	; disable external interrupts on RA1
		bcf INTSTA,INTE		; disable external interrupts on RA0

		bsf INTSTA,T0IE		; enable timer0 interrupts

		bcf CPUSTA,GLINTD	; enable global interrupts

		return


;----------------------------------------------------------------------------
; Configuration of analog acquisition port
;
; Connect the analog source and configure the A/D sub-system. Acquisition
; will be done by the interrupt routine synchronously with video generation. 
;----------------------------------------------------------------------------

init_adc	movlb 5
		movlw B'10000000'	; clock=F/64 (2µS conversion),
		movwf ADCON1		; left justified, ref 0/5V

		movlw B'10000000'	; select chanel AD8
		movwf ADCON0

		bsf ADCON0,ADON		; switch on ADC sub-system

		return



		END

;============================================================================
;                             - END OF FILE -
;============================================================================


file: /Techref/microchip/fft/picspect.asm, 8KB, , updated: 1998/1/10 12:32, local time: 2024/9/27 16:23,
TOP NEW HELP FIND: 
18.222.161.38:LOG IN
©2024 PLEASE DON'T RIP! THIS SITE CLOSES OCT 1, 2024 SO LONG AND THANKS FOR ALL THE FISH!

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://piclist.com/techref/microchip/fft/picspect.asm?key=pic+spectrum"> microchip fft picspect</A>

Did you find what you needed? "pic spectrum"

  PICList 2024 contributors:
o List host: MIT, Site host massmind.org, Top posters @none found
- Page Editors: James Newton, David Cary, and YOU!
* Roman Black of Black Robotics donates from sales of Linistep stepper controller kits.
* Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters.
* Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated!
* Contributors: Richard Seriani, Sr.
 

Welcome to piclist.com!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .