Estoy tratando de usar el Timer1 del microcontrolador AVR de Atmel, ya sea AtMega328 como se usa en el Arduino, o el ATTiny85, para emitir dos señales de reloj que son imágenes reflejadas entre sí. La frecuencia que estoy tratando de generar es una variable de 1 MHz a 2 MHz o más que es demasiado alta para hacer esto usando un código para alternar los pines de salida a menos que quiera hacer casi nada más en el controlador. Así que quiero usar la salida del temporizador directamente en los pines asociados. Estoy usando la cadena de herramientas GCC, por lo que no estoy limitado por las bibliotecas o el lenguaje de arduino.
Timer1 en el Atmega328 tiene dos pines asociados y puedo obtener dos señales idénticas de 1MHz a 2MHz. Aunque la hoja de datos parece decir que puedo obtener una forma de onda invertida, me está confundiendo. También puedo obtener dos señales que son ciclos de trabajo diferentes a 1 MHz, usando la configuración PWM con Timer1, pero ambas señales son altas al mismo tiempo, mientras que la más corta baja antes. Esto no sirve a mi proyecto. Ni siquiera necesito la variación de ancho de pulso PWM, solo necesito dos señales idénticas de "reloj" de fase opuesta, eso es todo.
No le estoy pidiendo a nadie que escriba un código para que yo haga esto, solo necesito que alguien me diga qué modo / banderas del temporizador deberían proporcionarme una forma de onda invertida simple en uno de los dos pines asociados con el temporizador. Si es posible, quiero evitar el uso de un circuito de inversión externo para una de las salidas, a menos que sea solo una opción.
Si esto es posible en absoluto en ATTiny, será aún mejor. El ATTiny también tiene 2 pines asociados con un temporizador, pero no estoy seguro de que tenga las mismas opciones que el ATMega.
Ya tengo un cristal y condensadores de 20 MHz conectados a la PCB y el reloj de 20 MHz funciona de manera confiable en el ATMega328. En ATTiny85 PCB tengo un cristal de 8 MHz y eso también funciona de manera confiable.
Por favor ayuda. Gracias.
ACTUALIZACIÓN : hay algunas suposiciones no válidas en las respuestas y los comentarios hasta el momento, así que quizás debería aclarar: Tenga en cuenta que en mi publicación original he indicado que estoy usando un reloj de 20 MHz,
El único modo que proporciona una frecuencia de salida lo suficientemente alta parece ser modo CTC porque los modos PWM no funcionan para una salida de 2 MHz. ¿Hay alguna manera de invertir la salida A del temporizador 1, o la salida B, en modo CTC?
Ahora he cambiado a un Arduino Uno estándar (ATMega328, 16 MHz) en lugar de mi propia placa de 20 MHz para verificar mi código, y este es mi código para un buen reloj constante de 2 MHz en modo CTC desde los pines 9 y 10 , los pines de salida del temporizador 1:
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
Las trazas del osciloscopio para ambos pines son idénticas y están sincronizadas, ¿cómo puedo invertir cualquiera de las dos señales invertidas? El modo de inversión en la hoja de datos parece no hacer nada en el modo CTC. ¿Estoy leyendo mal la hoja de datos, o me veré forzado a usar una frecuencia más baja y el modo PWM después de todo?
Para agregar una pregunta específica "recompensa" a mi consulta original:
Entonces, ¿qué cambios debo hacer en mi código anterior, para que emita señales perfectamente invertidas en los pines 9 y 11 en la frecuencia más alta posible para un reloj de 16 MHz , ya sea 2 MHz o no? ?
Me quedo con un Arduino Uno estándar por ahora, para que no haya ningún modo de error introducido por mi placa de inicio, y para que cualquiera con un arduino pueda probar mi código anterior y confirmar que funciona como lo he mencionado y no como necesito!