Version:0.9 StartHTML:0000000105 EndHTML:0000219480 StartFragment:0000001499 EndFragment:0000219464 mikroIDE
#include "internal_adc.h"

unsigned int test_count;

//control variables
unsigned int POT_delay_time;

unsigned int POT_mod_speed;
unsigned int POT_mod_depth;

unsigned int POT_direction;
unsigned int POT_confusion;
unsigned int direction_pulse_count;

unsigned long POT_temp1;
unsigned long POT_temp2;

unsigned int POT_ring_speed=1024;
unsigned int POT_ring_depth=0;
unsigned int POT_ring_depth_i=511;
signed int ring_table_int;


unsigned int POT_degrade=0;
unsigned int degrade_count=0;

bit BOOL_can_record;
bit BOOL_changed_range;


signed char SENS_ring_sens;
//sbit PIN_ring_sens at RF0_bit;           //because reasons, this won't work anymore
signed char PIN_ring_sens;        //OMG HACK

sbit PIN_relay_1 at RF1_bit;
sbit PIN_relay_2 at RE2_bit;
sbit PIN_bypass at RE3_bit;
unsigned int bypass_count=0;
unsigned int bypass_state=1;
unsigned int bypass_state_change=1;

sbit PIN_modsw at RE4_bit;

sbit PIN_range_1 at RB14_bit;
sbit PIN_range_2 at RB15_bit;
sbit PIN_range_3 at RF4_bit;
//sbit PIN_range_4 at RF5_bit;



sbit PIN_softsw at RD8_bit;
sbit PIN_hold at RE0_bit;
unsigned int hold_count=0;
unsigned int hold_state=0;
unsigned int hold_state_change=0;
unsigned int hold_enabled=0;

unsigned int fade_state=0;
unsigned int fade_event_count=200;
unsigned long int fade_amount=100;
unsigned int rev_fade_event_count=200;
unsigned long int rev_fade_amount=100;

sbit PIN_bypassled at RD5_bit;
sbit PIN_softled at RD11_bit;
sbit PIN_modled_1 at RE6_bit;
sbit PIN_modled_2 at RE7_bit;
//unsigned char modled_state=0;
//unsigned char modled_state_count=0;
unsigned int BOOL_mod_mode;
//unsigned int BOOL_mod_changed=0;



//sampling variables
unsigned int adc_sample;
signed int adc_value;
signed int dac_value;
//signed int current_sample;
//signed long int audio_sample_long;
//signed int audio_sample;

char MEM_WE=6;
unsigned long MEM_address;
unsigned long MEM_address_dac;
unsigned long MEM_address_range;


//modulation
unsigned char sine_table[256] = {128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,128,124,121,118,115,112,109,106,103,99,96,93,90,87,84,81,79,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,19,18,16,15,13,12,10,9,8,7,6,5,4,3,3,2,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,3,3,4,5,6,7,8,9,10,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,79,81,84,87,90,93,96,99,103,106,109,112,115,118,121,124};
unsigned char sine_table_count;
unsigned char sine_table_count2;
unsigned int sine_table_int;
unsigned char sine_table_current;
unsigned long int sine_table_long;
unsigned int modulation=0;
signed long int dac_value_long;
signed long int dac_value_long_dry;
signed long int adc_value_long;

//output pins
sbit Chip_Select_DAC at LATD10_bit;
sbit Chip_Select_ADC at LATE5_bit;
sbit RAM1_CS at LATD4_bit;


//misc
char buffer;
//sbit LED at LATG9_bit;
//sbit LED2 at LATE7_bit;
//signed int temp_headroom_high;
char ADC_turn=0;
unsigned int temp_count=0;
unsigned long temp_long;
//unsigned long temp_long_count=0;




//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################

//sample audio from external ADC
void ADC_Input() {
     DisableInterrupts();
     
     Chip_Select_ADC = 1;
     //delay_us(1);              //needed?
     Chip_Select_ADC = 0;
     
     delay_us(2);                 //needed?
     adc_sample = SPI2BUF;      //actual read
     SPI2BUF = adc_sample;      //refresh

     adc_sample.F15 = 0;
     adc_sample.F14 = 0;
     adc_sample.F13 = 0;

     adc_value = adc_sample - 4096;     //0 bias    /4075
     adc_value = adc_value << 3;

     //if (adc_value > 32000) {LED = 1;}
     //if (adc_value < -32000) {LED2 = 1;}
     
     EnableInterrupts();
}

//output audio to external DAC
void DAC_Output(unsigned int valueDAC) {
     DisableInterrupts();
     Chip_Select_DAC = 0;
     SPI3_Write(valueDAC);
     Chip_Select_DAC = 1;
     EnableInterrupts();
}

//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################

//write to mem
//262,144 possible samples
void MEM_Write(unsigned long MEM_address, signed int MEM_sample) {
     unsigned int MEM_cmd_add_1, MEM_cmd_add_2;
     
     MEM_address <<= 1;                        //double address for int sample length
     MEM_cmd_add_1 = MEM_address >> 16;    //isolate address lsb
     MEM_cmd_add_1.F8 = 0;                  //sequential write command
     MEM_cmd_add_1.F9 = 1;
     MEM_cmd_add_2 = MEM_address;           //address middle and msb
     
     DisableInterrupts();
     RAM1_CS = 0;
     SPI3_Write(MEM_cmd_add_1);
     SPI3_Write(MEM_cmd_add_2);
     SPI3_Write(MEM_sample);
     RAM1_CS = 1;
     EnableInterrupts();
}

//read mem
unsigned int MEM_Read(unsigned long MEM_address) {
     unsigned int MEM_cmd_add_1, MEM_cmd_add_2;
     signed int MEM_value;
     
     MEM_address <<= 1;                        //double address for int sample length
     MEM_cmd_add_1 = MEM_address >> 16;    //isolate address lsb
     MEM_cmd_add_1.F8 = 1;                  //sequential read command
     MEM_cmd_add_1.F9 = 1;
     MEM_cmd_add_2 = MEM_address;           //address middle and msb

     DisableInterrupts();
     RAM1_CS = 0;
     SPI3_Write(MEM_cmd_add_1);
     SPI3_Write(MEM_cmd_add_2);
     MEM_value = SPI3_Read(buffer);
     MEM_value <<= 1;
     RAM1_CS = 1;
     EnableInterrupts();
     
     return MEM_value;
}

//clear memory
void MEM_Clear(unsigned long MEM_address) {
     unsigned int MEM_cmd_add_1, MEM_cmd_add_2;
     unsigned long MEM_address_count;
     MEM_address_count = 0;
     
     MEM_cmd_add_1 = 0;
     MEM_cmd_add_1.F9 = 1;                  //sequential write command
     MEM_cmd_add_2 = 0;

     DisableInterrupts();
     RAM1_CS = 0;
     SPI3_Write(MEM_cmd_add_1);
     SPI3_Write(MEM_cmd_add_2);
     while (MEM_address_count < MEM_address) {
         SPI3_Write(0);
         MEM_address_count++;
     }
     RAM1_CS = 1;
     EnableInterrupts();
}


 
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################


void Sampling_loop() iv IVT_TIMER_1 ilevel 7 ics ICS_SRS {
     DisableInterrupts();
     T1IF_bit = 0;             // reset timer
     

     //bidirectional address counter
    if (SENS_ring_sens == 1) {                                    //if sens is forward
        if (MEM_address >= MEM_address_range) {
            MEM_address = 0;
        } else {
            MEM_address = MEM_address + SENS_ring_sens;
        }
        MEM_address_dac = MEM_address + SENS_ring_sens;
        if (MEM_address_dac > MEM_address_range) {
            MEM_address_dac = 0;
        }
    } else {                                                     //if sens is backward
        if (MEM_address == 1) {
            MEM_address = MEM_address_range;
        } else {
            MEM_address = MEM_address + SENS_ring_sens;
        }
        MEM_address_dac = MEM_address + SENS_ring_sens;
        if (MEM_address_dac == 0) {
            MEM_address_dac = MEM_address_range;
        }
    }

        
        
    //sampling
    ADC_Input();
     
     

    //moving into hold mode
    if (fade_state == 1) {
        if (fade_event_count > 100) {                    //fade out event
           adc_value_long = adc_value;
           adc_value_long = adc_value_long * fade_amount;
           adc_value_long = adc_value_long / 100;
           adc_value = adc_value_long;
           MEM_Write(MEM_address, adc_value);
           fade_amount--;
        } else if (fade_event_count == 100) {            //hold point event
           adc_value = 0;
           MEM_Write(MEM_address, adc_value);
        } else if (fade_event_count < 100 && fade_event_count > 0) {             //fade in event
           adc_value = MEM_Read(MEM_address);
           adc_value_long = adc_value;
           adc_value_long = adc_value_long * fade_amount;
           adc_value_long = adc_value_long / 100;
           adc_value = adc_value_long;
           MEM_Write(MEM_address, adc_value);
           fade_amount++;
        } else if (fade_event_count == 0) {             //end event
            fade_state = 0;
            fade_amount = 100;
            fade_event_count = 200;
            hold_enabled = 1;
        }
        fade_event_count--;
    }

    //moving out of hold mode
    if (fade_state == 2) {
        if (fade_event_count > 100) {                    //fade out event
           adc_value_long = dac_value;
           adc_value_long = adc_value_long * fade_amount;
           adc_value_long = adc_value_long / 100;
           dac_value = adc_value_long;
           MEM_Write(MEM_address, dac_value);
           fade_amount--;
        } else if (fade_event_count == 100) {            //hold point event
           dac_value = 0;
           MEM_Write(MEM_address, dac_value);
        } else if (fade_event_count < 100 && fade_event_count > 0) {             //fade in event
           adc_value_long = adc_value;
           adc_value_long = adc_value_long * fade_amount;
           adc_value_long = adc_value_long / 100;
           adc_value = adc_value_long;
           MEM_Write(MEM_address, adc_value);
           fade_amount++;
        } else if (fade_event_count == 0) {             //end event
            fade_state = 0;
            fade_amount = 100;
            fade_event_count = 200;
            hold_enabled = 0;
        }
        fade_event_count--;
    }
    
    
    
     //if not in hold mode, write to memory
     if (hold_enabled == 0) {
        MEM_Write(MEM_address, adc_value);
     }



     //memory read  / degrade
     if (degrade_count >= POT_degrade) {
         dac_value = MEM_Read(MEM_address_dac);
         degrade_count = 0;
     } else {
         degrade_count = degrade_count + 1;
     }



     //variable prep
     ring_table_int = sine_table_current - 128;                            //turn unsigned osc value into signed
     dac_value_long = dac_value;                                           //move audio to 32bit integer for ring modulation
     dac_value_long_dry  = dac_value;                                      //move audio to another 32bit integer for blend

     //ring modulation
     dac_value_long = dac_value_long * ring_table_int;                     //multiply audio by osc value (-128 to 128)
     dac_value_long = dac_value_long / 256;                                //divide result by 256

       //blending
       dac_value_long_dry = ((dac_value_long_dry * POT_ring_depth_i) / 1023);   //digitally crossfade dry with wet
       dac_value_long = ((dac_value_long * POT_ring_depth) / 511);                   //511
       dac_value_long = dac_value_long + dac_value_long_dry;
       //dac_value = dac_value_long << 1;                                         //?????     must have been drunk
       dac_value = dac_value_long;


     //confusion/direction fade events
     if (fade_state == 3) {
        if (rev_fade_event_count > 100) {                    //fade out event
           adc_value_long = dac_value;
           adc_value_long = adc_value_long * rev_fade_amount;
           adc_value_long = adc_value_long / 100;
           dac_value = adc_value_long;
           rev_fade_amount--;
        } else if (rev_fade_event_count == 100) {            //mid point event
           dac_value = 0;
           if (PIN_ring_sens == 1) {
              if (SENS_ring_sens == -1) {
                 MEM_address = MEM_address + 1;
              }
              SENS_ring_sens = 1;
           } else {
              if (SENS_ring_sens == 1) {
                 MEM_address = MEM_address - 1;
              }
              SENS_ring_sens = -1;
           }
        } else if (rev_fade_event_count < 100 && rev_fade_event_count > 0) {             //fade in event
           adc_value_long = dac_value;
           adc_value_long = adc_value_long * rev_fade_amount;
           adc_value_long = adc_value_long / 100;
           dac_value = adc_value_long;
           rev_fade_amount++;
        } else if (rev_fade_event_count == 0) {             //end event
            fade_state = 0;
            rev_fade_amount = 100;
            rev_fade_event_count = 200;
        }
        rev_fade_event_count--;
    }


     //playback
     DAC_Output(dac_value);
     
     //need audio-rate timer control/modulation for some inane reason
     PR1 = POT_delay_time + modulation;
     


     EnableInterrupts();
}

//####################################################################################################################################################################



//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################

//low speed timer  -  2ms
void UI_Functions() iv IVT_TIMER_2 ilevel 7 ics ICS_SRS {
     DisableInterrupts();
     T2IF_bit = 0;             // reset timer


     if (PIN_ring_sens == 1) {
        if (SENS_ring_sens == -1 && fade_state == 0) {
            fade_state = 3;
        }
     } else {
        if (SENS_ring_sens == 1 && fade_state == 0) {
            fade_state = 3;
        }
     }


//####################################################################################################################################################################


//ridiculous ADC turn thing to compensate for ADC slowness
if (ADC_turn == 0) {
   InitADC(2);

} else if (ADC_turn == 1) {
   temp_long = GetADC(void);
   temp_long = temp_long * 326;
   temp_long = temp_long / 100;
   POT_delay_time = temp_long + 1110;

} else if (ADC_turn == 2) {
   InitADC(3);


} else if (ADC_turn == 3) {
   POT_degrade = GetADC(void);
   POT_degrade = POT_degrade >> 4;

} else if (ADC_turn == 4) {
   InitADC(4);

} else if (ADC_turn == 5) {
   if (BOOL_mod_mode == 0) {
       POT_mod_speed = GetADC(void);
       POT_mod_speed = POT_mod_speed << 1;
       PR3 = POT_mod_speed + 256;
   } else {
       POT_ring_speed = GetADC(void);
       POT_ring_speed = POT_ring_speed + 60;
       PR5 = POT_ring_speed << 2;
   }

} else if (ADC_turn == 6) {
   InitADC(5);


} else if (ADC_turn == 7) {
   if (BOOL_mod_mode == 0) {                 //if modulation mode
       POT_mod_depth = GetADC(void);
       POT_mod_depth = POT_mod_depth >> 2;
       POT_ring_depth = 0;
       POT_ring_depth_i = 1023;
   } else {                                  //if ringmod mode
      POT_ring_depth = GetADC(void);
      POT_ring_depth_i = 1023 - POT_ring_depth;
      POT_ring_depth >> 3;
      POT_ring_depth_i >> 3;
      POT_mod_depth = 0;
   }

} else if (ADC_turn == 8) {
   InitADC(0);

} else if (ADC_turn == 9) {

   POT_direction = GetADC(void);

   POT_direction = POT_direction - 32;
   if (POT_direction > 60000) {POT_direction = 0;}
   if (POT_direction > 960) {POT_direction = 960;}

} else if (ADC_turn == 10) {
   InitADC(1);

} else if (ADC_turn == 11) {

   POT_confusion = GetADC(void);
   POT_confusion = POT_confusion * 19;
   POT_confusion = POT_confusion + 1200;
   
}



//ADC turn thing continued
if (ADC_turn == 12) {
     ADC_turn = 0;
   } else {
     ADC_turn++;
}


//####################################################################################################################################################################


/*
//range switching
if (PIN_range_1 == 1) {
    if (MEM_address_range != 3924) {
       MEM_address_range = 3924;
       BOOL_changed_range = 1;
    }
} else if (PIN_range_2 == 1) {
    if (MEM_address_range != 15750) {
       MEM_address_range = 15750;
       BOOL_changed_range = 1;
    }
} else if (PIN_range_3 == 1) {
    if (MEM_address_range != 63000) {
       MEM_address_range = 63000;
       BOOL_changed_range = 1;
    }
} else if (PIN_range_4 == 1) {
    if (MEM_address_range != 252000) {
       MEM_address_range = 252000;
       BOOL_changed_range = 1;
    }
}
*/

//range switching
if (PIN_range_1 == 1) {
    if (MEM_address_range != 3924) {
       MEM_address_range = 3924;
       BOOL_changed_range = 1;
    }
}

if (PIN_range_2 == 1) {
    if (MEM_address_range != 15750) {
       MEM_address_range = 15750;
       BOOL_changed_range = 1;
    }
}

if (PIN_range_3 == 1) {
    if (MEM_address_range != 63000) {
       MEM_address_range = 63000;
       BOOL_changed_range = 1;
    }
}

if (PIN_range_1 == 0 && PIN_range_2 == 0 && PIN_range_3 == 0) {
    if (MEM_address_range != 252000) {
       MEM_address_range = 252000;
       BOOL_changed_range = 1;
    }
}





if (BOOL_changed_range == 1) {
   MEM_Clear(MEM_address_range);
   BOOL_changed_range = 0;
}


//####################################################################################################################################################################

    //bypass debounce
    if (PIN_bypass == 1) {              //check if button pressed
       if (bypass_count == 16) {
         if (bypass_state == 0) {       //toggle bypass
            bypass_state = 1;
         } else {
            bypass_state = 0;
         }
         bypass_state_change = 1;
       }
       bypass_count++;
    } else {
       bypass_count = 0;                //reset if button depressed
    }
    
    //bypass toggle
    if (bypass_state_change == 1) {
    if (bypass_state == 1) {
       PIN_bypassled = 1;
       PIN_relay_1 = 1;
       PIN_relay_2 = 0;
       delay_ms(20);
       PIN_relay_1 = 0;
       PIN_relay_2 = 0;
    } else {
       PIN_bypassled = 0;
       PIN_relay_1 = 0;
       PIN_relay_2 = 1;
       delay_ms(20);
       PIN_relay_1 = 0;
       PIN_relay_2 = 0;
    }
    bypass_state_change = 0;
    }
   
//####################################################################################################################################################################

   
    //soft debounce
    if (PIN_hold == 1) {              //check if button pressed
       if (hold_count == 16) {
         if (hold_state == 0) {       //toggle bypass
            hold_state = 1;
         } else {
            hold_state = 0;
         }
         hold_state_change = 1;
       }
       hold_count++;
    } else {
       hold_count = 0;                //reset if button depressed
    }
   
    //hold toggle
    if (hold_state_change == 1) {
    

    if (hold_state == 1) {
       PIN_softled = 1;
       //hold_enabled = 1;
       fade_state = 1;
    } else {
       PIN_softled = 0;
       //hold_enabled = 0;
       fade_state = 2;
    }

    hold_state_change = 0;

    }
   
//####################################################################################################################################################################


if (PIN_modsw == 0) {
        BOOL_mod_mode = 0;
        PIN_modled_1 = 1;
        PIN_modled_2 = 0;
} else {
        BOOL_mod_mode = 1;
        PIN_modled_1 = 0;
        PIN_modled_2 = 1;
}

/*
//temp
if (PIN_softsw == 1) {
        PIN_modled_1 = 1;
        PIN_modled_2 = 0;
} else {
        PIN_modled_1 = 0;
        PIN_modled_2 = 1;
}
*/


//####################################################################################################################################################################

//reset watchdog timer
//WDTCLR_bit = 1;

     EnableInterrupts();
}



//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################

//modulation
void modulation_timer() iv IVT_TIMER_3 ilevel 7 ics ICS_SRS {
    DisableInterrupts();
    
    T3IF_bit = 0;
    sine_table_long = sine_table[sine_table_count];
    sine_table_count = sine_table_count + 1;
    
    sine_table_long = sine_table_long * POT_mod_depth;
    sine_table_long = sine_table_long / 256;
    modulation = sine_table_long;
    
    EnableInterrupts();
}

void carrier_timer() iv IVT_TIMER_5 ilevel 7 ics ICS_SRS {
  DisableInterrupts();
  T5IF_bit = 0;
    sine_table_current = sine_table[sine_table_count2];
    sine_table_count2 = sine_table_count2 + 4;
  EnableInterrupts();
}

//direction pulse timer
void direction_pulse_timer() iv IVT_TIMER_4 ilevel 7 ics ICS_SRS {
  T4IF_bit         = 0;
  DisableInterrupts();

  if (direction_pulse_count < POT_direction) {
     //PIN_bypassled = 1;
     PIN_ring_sens = 1;
  } else {
     //PIN_bypassled = 0;
     PIN_ring_sens = 0;
  }
  
  if (direction_pulse_count == 959) {
     direction_pulse_count = 0;
  } else {
     direction_pulse_count++;
  }
  
  PR4 = POT_confusion;

  EnableInterrupts();
}


//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################


void main() {
  //UART3_Init(57600);
  SPI2_Init_Advanced(_SPI_MASTER, _SPI_16_BIT, 32, _SPI_SS_DISABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_ACTIVE_2_IDLE);
  SPI3_Init_Advanced(_SPI_MASTER, _SPI_16_BIT, 2, _SPI_SS_DISABLE, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_ACTIVE_2_IDLE);

  DDPCONbits.JTAGEN = 0;
  
  //analog pins
  AD1PCFG = 0xFCCF;   //11111100 11001111;
  TRISB3_bit = 1;     //pot ADC as input
  TRISB5_bit = 1;     //pot ADC as input
  
  TRISD10_bit = 0; //DAC CS as output
  TRISE5_bit = 0; //ADC CS as output
  
  //TRISG9_bit = 0;    //LED
  //TRISE7_bit = 0;    //LED
  TRISD4_bit = 0;  //RAM CS as output
  TRISG6_bit = 0;

  //mod led
  TRISE6_bit = 0;
  TRISE7_bit = 0;
  //PIN_modled_1 = 0;
  //PIN_modled_2 = 0;

  //bypass led
  TRISD5_bit = 0;
  PIN_bypassled = 0;
  
  //soft led
  TRISD11_bit = 0;
  PIN_softled = 0;
  
  //relay
  TRISE2_bit = 0;
  TRISF1_bit = 0;

  
  
  Chip_Select_DAC = 1;
  Chip_Select_ADC = 1;
  RAM1_CS = 1;
  
  //default bypassed
  PIN_relay_1 = 1;
  PIN_relay_2 = 0;
  delay_ms(20);
  PIN_relay_1 = 0;
  PIN_relay_2 = 0;
  
  
/*
//sampling timer
ON__T1CON_bit = 0;        // disable Timer1
  TMR1 = 0;                 // reset timer value to zero
  //PR1 = 1110;              // 13.9us 72khz
  PR1 = 4440;
  T1IP0_bit = 1;            // set interrupt
  T1IP1_bit = 1;            // priority
  T1IP2_bit = 1;            // to 7
  TCKPS0_bit = 0;           // Set Timer Input Clock
  TCKPS1_bit = 0;           // Prescale value to 1:1
  T1IE_bit = 1;             // Enable Timer1 Interrupt
  ON__T1CON_bit = 1;        // Enable Timer1
*/

  T1CON         = 0x8000;
  T1IE_bit         = 1;
  T1IF_bit         = 0;
  T1IP0_bit         = 1;
  T1IP1_bit         = 1;
  T1IP2_bit         = 1;
  PR1                 = 4440;
  TMR1                 = 0;


//low speed timer
  T2CON         = 0x8010;
  T2IE_bit         = 1;
  T2IF_bit         = 0;
  T2IP0_bit         = 1;
  T2IP1_bit         = 1;
  T2IP2_bit         = 1;
  PR2                 = 40000;
  TMR2                 = 0;

  

//modulation timer
  T3CON         = 0x8070;
  T3IE_bit         = 1;
  T3IF_bit         = 0;
  T3IP0_bit         = 1;
  T3IP1_bit         = 1;
  T3IP2_bit         = 1;
  PR3                 = 62500;   //62500
  TMR3                 = 0;


//direction pulse timer
  T4CON         = 0x8000;
  T4IE_bit         = 1;
  T4IF_bit         = 0;
  T4IP0_bit         = 1;
  T4IP1_bit         = 1;
  T4IP2_bit         = 1;
  PR4                 = 1200;           //1200-20800
  TMR4                 = 0;


    //sine ringmod timer
  T5CON         = 0x8000;
  T5IE_bit         = 1;
  T5IF_bit         = 0;
  T5IP0_bit         = 1;
  T5IP1_bit         = 1;
  T5IP2_bit         = 1;
  PR5                 = 1000;
  TMR5                 = 0;
  
  
  
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################

//defaults and setup

delay_ms(10);


//RAM write-enable
RAM1_CS = 0;
SPI3_Write(MEM_WE << 8);
RAM1_CS = 1;

//control variables
POT_delay_time = 1024;

POT_mod_speed = 1024;
POT_mod_depth = 0;
//POT_ring_speed = 1024;
//POT_ring_depth = 0;



if (PIN_modsw == 0) {
        BOOL_mod_mode = 0;
        PIN_modled_1 = 1;
        PIN_modled_2 = 0;
} else {
        BOOL_mod_mode = 1;
        PIN_modled_1 = 0;
        PIN_modled_2 = 1;
}




MEM_address_range = 252000;
MEM_address = 1;
//MEM_address_offset = 0;

BOOL_changed_range = 0;

BOOL_can_record = 1;          //rec enabled
SENS_ring_sens = 1;           //forward
PIN_ring_sens = 1;

EnableInterrupts();       // Enable all interrupts


//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
//####################################################################################################################################################################
   
   /*
   while (1) {
   //do nothing

        PIN_bypassled = ~PIN_bypassled;
        PIN_softled = ~PIN_softled;
        //LED = ~LED;
        delay_ms(500);


  }
  */
  
  
  }