'---------------------------------------------
'PUBLIC DOMAIN
'---------------------------------------------

'*******************************************************************
'********************* JIBBER JABBER *******************************
'*******************************************************************

'*****************************************************
' PSIM-1 (Programmable Synthesizer Interface Module)
'
' Module: PSIM-1 REV1b
' Revision Date:  2004/02/19  12:00 AM
' Processor Type: Basic Micro - Basic Atom Pro24M
'
'
' Basic Program Developed by Grant Richter
' Special thanks to Brice for his assistance.
'
' Description:
' This progam scales the output of the buchla 249e to be standard 1v/oct 
'
' When the 249e monitor reads out its output in volts its not actually putting 
' that amount out.  In order to get that output in volts hit the stop button on 
' this program   
'
' When the start button is hit and run led lights up the 249e pitch notes are 
' converted to standard 1/v oct output.  This also converts the buchla 225e
' output to standard 1/v oct output (it currently puts out approx 1.15 v/oct)
'
' Process Indicators:
'
' StopLED = Convert listed 249e voltage to the correct voltage 
' RunLED = 	Convert the note pitch of 249e and 225e to 1/v oct 
' 
' Program is the same on all 4 cv ins and outs
' CV In 1 - 
' CV In 2 - 
' CV In 3 - 
' CV In 4 - 


' CV Out 1 -
' CV Out 2 - 
' CV Out 3 - 
' CV Out 4 - 

'*****************************************************

' Basic Micro Atom Pro-24M Configuration
'
' (Note: P0 is I/O 0 and NOT pin 0 on the microprocessor.)
'
' P0 -  Analog IN-1 (0-5 VDC)
' P1 -  Analog IN-2 (0-5 VDC)
' P2 -  Analog IN-3 (0-5 VDC)
' P3 -  Analog IN-4 (0-5 VDC)
' P4 -  START Button (Momentary Normally Open Switch)
' P5 -  STOP  Button (Momentary Normally Open Switch)
' P6 -  I2C/SDA (Reserved) - J3 Pin 1
' P7 -  I2C/SDL (Reserved) -  J3 Pin 2
' P8 -  AUX (Digital I/O - NO BUFFERING)
' P9 -  STOP LED
' P10 - RUN LED
' P11 - DAC - LOADDACS
' P12 - DAC - SERDATA
' P13 - DAC - CLOCK
' P14 - RXD (Reserved) - J5 Pin 1 (Midi)
' P15 - TXD (Reserved) - J5 Pin 2 (Midi) Din Pin 4 > 220 ohm
'*****************************************************
	'Define Variables
	
	LOADDACS	CON 11  ' Pin OUT to DAC LOADDACS
	SERDATA		CON 12  ' Pin OUT Serial Data to DAC (16-bit)
	CLOCK		CON 13  ' Pin OUT to Clock DAC
	STOPLED		CON 9   ' Red LED
	RUNLED		CON 10  ' Green LED
	BSTART		CON 5   ' Start Button
	BSTOP		CON 4   ' Stop  Button
	AUX			CON 8	' AUX Jack (unbuffered)
	
	BPM			VAR	LONG
	MIDICLK		VAR	BYTE
	INH0		VAR	BIT
	INH1		VAR	BIT
	INH2		VAR	BIT
	HALFPAUSE	VAR	WORD
	
	RAWDAC1  	VAR WORD  ' RAW DAC DATA 1 
	RAWDAC2  	VAR WORD  ' RAW DAC DATA 2 
	RAWDAC3  	VAR WORD  ' RAW DAC DATA 3 
	RAWDAC4  	VAR WORD  ' RAW DAC DATA 4 
	
	VAR1		VAR LONG  ;cv between 0 and 4095 with 3790 at 10v
	VAR2		VAR LONG
	var3		var LONG
	var4		var	LONG
	var5		var bit 'type of scaling to perform
	
	DAC1V  		VAR WORD  ' DAC Value to be Sent to DAC Channel
	DAC2V  		VAR WORD  ' DAC Value to be Sent to DAC Channel
	DAC3V  		VAR WORD  ' DAC Value to be Sent to DAC Channel
	DAC4V  		VAR WORD  ' DAC Value to be Sent to DAC Channel
	
	ADC1		CON 0
	ADC2		CON	1
	ADC3		CON 2
	ADC4		CON 3

	ADC1V		VAR WORD	'INPUT A/D BUFFER CH. 1
	ADC2V		VAR WORD	'INPUT A/D BUFFER CH. 2
	ADC3V		VAR WORD	'INPUT A/D BUFFER CH. 3
	ADC4V		VAR WORD	'INPUT A/D BUFFER CH. 4

	'*****************************************************
	'Initialize Module

	 DIRS = %0111110010000000 ' Configure Pins    1=output  0=input
	 OUTS = %0111111111111111 ' Configure State   1=high    0=low
	 SCR3 = %00000000
	 SMR = %00000000
	 BRR = 15
	 PAUSEUS 100
	 SCR3 = %00100000
	 PMR1 = %00001110
	'*****************************************************

'*******************************************************************
'*************** APPLICATION CODE START ****************************
'*******************************************************************

START:
	
	HIGH RUNLED 'runled on means we are converting 249e notes to 1/v oct
	LOW STOPLED 'stopled means we are scaling the voltage out on 249e
	LOW AUX
	GOSUB CLEARDACS
	var1=16
	var2=16
	var3=16
	var4=16
	var5=1

MAINLOOP:
'voltage notes 
GOSUB SCANADC

IF IN5 = 1 THEN 
HIGH STOPLED
LOW RUNLED
var5=0
endif

IF IN4 = 1 THEN 
HIGH RUNLED
LOW STOPLED
var5=1
endif



	
	IF ADC1V > 16 THEN
    VAR1 = ADC1V*374/100
    endif
    IF ADC1V <=16 THEN
    var1=16
    endif
    
    IF ADC2V > 16 THEN
    VAR2 = ADC2V*374/100
    endif
    IF ADC2V <=16 THEN
    var2=16
    endif
    
    IF ADC3V > 16 THEN
    VAR3 = ADC3V*374/100
    endif
    IF ADC3V <=16 THEN
    var3=16
    endif
    
    IF ADC4V > 16 THEN
    VAR4 = ADC4V*374/100
    endif
    IF ADC4V <=16 THEN
    var4=16
    endif
    
    if var5 = 0 THEN
   	VAR1 = (((VAR1*100)-1440)*104)/10090
 	VAR2 = (((VAR2*100)-1440)*104)/10090
 	VAR3 = (((VAR3*100)-1440)*104)/10090
 	VAR4 = (((VAR4*100)-1440)*104)/10090 
 	endif	
 	
 	if var5 = 1 THEN
 	VAR1 = (((VAR1*100)-1540)*85)/9909 
 	var2 = (((VAR2*100)-1540)*85)/9909  
 	var3 = (((VAR3*100)-1540)*85)/9909  
 	var4 = (((VAR4*100)-1540)*85)/9909  
 	endif
 	
    if VAR1 > 4095 then
    var1=0
	endif

	if VAR2 > 4095 then
    var2=0
	endif
	
	if VAR3 > 4095 then
    var3=0
	endif
	
	if VAR4 > 4095 then
    var4=0
	endif


	DAC1V = VAR1
	DAC2V = VAR2
	DAC3V = var3
	DAC4V = var4

GOSUB LOADALLDACS

GOTO MAINLOOP



  
	
	
'*******************************************************************
'************************** SUBROUTINES ****************************
'*******************************************************************





CLEARDACS:
	DAC1V = 0
	DAC2V = 0
	DAC3V = 0
	DAC4V = 0
 
SCANADC:
	'load buffers with actual a/d values
	ADIN ADC1, ADC1V
	ADIN ADC2, ADC2V
	ADIN ADC3, ADC3V
	ADIN ADC4, ADC4V
	RETURN

LOADALLDACS: ' by Grant Richter of Wiard Synthesizer Company as of 17 Jan 2004
	'Add addresses to VALues no speed improve with OR over +
	RAWDAC1=DAC1V+49152
	RAWDAC2=DAC2V+32768
	RAWDAC3=DAC3V+16384
	RAWDAC4=DAC4V
	'shift out 16 bits mode 4 gotta bang loaddacs pin for each channel
	'skew from ch. 1 to 4 = 400 usecs. Aprox 1 msec execution time for sub.
	SHIFTOUT SERDATA,CLOCK,4,[RAWDAC1\16]
	PULSOUT LOADDACS,1 
	SHIFTOUT SERDATA,CLOCK,4,[RAWDAC2\16]
	PULSOUT LOADDACS,1 
	SHIFTOUT SERDATA,CLOCK,4,[RAWDAC3\16]
	PULSOUT LOADDACS,1
	SHIFTOUT SERDATA,CLOCK,4,[RAWDAC4\16]
	PULSOUT LOADDACS,1
	RETURN
	
STARTSUB:

	TDR = $FA
	SSR = %00000000
 	RETURN
 	
STOPSUB:
	
	TDR = $FC
 	SSR = %00000000
 	RETURN
