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. ![]()
(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
)
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)