Welcome, Guest
Username: Password: Remember me

TOPIC: How to start programming pedalSHIELD

How to start programming pedalSHIELD 2 years 6 months ago #850

This track with my band and arduino sinewave effect! Thank's!!

www.dropbox.com/s/8mwm8lps9soogfw/demokratos%20MBE.mov?dl=0
The administrator has disabled public write access.

How to start programming pedalSHIELD 2 years 6 months ago #852

  • Ray
  • Ray's Avatar
  • NOW ONLINE
  • Moderator
  • Posts: 695
  • Thank you received: 146
  • Karma: 41
Thanks for contributing! I love the background video too, I have also posted your link into the sinewave generator topic:
www.electrosmash.com/forum/software-peda...enerator?lang=en#851
The administrator has disabled public write access.

How to start programming pedalSHIELD 4 months 1 week ago #1863

  • Matheus
  • Matheus's Avatar
  • OFFLINE
  • New Member
  • Posts: 6
  • Karma: 0
Hello. In the line: while ((ADC -> ADC_ISR & 0x1CC0)! = 0x1CC0); // expects ADC conversion 0, 1, 8, 9, 10 to complete.
Add a conversion in ADC 6 and 7. How do I do this?
Last Edit: 4 months 1 week ago by Matheus.
The administrator has disabled public write access.

How to start programming pedalSHIELD 4 months 1 week ago #1864

  • Ray
  • Ray's Avatar
  • NOW ONLINE
  • Moderator
  • Posts: 695
  • Thank you received: 146
  • Karma: 41
It's a bit tricky:
First of all, in the Arduino DUE the ADCs on the board pinout are not the same as on the uC pinout if you have a look to this image:

Arduino-Due-Pinout.png


You will see that they are like:
  • A0 connected to AD7
  • A1 connected to AD6
  • A2 connected to AD5
  • A3 connected to AD4
  • A4 connected to AD3
  • A5 connected to AD2
  • A6 connected to AD1
  • A7 connected to AD0
  • A8 connected to AD10
  • A9 connected to AD11
  • A10 connected to AD12
  • A11 connected to AD13
So if we want to enable the ADCs named 0,1,8,9 and 10 they are in fact AD7, AD6, AD10, AD11, AD12


If you see in the code the ADC configuration, you have the line:
ADC->ADC_CHER=0x1CC0;  // Enable ADC channels 0,1,8,9 and 10
Checking the uC datasheet:
image.dfrobot.com/image/data/DFR0220/AT9...full%20datasheet.pdf
On page 1250 explains the ADC_CHER register.
With 0x1CC0 in binary we have: 00011100 11000000‬ enabling AD7, AD6, AD10, AD11, AD12

If you want to also enable A6 and A7 (which are AD0 and AD1 if you check the image above) you would need to do:
ADC->ADC_CHER=0x1CC3;  // Enable ADC channels 0,1,8,9 and 10
and also
while((ADC->ADC_ISR & 0x1CC3)!=0x1CC3);// wait for ADC 0, 1, 8, 9, 10 conversion complete.
and finally read the ADCs.
Last Edit: 4 months 1 week ago by Ray.
The administrator has disabled public write access.
The following user(s) said Thank You: Matheus

How to start programming pedalSHIELD 4 months 1 week ago #1866

  • Matheus
  • Matheus's Avatar
  • OFFLINE
  • New Member
  • Posts: 6
  • Karma: 0
Yes, thank you !
I had just done the part under "while," now it's starting to make sense.
void loop ()
{
  // Read the ADCs
  while ((ADC -> ADC_ISR & 0x1CC3)! = 0x1CC3); // expects the conversion of ADC 0, 1, 6, 7, 8, 9, 10 to complete.
  in_ADC0 = ADC -> ADC_CDR [7] // read data from ADC0
  in_ADC1 = ADC -> ADC_CDR [6] // read data from ADC1
  POT0 = ADC -> ADC_CDR [10] // read data from ADC8
  POT1 = ADC -> ADC_CDR [11] // read data from ADC9
  POT2 = ADC -> ADC_CDR [12] // read data from ADC10
  POT3 = ADC -> ADC_CDR [0]; // read data from ADC7
  POT4 = ADC -> ADC_CDR [1]; // read data from ADC6
  }

Without wanting to bother, but already bothering kk, I would like to know: if the "if" function is used 4 times can they be checked at the same time?
And 2 of them can be executed at the same time?

I'm trying to make an alternative pedal for a college job and I'm using the pedalshield programming as a base (of course I'll cite it as a reference and with all the credits). I intend to make the pedal with 4 effects. 2 of them can be used simultaneously and can be combined in parallel or in series. And for this I feel that here I will find help to make doubts and to progress with this :)
If I can and will work, as expected, I promise to post here on the site with all the details of execution for whoever wants to mount it.
Last Edit: 4 months 1 week ago by Matheus.
The administrator has disabled public write access.

How to start programming pedalSHIELD 4 months 1 week ago #1870

  • Ray
  • Ray's Avatar
  • NOW ONLINE
  • Moderator
  • Posts: 695
  • Thank you received: 146
  • Karma: 41
if the "if" function is used 4 times can they be checked at the same time?
Which "if" are you referring to? I am not sure about that. Could you show a code with that "if"?
And 2 of them can be executed at the same time?
If I understood well, yes, you can read the analog input and then treat the signal differently and add them together at the end. Nobody tried yet, but should be ok.
The administrator has disabled public write access.
The following user(s) said Thank You: Matheus

How to start programming pedalSHIELD 4 months 1 week ago #1872

  • Matheus
  • Matheus's Avatar
  • OFFLINE
  • New Member
  • Posts: 6
  • Karma: 0
Below is what I am referring to:


void loop ()
{
  // Read the ADCs
  while ((ADC -> ADC_ISR & 0x1CC3)! = 0x1CC3); // expects the conversion of ADC 0, 1, 6, 7, 8, 9, 10 to complete.
  in_ADC0 = ADC -> ADC_CDR [7] // read data from ADC0
  in_ADC1 = ADC -> ADC_CDR [6] // read data from ADC1
  POT0 = ADC -> ADC_CDR [10] // read data from ADC8
  POT1 = ADC -> ADC_CDR [11] // read data from ADC9
  POT2 = ADC -> ADC_CDR [12] // read data from ADC10
  POT3 = ADC -> ADC_CDR [0]; // read data from ADC7
  POT4 = ADC -> ADC_CDR [1]; // read data from ADC6
  }
 
void TC4_Handler ()
{{
  // We need to get the status to clear it and allow the interrupt to fire again
  TC_GetStatus (TC1, 1);
  
  if (effect_1 == HIGH) // EFFECT 1: Symmetric distortion
  {
 // digitalWrite (LED, LOW);
    upper_threshold = map (POT0, 0, 4095, 4095,! POT0);
    lower_threshold = map (POT0, 0, 4095, 0000, POT0);
    
  // upper_threshold0 =! upper_threshold;
  // lower_threshold0 =! lower_threshold;
 
  if (in_ADC0> = upper_threshold) in_ADC0 = upper_threshold;
  else if (in_ADC0 <lower_threshold) in_ADC0 = lower_threshold;
  // if (in_ADC1> = upper_threshold) in_ADC1 = upper_threshold;
  // else if (in_ADC1 <lower_threshold) in_ADC1 = lower_threshold;
  
  // adjust the volume with POT2 with constant intensity
  out_DAC0 = map (in_ADC0, lower_threshold, upper_threshold, 1, POT4);
 // out_DAC1 = map (in_ADC1, lower_threshold, upper_threshold, 1, POT2);
  
  // Record the DACs
  dacc_set_channel_selection (DACC_INTERFACE, 0) // selects DAC channel 0
  dacc_write_conversion_data (DACC_INTERFACE, out_DAC0) // write to DAC 0
  // dacc_set_channel_selection (DACC_INTERFACE, 1) // select DAC channel 1
  // dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
  }
  
  if (effect_2 == HIGH) // EFFECT 2: Clean.
  {
    // Add volume feature with POT4
    out_DAC0 = map (in_ADC0,0,4095,1, POT4);
    // out_DAC1 = map (in_ADC1,0,4095,1, POT4);
    
    // Write the DACs
    dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
    dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in DAC 0
    // dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
    // dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
    }
    
    if (effect_3 == HIGH) // EFFECT 3: Delay.
  {
    // digitalWrite (LED, LOW);
    
  // Store current readings
  // sDelayBuffer0 [DelayCounter] = in_ADC0;
  sDelayBuffer1 [DelayCounter] = in_ADC1;
  
  // Set the delay depth based on the position of the pot1. $$$$
  Delay_Depth = map (POT2 >> 2.0,1023,1, MAX_DELAY);
  
  // Increse / reset delay counter.
  DelayCounter;
  if (DelayCounter> = Delay_Depth) DelayCounter = 0;
  // out_DAC0 = ((sDelayBuffer0 [DelayCounter]));
  out_DAC1 = ((sDelayBuffer1 [DelayCounter]));
  
  // Add volume feature
  // out_DAC0 = map (out_DAC0,0,4095,1, POT3);
  out_DAC1 = map (out_DAC1,0,4095,1, POT3);
  
  // Write the DACs
  // dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
  // dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in the DAC
  dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
  dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 0
  
  // Clear status allowing the interrupt to be triggered again.
  TC_GetStatus (TC1, 1);
  }}
  
  // void switch_handler ()
  
  // delayMicroseconds (100000); // debouncing protection
  // if (toggle_value! = digitalRead (TOGGLE)) effect;
  // delayMicroseconds (100000); // debouncing protection
    // toggle_value = digitalRead (TOGGLE);
    // if (effect == 1) effect = 0;
    // Delay_Depth = 300; // resets the variable.
    
    if (effect_4 == HIGH) // EFFECT 4: Tremolo.
    {
      // Store current readings in ECHO mode
      DelayBuffer_A [DelayCounter_A] = (in_ADC0 (DelayBuffer_A [DelayCounter_A])) >> 1;
      DelayBuffer_B [DelayCounter_B] = (in_ADC1 (DelayBuffer_B [DelayCounter_B])) >> 1;
      
      // Set the delay depth based on position POT0 and POT1.
      Delay_Depth_A = map (POT2 >> 3,0,512,1, MAX_DELAY_A);
      Delay_Depth_B = map (POT2 >> 3,0,512,1, MAX_DELAY_B);
      
      // Increse / reset delay counter.
      DelayCounter_A;
      DelayCounter_B;
      if (DelayCounter_A> = Delay_Depth_A) DelayCounter_A = 0;
      if (DelayCounter_B> = Delay_Depth_B) DelayCounter_B = 0;
      
      // Calculate the output as the sum of DelayBuffer_A DelayBuffer_B
      // out_DAC0 = (DelayBuffer_A [DelayCounter_A]);
      out_DAC1 = (DelayBuffer_B [DelayCounter_B]);
      
      // Add volume feature based on pot3 position.
      // out_DAC0 = map (out_DAC0,0,4095,1, POT3);
      out_DAC1 = map (out_DAC1,0,4095,1, POT3);
      
      // Write the DACs
      // dacc_set_channel_selection (DACC_INTERFACE, 0); //select DAC channel 0
       // dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in DAC 0
       dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
       dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
       }}


2 of these effects will have to work simultaneously. And I'd like to know if it's possible 2 "if" to run at the same time.
The administrator has disabled public write access.

How to start programming pedalSHIELD 4 months 5 days ago #1878

  • Ray
  • Ray's Avatar
  • NOW ONLINE
  • Moderator
  • Posts: 695
  • Thank you received: 146
  • Karma: 41
Yes, if you run the codes in parallel they should work, but you just need to make sure that the variables are not overwritten by the 2 processes at the same time.
The administrator has disabled public write access.
The following user(s) said Thank You: Matheus

How to start programming pedalSHIELD 4 months 3 days ago #1879

  • Matheus
  • Matheus's Avatar
  • OFFLINE
  • New Member
  • Posts: 6
  • Karma: 0
I also want help from you with this error that appears when I check:

C: \ Users \ mathe \ AppData \ Local \ Arduino15 \ packages \ arduino \ hardware \ sam \ 1.6.12 \ colors \ arduino \ syscalls_sam3.c: In the '_exit' function:

C: \ Users \ mathe \ AppData \ Local \ Arduino15 \ packages \ arduino \ hardware \ sam \ 1.6.12 \ colors \ arduino \ syscalls_sam3.c: 133: 24: warning: unused parameter 'status' [-Wunused-parameter ]

extern void _exit (int status)

^



No error appears in the code, so I do not know what it can be. Can you help me with this?






This is the full code I am using:

   int in_ADC0, in_ADC1; // variables for 2 values ​​of ADCs (ADC0, ADC1)
   int POT0, POT1, POT2, POT3, POT4, out_DAC0, out_DAC1; // variables for 5 pots (ADC6, ADC7, ADC8, ADC9, ADC10)
   // int LED = 3;
   // int FOOTSWITCH = 7;
   // int TOGGLE = 2;
   int sample, accumulator, count, LFO;

   int effect_1 = 2;
   int effect_2 = 3;
   int effect_3 = 4;
   int effect_4 = 5;
   
  // int toggle_value = 0;
  // int effect = 0;
   
   int upper_threshold, lower_threshold;
   
   #define MAX_DELAY 20000
   uint16_t sDelayBuffer0 [MAX_DELAY];
   uint16_t sDelayBuffer1 [MAX_DELAY];
   unsigned int DelayCounter = 0;
   unsigned int Delay_Depth = MAX_DELAY;
   
   // # define MAX_DELAY 500
   // # define MIN_DELAY 200
   unsigned int count_up = 1;
   int p;
   int switch_handler = 0;

  #define MAX_DELAY_A 10000
  #define MAX_DELAY_B 10000
  uint16_t DelayBuffer_A [MAX_DELAY_A];
  uint16_t DelayBuffer_B [MAX_DELAY_B];
  unsigned int DelayCounter_A = 0;
  unsigned int DelayCounter_B = 0;
  unsigned int Delay_Depth_A, Delay_Depth_B;
 
void setup ()
{
  // * turns the timer on the power management control * /
  pmc_set_writeprotect (false);
  pmc_enable_periph_clk (TC_ID4);
 
  // we want wavesel 01 with RC
  TC_Configure (TC1,1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2);
  TC_SetRC (TC1, 1, 238); // define <> interruption rate of 44.1 KHz
  TC_Start (TC1, 1);

   
  // activates the timer interrupts on the timer
  TC1 -> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS;
  TC1 -> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS;
 
  // * Enables interrupt on null vector interrupt handler * /
  // * TC4_IRQn where 4 is the timer number * timer channels (3) + channel number
  // (= (1 * 3) +1) for timer1 channel1 * /
  NVIC_EnableIRQ (TC4_IRQn);
  
  // ADC Configuration
  ADC -> ADC_MR | = 0x80; // DAC in free running mode.
  ADC -> ADC_CR = 2; // Initiates ADC conversion.
  ADC -> ADC_CHER = 0x1CC3; // Activate ADC channels 0 and 1.
  
  
  // DAC Configuration
  analogWrite (DAC0, 0); // Enable DAC0
  analogWrite (DAC1, 0); // Enable DAC0
  
  
 // set pin2 as an input and enable the internal pull-up resistor
 // pinMode (LED, OUTPUT);
 // pinMode (TOGGLE, INPUT_PULLUP);
 // attachInterrupt (TOGGLE, switch_handler, CHANGE);
 // pinMode (FOOTSWITCH, INPUT);
  }
 
void loop ()
{
  // Read the ADCs
  while ((ADC -> ADC_ISR & 0x1CC3)! = 0x1CC3); // expects the conversion of ADC 0, 1, 6, 7, 8, 9, 10 to complete.
  in_ADC0 = ADC -> ADC_CDR [7] // read data from ADC0
  in_ADC1 = ADC -> ADC_CDR [6] // read data from ADC1
  POT0 = ADC -> ADC_CDR [10] // read data from ADC8
  POT1 = ADC -> ADC_CDR [11] // read data from ADC9
  POT2 = ADC -> ADC_CDR [12] // read data from ADC10
  POT3 = ADC -> ADC_CDR [0]; // read data from ADC7
  POT4 = ADC -> ADC_CDR [1]; // read data from ADC6
  }
 
void TC4_Handler ()
{
  // We need to get the status to clear it and allow the interrupt to fire again
  TC_GetStatus (TC1, 1);
  
  if (effect_1 == HIGH) // EFFECT 1: Symmetric distortion
  {
   // digitalWrite (LED, LOW);
    upper_threshold = map (POT0, 0, 4095, 4095,! POT0);
    lower_threshold = map (POT0, 0, 4095, 0000, POT0);
    
  // upper_threshold0 =! upper_threshold;
  // lower_threshold0 =! lower_threshold;
 
  if (in_ADC0> = upper_threshold) in_ADC0 = upper_threshold;
  else if (in_ADC0 <lower_threshold) in_ADC0 = lower_threshold;
  // if (in_ADC1> = upper_threshold) in_ADC1 = upper_threshold;
  // else if (in_ADC1 <lower_threshold) in_ADC1 = lower_threshold;
  
  // adjust the volume with POT4 with constant intensity
  out_DAC0 = map (in_ADC0, lower_threshold, upper_threshold, 1, POT4);
  // out_DAC1 = map (in_ADC1, lower_threshold, upper_threshold, 1, POT4);
  
  // Record the DACs
  dacc_set_channel_selection (DACC_INTERFACE, 0) // selects DAC channel 0
  dacc_write_conversion_data (DACC_INTERFACE, out_DAC0) // write to DAC 0
  // dacc_set_channel_selection (DACC_INTERFACE, 1) // select DAC channel 1
  // dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
  }
  
  if (effect_2 == HIGH) // EFFECT 2: Clean.
  {
    // Addvolume feature with POT4
    out_DAC0 = map (in_ADC0,0,4095,1, POT4);
    // out_DAC1 = map (in_ADC1,0,4095,1, POT4);
    
    // Write the DACs
    dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
    dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in DAC 0
    // dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
    // dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
    }
    
    if (effect_3 == HIGH) // EFFECT 3: Delay.
  {
    // digitalWrite (LED, LOW);
    
  // Store current readings
  // sDelayBuffer0 [DelayCounter] = in_ADC0;
  sDelayBuffer1 [DelayCounter] = in_ADC1;
  
  // Set the delay depth based on the position of pot2.
  Delay_Depth = map (POT2 >> 2.0,1023,1, MAX_DELAY);
  
  // Increse / reset delay counter.
  DelayCounter ++;
  if (DelayCounter> = Delay_Depth) DelayCounter = 0;
  // out_DAC0 = ((sDelayBuffer0 [DelayCounter]));
  out_DAC1 = ((sDelayBuffer1 [DelayCounter]));
  
  // Add volume feature
  // out_DAC0 = map (out_DAC0,0,4095,1, POT3);
  out_DAC1 = map (out_DAC1,0,4095,1, POT3);
  
  // Write the DACs
  // dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
  // dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in the DAC
  dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
  dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 0
  
  // Clear status allowing the interrupt to be triggered again.
  TC_GetStatus (TC1, 1);
  }
  
  // void switch_handler ()
  
  // delayMicroseconds (100000); // debouncing protection
  // if (toggle_value! = digitalRead (TOGGLE)) ++ effect;
  // delayMicroseconds (100000); // debouncing protection
    // toggle_value = digitalRead (TOGGLE);
    // if (effect == 1) effect = 0;
    // Delay_Depth = 300; // resets the variable.
    
    if (effect_4 == HIGH) // EFFECT 4: Tremolo.
    {
      // Store current readings in ECHO mode
      DelayBuffer_A [DelayCounter_A] = (in_ADC0 + (DelayBuffer_A [DelayCounter_A])) >> 1;
      DelayBuffer_B [DelayCounter_B] = (in_ADC1 + (DelayBuffer_B [DelayCounter_B])) >> 1;
      
      // Set the delay depth based on position POT2 and POT2.
      Delay_Depth_A = map (POT2 >> 3,0,512,1, MAX_DELAY_A);
      Delay_Depth_B = map (POT2 >> 3,0,512,1, MAX_DELAY_B);
      
      // Increse / reset delay counter.
      DelayCounter_A ++;
      DelayCounter_B ++;
      if (DelayCounter_A> = Delay_Depth_A) DelayCounter_A = 0;
      if (DelayCounter_B> = Delay_Depth_B) DelayCounter_B = 0;
      
      // Calculate the output as the sum of DelayBuffer_A + DelayBuffer_B
      // out_DAC0 = (DelayBuffer_A [DelayCounter_A]);
      out_DAC1 = (DelayBuffer_B [DelayCounter_B]);
      
      // Add volume feature based on pot3 position.
      // out_DAC0 = map (out_DAC0,0,4095,1, POT3);
      out_DAC1 = map (out_DAC1,0,4095,1, POT3);
      
      // Write the DACs
      // dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
      // dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in DAC 0
      dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
      dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
      }}
The administrator has disabled public write access.

How to start programming pedalSHIELD 4 months 2 days ago #1883

  • Ray
  • Ray's Avatar
  • NOW ONLINE
  • Moderator
  • Posts: 695
  • Thank you received: 146
  • Karma: 41
The code has many errors, ";" missing, spaces in the wrong place, etc:
I have this compilable code, but I dont know if it works:
 int in_ADC0, in_ADC1; // variables for 2 values ​​of ADCs (ADC0, ADC1)
   int POT0, POT1, POT2, POT3, POT4, out_DAC0, out_DAC1; // variables for 5 pots (ADC6, ADC7, ADC8, ADC9, ADC10)
   // int LED = 3;
   // int FOOTSWITCH = 7;
   // int TOGGLE = 2;
   int sample, accumulator, count, LFO;
 
   int effect_1 = 2;
   int effect_2 = 3;
   int effect_3 = 4;
   int effect_4 = 5;
 
  // int toggle_value = 0;
  // int effect = 0;
 
   int upper_threshold, lower_threshold;
 
   #define MAX_DELAY 20000
   uint16_t sDelayBuffer0 [MAX_DELAY];
   uint16_t sDelayBuffer1 [MAX_DELAY];
   unsigned int DelayCounter = 0;
   unsigned int Delay_Depth = MAX_DELAY;
 
   // # define MAX_DELAY 500
   // # define MIN_DELAY 200
   unsigned int count_up = 1;
   int p;
   int switch_handler = 0;
 
  #define MAX_DELAY_A 10000
  #define MAX_DELAY_B 10000
  uint16_t DelayBuffer_A [MAX_DELAY_A];
  uint16_t DelayBuffer_B [MAX_DELAY_B];
  unsigned int DelayCounter_A = 0;
  unsigned int DelayCounter_B = 0;
  unsigned int Delay_Depth_A, Delay_Depth_B;
 
void setup ()
{
  // * turns the timer on the power management control * /
  pmc_set_writeprotect (false);
//  pmc_enable_periph_clk (TC_ID4);
 
  // we want wavesel 01 with RC
  TC_Configure (TC1,1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2);
  TC_SetRC (TC1, 1, 238); // define <> interruption rate of 44.1 KHz
  TC_Start (TC1, 1);
 
 
  // activates the timer interrupts on the timer
  TC1 -> TC_CHANNEL [1]. TC_IER = TC_IER_CPCS;
  TC1 -> TC_CHANNEL [1]. TC_IDR = ~ TC_IER_CPCS;
 
  // * Enables interrupt on null vector interrupt handler * /
  // * TC4_IRQn where 4 is the timer number * timer channels (3) + channel number
  // (= (1 * 3) +1) for timer1 channel1 * /
  NVIC_EnableIRQ (TC4_IRQn);
 
  // ADC Configuration
  ADC -> ADC_MR |= 0x80; // DAC in free running mode.
  ADC -> ADC_CR = 2; // Initiates ADC conversion.
  ADC -> ADC_CHER = 0x1CC3; // Activate ADC channels 0 and 1.
 
 
  // DAC Configuration
  analogWrite (DAC0, 0); // Enable DAC0
  analogWrite (DAC1, 0); // Enable DAC0
 
 
 // set pin2 as an input and enable the internal pull-up resistor
 // pinMode (LED, OUTPUT);
 // pinMode (TOGGLE, INPUT_PULLUP);
 // attachInterrupt (TOGGLE, switch_handler, CHANGE);
 // pinMode (FOOTSWITCH, INPUT);
  }
 
void loop ()
{
  // Read the ADCs
  while ((ADC -> ADC_ISR & 0x1CC3) != 0x1CC3); // expects the conversion of ADC 0, 1, 6, 7, 8, 9, 10 to complete.
  in_ADC0 = ADC -> ADC_CDR [7]; // read data from ADC0
  in_ADC1 = ADC -> ADC_CDR [6]; // read data from ADC1
  POT0 = ADC -> ADC_CDR [10]; // read data from ADC8
  POT1 = ADC -> ADC_CDR [11]; // read data from ADC9
  POT2 = ADC -> ADC_CDR [12]; // read data from ADC10
  POT3 = ADC -> ADC_CDR [0]; // read data from ADC7
  POT4 = ADC -> ADC_CDR [1]; // read data from ADC6
  }
 
void TC4_Handler ()
{
  // We need to get the status to clear it and allow the interrupt to fire again
  TC_GetStatus (TC1, 1);
 
  if (effect_1 == HIGH) // EFFECT 1: Symmetric distortion
  {
   // digitalWrite (LED, LOW);
    upper_threshold = map (POT0, 0, 4095, 4095,! POT0);
    lower_threshold = map (POT0, 0, 4095, 0000, POT0);
 
  // upper_threshold0 =! upper_threshold;
  // lower_threshold0 =! lower_threshold;
 
  if (in_ADC0 >= upper_threshold) in_ADC0 = upper_threshold;
  else if (in_ADC0 <lower_threshold) in_ADC0 = lower_threshold;
  // if (in_ADC1> = upper_threshold) in_ADC1 = upper_threshold;
  // else if (in_ADC1 <lower_threshold) in_ADC1 = lower_threshold;
 
  // adjust the volume with POT4 with constant intensity
  out_DAC0 = map (in_ADC0, lower_threshold, upper_threshold, 1, POT4);
  // out_DAC1 = map (in_ADC1, lower_threshold, upper_threshold, 1, POT4);
 
  // Record the DACs
  dacc_set_channel_selection (DACC_INTERFACE, 0); // selects DAC channel 0
  dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // write to DAC 0
  // dacc_set_channel_selection (DACC_INTERFACE, 1) // select DAC channel 1
  // dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
  }
 
  if (effect_2 == HIGH) // EFFECT 2: Clean.
  {
    // Addvolume feature with POT4
    out_DAC0 = map (in_ADC0,0,4095,1, POT4);
    // out_DAC1 = map (in_ADC1,0,4095,1, POT4);
 
    // Write the DACs
    dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
    dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in DAC 0
    // dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
    // dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
    }
 
    if (effect_3 == HIGH) // EFFECT 3: Delay.
  {
    // digitalWrite (LED, LOW);
 
  // Store current readings
  // sDelayBuffer0 [DelayCounter] = in_ADC0;
  sDelayBuffer1 [DelayCounter] = in_ADC1;
 
  // Set the delay depth based on the position of pot2.
  Delay_Depth = map (POT2>>2, 0,1023,1, MAX_DELAY);
 
  // Increse / reset delay counter.
  DelayCounter ++;
  if (DelayCounter >= Delay_Depth) DelayCounter = 0;
  // out_DAC0 = ((sDelayBuffer0 [DelayCounter]));
  out_DAC1 = ((sDelayBuffer1 [DelayCounter]));
 
  // Add volume feature
  // out_DAC0 = map (out_DAC0,0,4095,1, POT3);
  out_DAC1 = map (out_DAC1,0,4095,1, POT3);
 
  // Write the DACs
  // dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
  // dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in the DAC
  dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
  dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 0
 
  // Clear status allowing the interrupt to be triggered again.
  TC_GetStatus (TC1, 1);
  }
 
  // void switch_handler ()
 
  // delayMicroseconds (100000); // debouncing protection
  // if (toggle_value! = digitalRead (TOGGLE)) ++ effect;
  // delayMicroseconds (100000); // debouncing protection
    // toggle_value = digitalRead (TOGGLE);
    // if (effect == 1) effect = 0;
    // Delay_Depth = 300; // resets the variable.
 
    if (effect_4 == HIGH) // EFFECT 4: Tremolo.
    {
      // Store current readings in ECHO mode
      DelayBuffer_A [DelayCounter_A] = (in_ADC0 + (DelayBuffer_A [DelayCounter_A])) >> 1;
      DelayBuffer_B [DelayCounter_B] = (in_ADC1 + (DelayBuffer_B [DelayCounter_B])) >> 1;
 
      // Set the delay depth based on position POT2 and POT2.
      Delay_Depth_A = map (POT2>>3, 0, 512, 1, MAX_DELAY_A);
      Delay_Depth_B = map (POT2>>3, 0, 512, 1, MAX_DELAY_B);
 
      // Increse / reset delay counter.
      DelayCounter_A ++;
      DelayCounter_B ++;
      if (DelayCounter_A >= Delay_Depth_A) DelayCounter_A = 0;
      if (DelayCounter_B >= Delay_Depth_B) DelayCounter_B = 0;
 
      // Calculate the output as the sum of DelayBuffer_A + DelayBuffer_B
      // out_DAC0 = (DelayBuffer_A [DelayCounter_A]);
      out_DAC1 = (DelayBuffer_B [DelayCounter_B]);
 
      // Add volume feature based on pot3 position.
      // out_DAC0 = map (out_DAC0,0,4095,1, POT3);
      out_DAC1 = map (out_DAC1,0,4095,1, POT3);
 
      // Write the DACs
      // dacc_set_channel_selection (DACC_INTERFACE, 0); // select DAC channel 0
      // dacc_write_conversion_data (DACC_INTERFACE, out_DAC0); // writes in DAC 0
      dacc_set_channel_selection (DACC_INTERFACE, 1); // select DAC channel 1
      dacc_write_conversion_data (DACC_INTERFACE, out_DAC1); // writes in DAC 1
      }} 

I have comented this line because they give an error:
// pmc_enable_periph_clk (TC_ID4);
The administrator has disabled public write access.
The following user(s) said Thank You: Matheus
Time to create page: 0.814 seconds
Powered by Kunena Forum
Joomla SEF URLs by Artio