Estoy tratando de usar el Timer1 del microcontrolador AVR de Atmel, ya sea en el AtMega328 como se utiliza en el Arduino, o el ATTiny85, a la salida dos señales de reloj que son imágenes especulares el uno del otro. La frecuencia estoy tratando de generar es una variable de 1 MHz a 2 MHz o más que son demasiado altos para ello el uso de código para cambiar los pines de salida a menos que quiero hacer casi nada en el controlador. Lo quiero para usar el temporizador de salida directamente sobre los pasadores. Estoy usando GCC toolchain de manera enunciativa más no limitativa por arduino bibliotecas o idioma.
Timer1 en el Atmega328 tiene dos pines asociados con ella y puedo conseguir dos idénticos 1MHz a 2 mhz señales de ellos. Aunque la hoja de datos parece decir yo puedo tener una forma de onda invertida, es confuso para mí. Yo también soy capaz de obtener dos señales que son diferentes ciclos de trabajo a 1 MHz, utilizando la configuración de PWM con el Timer1, pero ambas señales ir de alta, al mismo tiempo, el más corto va de baja antes. Esto no sirve para mi proyecto. Yo ni siquiera es necesario el ancho de pulso PWM variación, sólo tengo dos idénticos "reloj" del tipo de las señales de fase opuesta, eso es todo.
No estoy pidiendo a nadie a escribir el código para hacer esto, necesito que alguien me diga que el modo de la señal del temporizador debe darme una simple forma de onda invertida en uno de los dos pines asociados con el temporizador. Si es posible quiero evitar usando un dispositivo de inversión de circuito para una de las salidas, a menos de que es la única opción.
Si esto es posible en todos los en el ATTiny, que será aún mejor. El ATTiny también tiene 2 pines asociados con un temporizador, pero no estoy seguro de que tiene las mismas opciones que el ATMega.
Ya tengo un canal de 20 MHz de cristal y los condensadores conectados en la placa PCB y 20 MHz de reloj está funcionando de forma fiable en el ATMega328. En ATTiny85 PCB tengo una de 8 MHz de cristal y que también está trabajando de forma fiable.
Por favor, ayudar. Gracias.
ACTUALIZACIÓN: Hay algunos supuestos no válidos en las respuestas y comentarios hasta el momento, así que tal vez debería aclarar: tenga en cuenta que en mi post original me han dicho que yo estoy usando un 20 MHz, 8 MHz, y también que yo no necesita PWM.
El único modo de que le da un nivel suficientemente alto de la frecuencia de salida parece ser la CTC modo porque PWM modos no están trabajando para 2 MHz de salida. Es allí una manera de invertir, ya sea de Temporizador de 1 salida, o la salida B, en modo CTC?
Ahora he cambiado a un estándar de Arduino Uno (ATMega328, 16 MHz) en lugar de mi propio canal de 20 MHz de la junta para revisar mi código, y este es mi código para un buen constante de 2 MHz de reloj en modo CTC de los pines 9 y 10, el Temporizador 1 pines de salida:
#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() {
}
El osciloscopio trazas para ambos pines son idénticos y en sincronía, ¿cómo puedo conseguir cualquiera de las dos señales invertidas? El modo de invertir en la hoja de datos parece no hacer nada en modo CTC. Estoy leyendo la hoja de datos mal, o se me ven obligados a utilizar una frecuencia más baja y el modo PWM después de todo?
Para agregar una "recompensa" pregunta a mi consulta original:
Entonces, ¿qué cambios debo hacer para que mi código de arriba, a hacer es dar a la perfección señales invertidas en el pin 9 y 11 en la frecuencia más alta posible para un joven de 16 MHz, ya que es de 2 MHz o no?
Voy a seguir con un estándar de Arduino Uno, por ahora, así que no hay ningún error, el modo de ser introducidas por mi casero de la junta, y de modo que cualquier persona con un arduino puede probar mi código de arriba y confirmar que funciona como he mencionado, y no como lo que necesito!