;-----------------------------------------------------------------------------------------------;
; Program: io-test                                                                              ;
; Developed by David J. Brown                                                                   ;
; Copyright (c) November 16, 2006  David J. Brown                                               ;
; Email: davebr@earthlink.net                                                                   ;
; Web site: http://modularsynthesis.com                                                         ;
;-----------------------------------------------------------------------------------------------;
; LICENSE AGREEMENT:                                                                            ;
; This program is free software. You can redistribute it and/or modify it.                      ;
;                                                                                               ;
; This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY,     ;
; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     ;
;-----------------------------------------------------------------------------------------------;
;
; Description: Test program for inputs and outputs
;
; Display input values:
;   After programming the PSIM, click on the Terminal1 tab in the output window of the Atom-Pro
;   IDE (third tab in the output window).  Make sure Output is checked in the View Toolbars menu.
;
;   Set the baud rate (first pull down) to 38.4kbs.
;   Set the COM port (second pull down) to whatever communication port the PSIM is connected to.
;   Click the Connect button.  It should change to Disconnect.
;
;   Pressing the start switch will display the decimal value (0 to 1023) of each of the inputs.
;   The Run led will flash on each switch closure.
;
; Set output values:
;   All outputs are set to Low A (0.75 volts).
;   Pressing the stop switch will increment each output by one octave.  Output voltage will wrap
;   from 9.75 volts back to 0.75 volts.
;   The Stop led will flash on each switch closure.
;
;-----------------------------------------------------------------------------------------------;
;
;pin declarations
	pin_j1			con p0					;in-1 pin
	pin_j2			con p1					;in-2 pin
	pin_j3			con p2					;in-3 pin
	pin_j4			con p3					;in-4 pin
	start_j			var in4					;start jack and switch
	stop_j			var in5					;stop jack and switch
	spkj_full		var in6					;speakjet buffer half full
	spkj_sdata		con	p7					;speakjet data
	aux_j			con p8					;aux jack (output mode)
	aux_in			var	in8					;aux jack (input mode)
	stop_led		con p9					;stop led (red)
	stop_led_out	var	out9				;stop led alias used for let statement
	run_led			con p10					;run led (green)
	run_led_out		var	out10				;run led alias used for let statement
	load_dacs		con p11					;load dac pin
	ser_data		con p12					;dac serial data input pin
	clock			con p13					;dac clock pin
	midi_sdata		con	p15					;midi data serial output
;i/o declarations
	in_j1			var word				;in-1 value: get_inputs, get_inputs_avg, avg1
	in_j2			var word				;in-2 value: get_inputs, get_inputs_avg, avc2
	in_j3			var word				;in-3 value: get_inputs, get_inputs_avg, avg3
	in_j4			var word				;in-4 value: get_inputs, get_inputs_avg, avg4
	out_j1  		var word				;out-1 value: load_outputs
	out_j2  		var word				;out-2 value: load_outputs
	out_j3  		var word				;out-3 value: load_outputs
	out_j4  		var word				;out-4 value: load_outputs	
;misc declarations
	lowA			con	32*9				;low A is 9 semitones above 0
	octave			con 32*12				;one octave is 12 semitones
;
;-----------------------------------------------------------------------------------------------;
; Program                                                                                       ;
;-----------------------------------------------------------------------------------------------;
;
;initialize pins
	;note: setting midi-out, i2c_clock, and i2c_data to outputs can send glitches so initialize as inputs
	dirs=%0011111000000000					;configure pin direction (1=output, 0=input)
											;inputs: midi-in, aux, start, stop, in-4, in-3, in-2, in-1
											;outputs: load_dacs, ser_data, clock, stop led, run led, i2c clock & data
	low run_led								;set run led off
	low stop_led							;set stop led off
	high load_dacs							;set dac load-0 high
	low ser_data							;set dac data low
	low clock								;set dac clock low
	let out_j1=lowA							;reset to low A	
	let out_j2=lowA							;reset to low A	
	let out_j3=lowA							;reset to low A	
	let out_j4=lowA							;reset to low A	
	gosub load_outputs
;
;-----------------------------------------------------------------------------------------------;
; Main Program                                                                                  ;
;-----------------------------------------------------------------------------------------------;
;
	disable
check:
	if start_j=1 then inputs				;check for start press
	if stop_j=0 then check					;check for stop press
	high stop_led
	if out_j1<(4095-octave) then			;check for maximum value
		let out_j1=out_j1+octave			;add an octave
		let out_j2=out_j2+octave			;add an octave
		let out_j3=out_j3+octave			;add an octave
		let out_j4=out_j4+octave			;add an octave
	else
		let out_j1=lowA						;reset to low A
		let out_j2=lowA						;reset to low A
		let out_j3=lowA						;reset to low A
		let out_j4=lowA						;reset to low A
	endif
	gosub load_outputs
outputs2:
	pause 100
	if stop_j=1 then outputs2				;wait for stop release
	low stop_led
	goto check
;
inputs:
	high run_led
	gosub get_inputs
	serout s_out,i38400,["J1=",dec in_j1," J2=",dec in_j2," J3=",dec in_j3," J4=",dec in_j4,13]
inputs2:
	pause 100
	if start_j=1 then inputs2				;wait for start release
	low run_led
	goto check
;
;-----------------------------------------------------------------------------------------------;
; Subroutines                                                                                   ;
;-----------------------------------------------------------------------------------------------;
;
;sample in-1 to in-4
;in_jx is input value (0 - 1023)
;150 uS execution time
get_inputs:
	adin pin_j1,in_j1
	adin pin_j2,in_j2
	adin pin_j3,in_j3
	adin pin_j4,in_j4
	return
;
;output out_jx values to dacs
;750 uS execution time
load_outputs:
	;add dac address to out_jx values and shift 16 bits using mode 4
	shiftout ser_data,clock,4,[(out_j1|$c000)\16]
 	pulsout load_dacs,1 				 	;clock loaddacs
 	shiftout ser_data,clock,4,[(out_j2|$8000)\16]
 	pulsout load_dacs,1					 	;clock loaddacs
 	shiftout ser_data,clock,4,[(out_j3|$4000)\16]
 	pulsout load_dacs,1 					;clock loaddacs
 	shiftout ser_data,clock,4,[out_j4\16]
 	pulsout load_dacs,1 					;clock loaddacs
 	return
;
;-----------------------------------------------------------------------------------------------;
; End Of Program                                                                                ;
;-----------------------------------------------------------------------------------------------;
