Estou tentando usar o microcontrolador Timer1 do Atmel AVR, o AtMega328, usado no Arduino ou no ATTiny85, para emitir dois sinais de relógio que são imagens espelhadas um do outro. A frequência que estou tentando gerar é uma variável de 1 MHz a 2 MHz ou mais, que é muito alta para fazer isso usando o código para alternar os pinos de saída, a menos que eu queira fazer quase nada mais no controlador. Então, eu quero usar a saída do timer diretamente nos pinos associados. Estou usando o conjunto de ferramentas GCC, portanto não limitado por bibliotecas ou idioma do arduino.
O Timer1 no Atmega328 possui dois pinos associados e posso obter dois sinais idênticos de 1MHz a 2MHz. Embora a folha de dados pareça dizer que posso obter uma forma de onda invertida, ela está me confundindo. Também consigo obter dois sinais com ciclos de trabalho diferentes a 1 MHz, usando as configurações de PWM com Timer1, mas ambos os sinais aumentam ao mesmo tempo, o menor diminui mais cedo. Isso não serve ao meu projeto. Eu nem preciso da variação da largura de pulso PWM, só preciso de dois sinais idênticos do tipo "relógio" de fase oposta, isso é tudo.
Não estou pedindo que alguém escreva código para fazer isso, só preciso que alguém me diga qual modo / sinalizadores do timer devem fornecer uma forma de onda invertida simples em um dos dois pinos associados ao timer. Se possível, quero evitar o uso de um circuito inversor externo para uma das saídas, a menos que seja a única opção.
Se isso for possível no ATTiny, será ainda melhor. O ATTiny também possui 2 pinos associados a um timer, mas não tenho certeza de que tenha as mesmas opções que o ATMega.
Eu já tenho um cristal de 20 MHz e os capacitores conectados no PCB e o relógio de 20 MHz está funcionando de maneira confiável no ATMega328. No PCB ATTiny85, tenho um cristal de 8 MHz e isso também está funcionando de maneira confiável.
Por favor ajude. Obrigado.
ATUALIZAÇÃO : Existem algumas suposições inválidas nas respostas e comentários até agora, então talvez eu deva esclarecer: Observe que na minha postagem original afirmei que estou usando um relógio de 20 MHz, não 8 MHz , e também que não preciso de PWM .
O único modo que fornece uma frequência de saída suficientemente alta parece ser o modo CTC porque os modos PWM não estão funcionando para saída de 2 MHz. Existe uma maneira de inverter a saída A do temporizador 1 ou a saída B no modo CTC?
Agora mudei para um Arduino Uno padrão (ATMega328, 16 MHz) em vez de minha própria placa de 20 MHz para verificar meu código, e este é o meu código para um bom e estável relógio de 2 MHz no modo CTC dos pinos 9 e 10, o Timer 1 pinos de saída:
#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() {
}
Os traços do osciloscópio para os dois pinos são idênticos e sincronizados. Como posso inverter um dos dois sinais? O modo invertido na folha de dados parece não fazer nada no modo CTC. Estou lendo a folha de dados incorretamente ou serei forçado a usar uma frequência mais baixa e o modo PWM, afinal?
Para adicionar uma pergunta específica de "recompensa" à minha consulta original:
Então, quais alterações eu preciso fazer no meu código acima, para que ele produza sinais perfeitamente invertidos nos pinos 9 e 11 na frequência mais alta possível para um relógio de 16 MHz , seja isso é 2 MHz ou não?
Por enquanto, continuarei com um Arduino Uno padrão, para que não haja um modo de erro sendo introduzido pela minha placa caseira, e para que qualquer pessoa com um arduino possa experimentar o meu código acima e confirmar que funciona como eu mencionei e não como eu. precisar!