Tren de pulsos de ciclo variable

Hola que tal, mi problema es el siguiente. Utilizando los registros del timer1 del arduino nano, he configurado el puerto D9 a funcionar como salida PWM a 833,333 hz... mas o menos a esa frecuencia, hasta ahi todo bien pero lo que necesito es que despues de dos ciclos completos de la frecuencia, cambie el ciclo de trabajo durante otros dos ciclos completos de la frecuencia. Los dos distintos tipos de ciclo de trabajo funcionan como una incriptacion, dos ciclos completos de la frecuencia a uno de los ciclos de trabajo representan un 0 logico, el otro valor de ciclo de trabajo representa un 1 logico. Utilizando los registros de interrupcion por comparacion del timer 1 ya me he acercado a lograr que en un mismo tren de pulsos se presente la dicha incriptacion, pero si se logra representar el 0 logico, el ciclo de trabajo que representa el 1 logico solo se presenta una vez, y viceversa.

Espero me hayan entendido y me puedan ayudar a encontrar una solucion. :slight_smile:
(El codigo ahora mismo esta modificado por lo que no logra hacer lo que antes mencione, y la version que funcionaba pues no la guarde :upside_down_face:)

bool datos[12] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 };
char bit1 = 4, bit0 = 12, tren = 0;
char periodos = 0;
bool A = 0;

void setup() {
  TCNT1 = 0;
  ICR1 = 18;
  OCR1A = 0;

  pinMode(9, OUTPUT);

  cli();
  byte maskTIMSK1 = 0;
  maskTIMSK1 |= (1 << OCIE1A);
  maskTIMSK1 &= ~(1 << ICIE1);
  maskTIMSK1 &= ~(1 << OCIE1B);
  maskTIMSK1 &= ~(1 << TOIE1);
  TIMSK1 = maskTIMSK1;

  byte maskTCCR1A = 0;
  maskTCCR1A |= (1 << WGM11);
  maskTCCR1A &= ~(1 << WGM10);
  maskTCCR1A |= (1 << COM1A1);
  maskTCCR1A |= (1 << COM1A0);
  TCCR1A = maskTCCR1A;

  byte maskTCCR1B = 0;
  maskTCCR1B |= (1 << CS10);
  maskTCCR1B &= ~((1 << CS12) | (1 << CS11));
  maskTCCR1B |= (1 << WGM12);
  maskTCCR1B |= (1 << WGM13);
  TCCR1B = maskTCCR1B;
  sei();
}

void loop() {
  for (int i = 0; i < 13; i++) {
    switch (datos[i]) {
      case 0:
        tren = bit0;
        break;
      case 1:
        tren = bit1;
        break;
    }

    while (!A) {
      OCR1A = tren;
      TCCR1A &= ~(1 << COM1A1);
      TCCR1A &= ~(1 << COM1A0);
    }
    A = 0;
  }
}

ISR(TIMER1_COMPA_vect) {
  periodos++;
  TCNT1 = 0;
  ICR1 = 18;

  if (periodos == 2) {
    periodos = 0;
    A = 1;
  }
}

Basicamente quiero replicar el funcionamiento del PT2260
PT2260.PDF (307,6 KB)

Cual es el objetivo de este programa?
Porque quieres replicar el funcionamiento del PT2260 ?

Tengo el proyecto de instalar unas plumas de control vial en mi comunidad, estas se van a poder controlar con un control remoto RF, los controles que voy a usar son aquellos que copian el codigo de un control original, y de los integrados que son compatibles con este control de copia es el pt2260, seria mas facil comprar el integrado pero las electronicas de mi ciudad no estan tan surtidas me quedo sin tiempo y recursos para hacer compras, asi que esta es la opcion que considere

bool datos[12] = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 };
char bit1 = 12, bit0 = 4, tren = 0;
char periodos = 0;
int i = 0;
bool fin = false;

void setup() {
  pinMode(9, OUTPUT);

  cli();
  byte maskTIMSK1 = 0;
  maskTIMSK1 |= (1 << OCIE1A);
  maskTIMSK1 &= ~(1 << ICIE1);
  maskTIMSK1 &= ~(1 << OCIE1B);
  maskTIMSK1 &= ~(1 << TOIE1);
  TIMSK1 = maskTIMSK1;

  TCNT1 = 0;
  ICR1 = 18;
  OCR1A = 0;

  byte maskTCCR1A = 0;
  maskTCCR1A |= (1 << WGM11);
  maskTCCR1A &= ~(1 << WGM10);
  maskTCCR1A |= (1 << COM1A1);
  maskTCCR1A |= (1 << COM1A0);
  TCCR1A = maskTCCR1A;

  byte maskTCCR1B = 0;
  maskTCCR1B |= (1 << CS10);
  maskTCCR1B &= ~(1 << CS12);
  maskTCCR1B &= ~(1 << CS11);
  maskTCCR1B |= (1 << WGM12);
  maskTCCR1B |= (1 << WGM13);
  TCCR1B = maskTCCR1B;
  sei();
}

void loop() {
}

ISR(TIMER1_COMPA_vect) {
  periodos++;

  if (periodos == 2) {
    periodos = 0;
    if (i < 12) {
      switch (datos[i]) {
        case 0:
          tren = bit0;
          break;
        case 1:
          tren = bit1;
          break;
      }
      OCR1A = tren;
      i++;
    } else {
      i = 0;
    }
  }
}

Este codigo ya me produce un solo tren de pulsos con los dos diferentes ciclos de trabajo, pero no me da los pulsos en los tiempos que necesito

He analizado el tema con 2 moderadores y hemos decidido cerrar el hilo porque no se ajusta a las prácticas públicas del foro.
Suerte.