So I've started a new program that does not have all the features I want. I figured it's best to start with the base and then add things once I get those working properly. The schematic is for an echo/delay sound effects unit. Right now, I'm just trying to get the on/off (bypass/trails) switch and the "DELAY TIME" potentiometer to work.
The 2 x PT2399 ICs are the delay chips. They are in series. Their delay time is controlled by the MCP4251 digital potentiometer, which is controlled by the 16F616 (note that the schematic says 16F676, but I am using the 16F616), which interfaces with the user via an analog potentiometer.
The on/off feature has two modes of operation - normal bypass and trails bypass. Normal bypass is just an on/off switch for the effect. When "ON", junction A and B are set high to allow signal to pass through the switching JFETs and junction C is low to block signal. When "OFF", junction A and B are low and junction C is high. "Trails mode" is a feature that allows the echoes to continue repeating after you turn the effect "off", but doesn't allow any new echoes to be created. So when the effect is on, it is the same as when in normal mode, but when the effect is off, junction A is low, cancelling new signal that feeds into the delay chips and the dry side of the crossfader, but junction B and C are high allowing the complete dry signal to pass and any signal that is already in the feedback loop of the delay chip.
The user can toggle between normal and trails modes by pressing and holding the bypass switch for 3 seconds. The tempo LED will blink 5 times to let the user know that the mode has changed. When the effect is on, the bypass LED is high. When it is off, the bypass LED is low.
In the code below, the bypass feature seems to work just fine. It is the delay time control that I'm having problems with. The analog potentiometer does control the delay time as it should. However, it modulates wildly, i.e., the digital potentiometer will not settle into one position once you stop turning the analog potentiometer. I have a feeling the way I've done the config or set the registers has something to do with it.
Code:
#config
__CONFIG _CP_OFF & _WDTE_OFF & _BOREN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _IOSCFS_4MHZ
#endconfig
ADCON0 = %00000000
ADCON1 = %01100000
ANSEL = %00000110
CM1CON0 = %00000000
CM2CON0 = %00000000
TRISA = %00001111
TRISC = %00000000
'
' Hardware connection
' ===================
CS VAR PORTA.5
SCK VAR PORTC.2
SDI VAR PORTC.1
tempoLED var PORTC.0
tempobutton var PORTA.0
bypassbutton var PORTA.3
bypassLED var PORTC.4
fetA var PORTC.5
fetB var PORTA.4
fetC var PORTC.3
'
' Variables definition
' ===================
w var word ' division toggle switch
x var word ' delay time knob
xprevious var word
z var word
binaryvalue var word
ticks var word
tapcount var word
LEDcounter var word
LEDcounterlimit var word
LEDrate var word
trailsmode var byte
trailsmodecounter var word
LEDon var byte
LEDoff var byte
LEDon = 1
LEDoff = 0
'
' begin in bypass
' ===============
tempoLED = 0
fetA = 0
fetB = 0
fetC = 1
bypassLED = LEDoff
trailsmode = 0
main:
gosub readpot
if bypassBUTTON = 0 then
gosub bypasspress
gosub bypassbuttonrelease
ENDif
pause 100
gosub movedigipot
goto main
bypasspress: ' subroutine that occurs when bypass button is pressed
trailsmodecounter = 0 ' waits to see if you want to switch between normal or trails mode
do until trailsmodecounter = 400
if bypassbutton = 1 then exit
pause 10
trailsmodecounter = trailsmodecounter + 1
loop
if trailsmodecounter = 400 then ' if bypass button was held long enough then change mode
goto trailmodechange
endif
if trailsmode = 1 then ' if bypass button was not held long enough go to sub to toggle between on/off
gosub trailsbypass
elseif trailsmode = 0 then
gosub normalbypass
endif
return
trailmodechange: ' subroutine that occurs when bypass button is held long enough to change between normal or trails mode
if trailsmode = 1 then
trailsmode = 0
elseif trailsmode = 0 then
trailsmode = 1
endif
for z = 1 to 5
tempoLED = 1
pause 100
tempoLED = 0
pause 100
next z
goto main
normalbypass: ' subroutine for normal bypass
if bypassLED = 0 then
fetA = 1
fetB = 1
fetC = 0
bypassLED = LEDon
elseif bypassLED = 1 then
fetA = 0
fetB = 0
fetC = 1
bypassLED = 0
endif
return
trailsbypass: 'subroutine for trails bypass
if bypassLED = 0 then
fetA = 1
fetB = 1
fetC = 0
bypassLED = LEDon
elseif bypassLED = 1 then
fetA = 0
fetB = 1
fetC = 1
bypassLED = LEDoff
endif
return
bypassbuttonrelease: ' debounce subroutine when bypass button is pressed
do until bypassbutton = 1
pause 10
loop
return
movedigipot:
CS=0
shiftout SDI, SCK, 1, [00000000,x] ' move wiper A
shiftout SDI, SCK, 1, [00010000,x] 'move wiper B
CS=1
return
readpot:
adcin 2,x 'read voltage of "delay time" pot
return
end
Bookmarks