[SOLUCIONADO] dronesizer

Hola a todos, este es mi primer post por aquí.
Tengo un par de arduinos duemilanove, con el ATmega328.
De momento no se nada de programar y uso mis arduinos con los trabajos que hacen otros.
Lo último que he intentado es hacerme un dronesizer, que podeis ver en esta web : Dronesizer pt 2 | IDLE HANDS
Estoy usando el segundo código, el que viene en los comentarios.
El problema es que siempre me sale la misma linea subrayada en amarillo :

TIMSK2 = 1< OCR2A = 127;

y los siguientes errores:

sketch_aug25d.cpp: In function 'void setup()':
sketch_aug25d:55: error: lvalue required as left operand of assignment
sketch_aug25d:57: error: expected primary-expression before 'asm'
sketch_aug25d:57: error: expected `;' before 'asm'

¿Alguna idea sobre que debo hacer para solucionarlo?
¿Puede afectar que no esté conectado el hardware (los potenciómetros, etc..) a las entradas analógicas a la hora de compilar o es algo independiente?
Muchas gracias.

pega aquí el codigo que has "copiado" al programa de Arduino.

te recomiendo que te mires algún tutorial porque estoy seguro que muchos errores los podras solucionar tu cuando hayas leido un poco de como programar.
Entiende que decir "no se nada de programar" y luego decir que me da estos errores, pues no parece justo que tu copies y pegues codigo y la gente tenga que arreglarte los programas sin que tu hayas intentado "aprender a programar".
Te lo digo de buen rollo y para tu beneficio.
un saludo.

1 Like

Ok, ningún problema.
No puse el código entero porque me pareció muy largo, por eso he dejado el link con el código.
No se nada de programar en C, pero si he estado tirando de google los últimos días para buscar información sobre el funcionamiento de los timers y solucionar el problema, aunque no lo he conseguido.
No pretendo que nadie me saque las castañas del fuego, me pareció que solo era una linea de código y tal vez alguien podía echarme un cable, aunque entiendo que pueda sonar muy cómoda mi pregunta.
Seguiré buscando.
Gracias

Tienes que intentar poner la máxima información posible para que la gente pueda ayudarte ya que no sabemos lo que estás haciendo. Que los códigos sean largos es normal pero es mejor ponerlo en el post bien tabulado que tener que verlo malamente un una pagina. Para que se te pueda ayudar tienes que procurar cumplir algunas de las sugerencias Arduino Playground - Consejos

He mirado y no se cual es el problema pero lo que si he visto es que el programa tiene tela ya que TIMSK2, OCR2A son registros internos del timer2 Tinkering with Electronics...: Timer 2: Introducción nunca he mirado eso pero sin tener ni idea de programación meterle mano a esto me parece muy osado. Es mejor dominar las bases que tirarse a la piscina ciegamente.

Muchas gracias por los consejos ionhs. El link que me has dejado lo estuve leyendo ayer por la noche, pero como dices, no saqué nada en claro para poder solucionar el problema. Lo que no comprendo es que a veces un código que le ha funcionado a uno en su arduino, no le funcione a otro ¿A que se debe? ¿Puede ser por usar versiones distintas del compilador?

Dejo aquí el código tal como viene en la web :

//audio out variables

#define SINC_LENGTH 32

float sinC[4][SINC_LENGTH] = {
{//sinus
0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008 }
,
{//square
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
,
{//saw
0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0 }
,
{//tri
0.0625,0.125,0.1875,0.25,0.3125,0.375,0.4375,0.5,0.5625,0.625,0.6875,0.75,0.8125,0.875,0.9375,1.0,0.9375,0.875,0.8125,0.75,0.6875,0.625,0.5625,0.5,0.4375,0.375,0.3125,0.25,0.1875,0.125,0.0625,0.0 }
};

float note =50;
float TEMP= 0.0;

int oldKnobs[6] ={
0,0,0,0,0,0};
int tempKnobs[6] ={
0,0,0,0,0,0};

enum waveFormType {
SIN, SQUARE,SAW,TRI, };

float globalHz1 =0.001;
float oscCount1=0;

float globalHz2 =0.001;
float oscCount2=0;

float globalHz3 =0.001;
float oscCount3=0;

float LFOHz =0.001;
float lfoCount=0;

int type=0;

void setup()
{

pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);

Serial.begin(9600);
//Timer2 setup This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
TIMSK2 = 1< OCR2A = 127;
TCCR2A = 2; // CTC mode, counts up to 127 then resets
TCCR2B = 0<<< sei(); // global interrupt enable

}

// timer 2 is audio interrupt timer
ISR(TIMER2_COMPA_vect)
{
OCR2A = 127;
oscillator();

}

//output to audio
void aWrite(byte i)
{
PORTB = PORTB & B000000;
PORTB = PORTB | i;
}

void oscillator()
{

switch(type)
{
case 0:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP += (sinC[SIN][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3]);
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount]);
break;

}

case 1:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP += (sinC[SIN][(int)oscCount2]);
break;
}

case 2:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP += (sinC[SIN][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3] );
break;
}

case 3:
{
TEMP = (sinC[TRI][(int)oscCount1] );
TEMP += (sinC[TRI][(int)oscCount2] );
TEMP += (sinC[TRI][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount] );

break;

}

case 4:
{
TEMP = (sinC[TRI][(int)oscCount1] );
TEMP += (sinC[TRI][(int)oscCount2] );
break;
}

case 5:
{
TEMP = (sinC[SIN][(int)oscCount1] );
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount] );

break;
}

case 6:
{
TEMP = (sinC[TRI][(int)oscCount1] );
if(LFOHz!=0.0)
TEMP *= (sinC[TRI][(int)lfoCount] );

break;
}

case 7:
{
TEMP = (sinC[SQUARE][(int)oscCount1] );
if(LFOHz!=0.0)
TEMP *= (sinC[SQUARE][(int)lfoCount] );

break;
}

case 8:
{
TEMP = (sinC[SQUARE][(int)oscCount1] );
TEMP -= (sinC[SQUARE][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3] );
break;
}

case 9:
{
TEMP = (sinC[SIN][(int)oscCount1] );
TEMP -= (sinC[TRI][(int)oscCount2] );
TEMP += (sinC[SIN][(int)oscCount3] );
break;
}
case 10:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP += (sinC[SAW][(int)oscCount3] );
break;
}
case 11:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP -= (sinC[SAW][(int)oscCount3] );
break;
}
case 12:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP -= (sinC[SAW][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SAW][(int)lfoCount] );
break;

}
case 13:
{
TEMP = (sinC[SAW][(int)oscCount1] );
TEMP += (sinC[SAW][(int)oscCount2] );
TEMP -= (sinC[SAW][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SAW][(int)lfoCount] );
break;

}

case 14:
{
TEMP = (sinC[TRI][(int)oscCount1] );
TEMP += (sinC[TRI][(int)oscCount2] );
TEMP -= (sinC[TRI][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[TRI][(int)lfoCount] );
break;

}
default:
{
TEMP = (sinC[SQUARE][(int)oscCount1] );
TEMP += (sinC[SQUARE][(int)oscCount2] );
TEMP += (sinC[SQUARE][(int)oscCount3] );
if(LFOHz!=0.0)
TEMP *= (sinC[SIN][(int)lfoCount] );
break;
}
}

aWrite((byte)((TEMP)*24)); //write to output

oscCount1+=globalHz1;
if(oscCount1>SINC_LENGTH)
oscCount1=0;
oscCount2+=globalHz2;
if(oscCount2>SINC_LENGTH)
oscCount2=0;
oscCount3+=globalHz3;
if(oscCount3>SINC_LENGTH)
oscCount3=0;
/*lfoCount+=LFOHz; //WTF WHERE I THINKING HERE ????
if(LFOHz>SINC_LENGTH)
LFOHz=0;
*/
lfoCount+=LFOHz;
if(lfoCount>SINC_LENGTH)
lfoCount=0;

}

void loop()
{

tempKnobs[0] =analogRead(0);
tempKnobs[1] =analogRead(1);
tempKnobs[2] =analogRead(2);
tempKnobs[3] =analogRead(3);
tempKnobs[4] =analogRead(4);
tempKnobs[5] =analogRead(5);

if(tempKnobs[0]!=oldKnobs[0])
{
//note = ((tempKnobs[0]/1024.0)*100.0);
//globalHz1 = ((440 * pow(2.0,(note-69.0)/12.0))/1562.50);

globalHz1 = ((tempKnobs[0]/1024.0)*1.70);
oldKnobs[0]=tempKnobs[0];

globalHz2 =globalHz1+ (((tempKnobs[1]/1024.0)*.25)-0.125);
globalHz3 =globalHz1+ (((tempKnobs[2]/1024.0)*.25)-0.125);

}
if(tempKnobs[1]!=oldKnobs[1])
{
globalHz2 =globalHz1+ (((tempKnobs[1]/1024.0)*.25)-0.125);
oldKnobs[1]=tempKnobs[1];
}
if(tempKnobs[2]!=oldKnobs[2])
{
globalHz3 =globalHz1+ (((tempKnobs[2]/1024.0)*.25)-0.125);
oldKnobs[2]=tempKnobs[5];
}
if(tempKnobs[3]!=oldKnobs[3])
{
LFOHz=((tempKnobs[3]/1024.0)*0.4);
oldKnobs[3]=tempKnobs[3];

}
if(tempKnobs[4]!=oldKnobs[4])
{
oldKnobs[4]=tempKnobs[4];
}
if(tempKnobs[5]!=oldKnobs[5])
{
type=tempKnobs[5]/51;// 20 modes
oldKnobs[5]=tempKnobs[5];
}

}

En fin, no se si tengo que darme por aludido con la gracia del post del cohete, pero bueno.
Antes de nada, dejar claro que no se nada de programación en C o C++, pero eso no significa que no tenga conocimientos o experiencia usando otros lenguajes. De ahí mi pregunta tan directa.
Ni siquiera se porque estoy dando explicaciones, pero bueno.
Creo que hay muchas otras formas de ayudar o enseñar a la gente que tirando de ironía.

en esta linea

TIMSK2 = 1< OCR2A = 127;

estas haciendo una doble asignación, por eso te da error. según lo que se quiere hacer es desplazar los bits de manera que TIMSK2 valdrá en función de lo que valga OCR2A, potencias de 2 ( 1,2,4,8,.....) según el numero de veces que desplaza un 1 a la izquierda.

yo diría que es así
TIMSK2 = 1< OCR2AM;

y que el = a 127 es el valor hipotético que debe valer .. esto ya no lo puedo asegurar

Mil gracias SrDonGato, luego lo probaré a ver si estás en lo cierto.
De todas formas intentaré ponerme en contacto con el autor del código para preguntarle que arduino está usando, software, etc...
No se como son las demás versones de arduino, pero si tienen integrados distintos (aparte del ATmega) tal vez por eso me esté dando problemas el tema del timer. No se, que lo mismo no tiene nada que ver, pero seguiré buscando.
Cuando encuentre alguna solución lo contaré por aquí.
Saludos!

el bitshift son dos <<

nach79:
En fin, no se si tengo que darme por aludido con la gracia del post del cohete, pero bueno.
Antes de nada, dejar claro que no se nada de programación en C o C++, pero eso no significa que no tenga conocimientos o experiencia usando otros lenguajes. De ahí mi pregunta tan directa.
Ni siquiera se porque estoy dando explicaciones, pero bueno.
Creo que hay muchas otras formas de ayudar o enseñar a la gente que tirando de ironía.

nach no te lo tomes como nada personal, en serio, dudo que vaya con mala intención.
Es verano y mucha gente tiene tiempo libre y ha decidido iniciarse en Arduino, eso lleva a que diariamente aparece un post con alguna pregunta que con una busqueda en google se habria solucionado.
Esto se ha estado repitiendo durante mas de un mes y de ahi que en algunos momentos se tire de ironia, o como yo lo veo...un poco de humor.
repito no te molestes y a seguir dandole al Arduino, el post del cohete hay que verlo como gracioso sin tomarselo nadie personalmente.

Sería falso por mi parte decir que no me ha sentado mal la gracia, porque además es algo que yo no haría. Hago gracias con mis amigos, pero no a costa de un desconocido con el que no tengo ninguna confianza.
Pero esa es mi postura y como esto es un foro en el que participa mucha gente, con distintas ideas y filosofías, creo que tu posición es la más adecuada. Mejor me lo tomo con humor, le quito seriedad y hago un reset para empezar de nuevo. No me va servir de nada pensar mal por aquí.

Por cierto que he probado lo que me comentaban SrDonGato y aero-yo, pero sin resultados. Sigue fallando igual.
Así que he escrito al creador del código, para pedirle información sobre que arduino ha usado, etc...
Si tengo alguna respuesta o consigo arreglar algo antes por mi cuenta (que lo dudo, porque llevo varios día dándole vueltas) os cuento.
Saludos y muchas gracias por la ayuda.

mira a ver si se ha equivocado en un punto y coma

tienes esto

//Timer2 setup This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
TIMSK2 = 1< OCR2A = 127;
TCCR2A = 2; // CTC mode, counts up to 127 then resets
TCCR2B = 0<<< sei(); // global interrupt enable

mira a ver si es esto

//Timer2 setup This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
TIMSK2 = 1;
OCR2A = 127;
TCCR2A = 2; // CTC mode, counts up to 127 then resets
TCCR2B = 0<<< sei(); // global interrupt enable

He probado el código tal como lo propones, pero entonces la linea en la que da un error es la del sei():
TCCR2B = 0<<< sei(); // global interrupt enable

Luego por la tarde montaré el DAC y los potenciómetros para ver si cambia algo.
¿Puede variar algo al hacerlo así? Me refiero a que verificando el código desde el soft de arduino no funcione, pero si que pueda ser aceptado por la placa al estar "modificada" con componentes extras en las entradas o salidas del arduino, por ejemplo.
¿Es posible? o solo depende del ATmega y los demás integrados.
Muchas gracias!

Esta linea es un pufo de cuidado, para empezar, sei() es una funcion void, no devuelve nada, y <<<???

Mi experiencia portando codigo de un micro a otro es que apenas cambian los pines, las funciones se mantienen igual sin problema.

Sería falso por mi parte decir que no me ha sentado mal la gracia, porque además es algo que yo no haría. Hago gracias con mis amigos, pero no a costa de un desconocido con el que no tengo ninguna confianza.
Pero esa es mi postura y como esto es un foro en el que participa mucha gente, con distintas ideas y filosofías, creo que tu posición es la más adecuada.

Perdona Nach79, no habia visto tu post.

No, tranquilo, no me he reido de nadie ni nada por el estilo, y menos de ti, no magnifiques, no eres el protagonista del post.

siento no poder ayudarte con tu proyecto, para serte sincero ni tan siquiera se lo que es.

Si me entero de informacion o parecido lo posteare, como suelo hacer, por el mero hecho de hechar una mano a alguien simplemente.

El post esta escrito con un humor que podemos llamar "acido" a lo mejor pero es simplemente una representacion un poco comica a estos ultimos meses, pero nada mas y de paso una forma de evadir tensiones...

Tambien queria mostrar lo que esos "locos" han hecho de hastaun cohete con arduino... "cagate lorito"...

Te invito a que participes y no lo tomes a personal.

Un saludo.

Sin problemas, además no puedo enfadarme contigo si me miras con esos ojos :grin:

Esta linea es un pufo de cuidado, para empezar, sei() es una funcion void, no devuelve nada, y <<<???

Tampoco he conseguido que funcione el primer código (el primero que puse es una versión actualizada, incluyo el otro del que hablo ahora abajo), en esta ocasión me salen fallos en esta linea:

TIMSK2 = 1<<<SINC_LENGTH)

Y los fallos son:

sketch_aug26b.cpp: In function 'void setup()':
sketch_aug26b:57: error: 'lt' was not declared in this scope
sketch_aug26b:57: error: expected ;' before ')' token sketch_aug26b:60: error: 'gt' was not declared in this scope sketch_aug26b:60: error: expected )' before ';' token
sketch_aug26b:60: error: expected ;' before ')' token sketch_aug26b:63: error: 'gt' was not declared in this scope sketch_aug26b:63: error: expected )' before ';' token
sketch_aug26b:63: error: expected ;' before ')' token sketch_aug26b:66: error: 'gt' was not declared in this scope sketch_aug26b:66: error: expected )' before ';' token
sketch_aug26b:66: error: expected `;' before ')' token

//audio out variables
float TEMP= 0.0;
 
#define SINC_LENGTH 32 
 
float sinC[3][SINC_LENGTH] = {
  {//sinus
    0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008,  }
  ,
  {//saw
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  }
  ,
  {//tri
    0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0,  }
};
 
int incomingByte = 0;	// for incoming serial datar
 
int pin0val =0;
 
enum waveFormType {
  SIN, SQUARE,TRI,  };
 
/*
float vol1=1.0;
 float vol2=1.0;
 float vol3=1.0;
 float vol4=1.0;*/
 
float globalHz1 =0.001;
float oscCount1=0;
 
float globalHz2 =0.001;
float oscCount2=0;
 
float globalHz3 =0.001;
float oscCount3=0;
 
float LFOHz =0.001;
float lfoCount=0;
 
int type=0;
 
void setup()
{
 
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
 
  randomSeed(analogRead(0));
 
  //Timer2 setup  This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
  TIMSK2 = 1&lt;&lt;&lt;SINC_LENGTH)
    oscCount1=0;
  oscCount2+=globalHz2;
  if(oscCount2&gt;SINC_LENGTH)
    oscCount2=0;
  oscCount3+=globalHz3;
  if(oscCount3&gt;SINC_LENGTH)
    oscCount3=0;
  lfoCount+=LFOHz;
  if(LFOHz&gt;SINC_LENGTH)
    LFOHz=0;
 
}
 
void calculateHz(float in,float detune1, float detune2)
{
 
  globalHz1 = ((440 * pow(2.0,(in-69.0)/12.0))/1562.50);
  globalHz2 = (440 * pow(2.0,(detune1-69.0)/12.0))/1562.50;
  globalHz3 = (440 * pow(2.0,(detune2-69.0)/12.0))/1562.50;
 
  /*
  Serial.print("  ");
   Serial.print(globalHz1*100000, DEC);
   Serial.print("  ");
   Serial.print(globalHz2*100000, DEC);
   Serial.print("  ");
   Serial.print(globalHz3*100000, DEC);
   */
}
 
void loop()
{
 
  LFOHz = (analogRead(3)/(SINC_LENGTH*10.0));
  type=analogRead(5)/51;// 20 modes
  float note = ((analogRead(0)/1024.0)*100.0);
  calculateHz(note,note-(((analogRead(1)/1024.0)*2.0)-1.0),note-(((analogRead(2)/1024.0)*2.0)-1.0));
 
  /*
  Serial.println("vol ");
 
   Serial.print(vol,DEC);
 
   Serial.println(" LFOHz");
   Serial.print(LFOHz,DEC);
 
   Serial.print("analog 1: ");
   Serial.print( analogRead(1),DEC);
 
   Serial.print("___ analog 2: ");
   Serial.print( analogRead(2),DEC);
 
   Serial.print(" type ");
   Serial.print(type);
 
   Serial.print(" Note ");
   Serial.print((int)(note) );
   Serial.println(" ");
 
   */
}

No se, es muy raro que no me funcionen ninguno de los dos códigos y en cambio si le funcionen al autor, no?

al definir las array las termina con

,  }

segun http://arduino.cc/es/Reference/Array
deberia acabar con el ultimo elemento de la lista
int myArray[10]={9,3,2,4,3,2,7,8,9,11};

float sinC[3][SINC_LENGTH] = {
  {//sinus
    0.59754515,0.69134176,0.7777851,0.8535534,0.9157348,0.96193975,0.9903926,1.0,0.9903927,0.9619398,0.9157348,0.8535534,0.77778506,0.69134164,0.597545,0.49999985,0.40245464,0.30865806,0.22221464,0.14644638,0.08426499,0.03806007,0.009607285,0.0,0.009607464,0.038060457,0.08426553,0.14644706,0.22221544,0.30865896,0.4024556,0.5000008 }
  ,
  {//saw
    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
  ,
  {//tri
    0.03125,0.0625,0.09375,0.125,0.15625,0.1875,0.21875,0.25,0.28125,0.3125,0.34375,0.375,0.40625,0.4375,0.46875,0.5,0.53125,0.5625,0.59375,0.625,0.65625,0.6875,0.71875,0.75,0.78125,0.8125,0.84375,0.875,0.90625,0.9375,0.96875,1.0 }
};

prueba a ver si el numero de errores se reduce o igual hay algo que yo no se.

El codigo no lo han puesto bien en la web, por ejemplo en : if(oscCount3>SINC_LENGTH) o en ;&lt

Esto es porque la conversion en html de los simbolos no se ha realizado correctamente. Hay varias erratas ahi....
TIMSK2 = 1<<<SINC_LENGTH)
if(oscCount2>SINC_LENGTH)
etc.

Por ejemplo, > es el signo > y < es <

Hola,

por lo que he podido leer del código (la verdad es que no le he podido dedicar mucho tiempo), lo que se pretende es generar una forma de onda digital usando uno de los puertos con salidas discretas. El código en discordia lo que entiendo que debería hacer es llamar de forma periódica a la función oscillator. Para ello utiliza el timer counter 2 del AVR para producir una interrupción periódica. Por lo que entiendo que el código pretende hacer, es configurar el comparador 2 para que cada vez que llegue a un valor determinado se llame a la rutina de interrupción (aka oscillator).

Por lo tanto este código:

//Timer2 setup This is the audio rate timer, fires an interrupt at 15625 Hz sampling rate
TIMSK2 = 1< OCR2A = 127;
TCCR2A = 2; // CTC mode, counts up to 127 then resets
TCCR2B = 0<<< sei(); // global interrupt enable

}

// timer 2 is audio interrupt timer
ISR(TIMER2_COMPA_vect)
{
OCR2A = 127;
oscillator();

}

Debería quedar de la siguiente forma para que compile:

// cargo en el registro OCR2A - Output Compare Register A - 127, este valor se compara continuamente con
// el contador TCNT2, que se actualiza automaticamente por el micro con un "tick" dependiente de la configuración
// de preescalado del timer 2
OCR2A = 127; 
 
// Configuro el contador en modo CTC (Clear Timer on Compare Match) - resetear el timer cuando
// TCNT2 sea igual que OCR2A (e.d. 127)
TCCR2A = 2;
TCCR2B = 0;

// Configuro el bloque del contador 2 para que genere una interrupción cada vez que hay un overflow
// en el contador.
TIMSK2 = 1;
...
sei (); // enable interrupts


}
// timer 2 is audio interrupt timer
// Rutina de interrupción que se llamará cada vez que el contador 2 haga overflow.
ISR(TIMER2_COMPA_vect)
{
   OCR2A = 127; // aunque esta linea no sea necesaria, déjala
   oscillator();
}

Siguiendo la lógica de la configuración no me termina de cuadrar. Ya que con el código que hay arriba, el contador nunca llegará a dar la vuelta (overflow) y no se invocará la rutina de interrupción. Esto es debido a que el contador 2 esta configurado en mode CTC, es decir, cuando el contador TCNT2 sea igual que OCR2A, pongo el contador a cero.

Por lo tanto el código quedaría así:

// cargo en el registro OCR2A - Output Compare Register A - 127, este valor se compara continuamente con
// el contador TCNT2, que se actualiza automaticamente por el micro con un "tick" dependiente de la configuración
// de preescalado del timer 2
OCR2A = 127; 
 
// Configuro el contador en modo CTC (Clear Timer on Compare Match) - resetear el timer TCNT2 cuando
// TCNT2 sea igual que OCR2A (e.d. 127)
TCCR2A = 2;
TCCR2B = 0;

// Configuro el bloque del contador 2 para que genere una interrupción cada vez que hay un overflow
// en el contador.
TIMSK2 = 2;
...
sei (); // enable interrupts


}
// timer 2 is audio interrupt timer
// Rutina de interrupción que se llamará cada vez que el contador 2 haga overflow.
ISR(TIMER2_COMPA_vect)
{
OCR2A = 127;
oscillator();

}

Por otro lado, donde en el código pone "&gt" cámbialo por ">" y donde pone "&lt" cámbialo por "<". Ahora debería estar dando fallos de compilación.

A ver si con esto te compila y funciona. Si no es así, publica la fuente de donde has sacado el código y lo miro.

Un saludo