Próbuję użyć Timera1 mikrokontrolera AVR Atmel, albo AtMega328, jak w Arduino, lub ATTiny85, aby wyprowadzić dwa sygnały zegarowe, które są wzajemnie odbiciami lustrzanymi. Częstotliwość, którą próbuję wygenerować, jest zmienną od 1 MHz do 2 MHz lub więcej, które są zbyt wysokie, aby to zrobić za pomocą kodu do przełączania pinów wyjściowych, chyba że nie chcę nic więcej robić w kontrolerze. Chcę więc użyć wyjścia timera bezpośrednio na powiązanych pinach. Korzystam z zestawu narzędzi GCC, więc nie są ograniczone bibliotekami lub językami Arduino.
Timer1 w Atmega328 ma z nim dwa piny i mogę wydobyć z nich dwa identyczne sygnały od 1MHz do 2MHz. Chociaż wydaje się, że arkusz danych mówi, że mogę uzyskać odwrócony przebieg, to mnie dezorientuje. Jestem w stanie uzyskać dwa sygnały, które są różnymi cyklami pracy przy 1 MHz, używając ustawień PWM z Timerem 1, ale oba sygnały idą jednocześnie w górę, tym krótszy wcześniej. To nie służy mojemu projektowi. Nie potrzebuję nawet zmiany szerokości impulsu PWM, potrzebuję tylko dwóch identycznych sygnałów typu „zegar” przeciwnej fazy, to wszystko.
Nie proszę nikogo o napisanie dla mnie kodu, po prostu potrzebuję kogoś, kto powie mi, który tryb / flagi timera powinny dać mi prosty odwrócony przebieg na jednym z dwóch pinów powiązanych z timerem. Jeśli to możliwe, chcę uniknąć używania zewnętrznego obwodu odwracającego dla jednego z wyjść, chyba że jest to tylko opcja.
Jeśli jest to w ogóle możliwe w ATTiny, będzie jeszcze lepiej. ATTiny ma również 2 piny związane z jednym zegarem, ale nie jestem pewien, czy ma takie same opcje jak ATMega.
Mam już kryształ 20 MHz i kondensatory podłączone na płytce drukowanej, a zegar 20 MHz działa niezawodnie na ATMega328. Na płytce ATTiny85 mam kryształ 8 MHz, który również działa niezawodnie.
Proszę pomóż. Dziękuję Ci.
AKTUALIZACJA : Do tej pory w odpowiedziach i komentarzach są pewne nieprawidłowe założenia, więc może powinienem wyjaśnić: Zauważ, że w moim oryginalnym poście stwierdziłem, że używam zegara 20 MHz, a nie 8 MHz , a także, że nie potrzebuję PWM .
Jedynym trybem, który zapewnia wystarczająco wysoką częstotliwość wyjściową, wydaje się być tryb CTC, ponieważ tryby PWM nie działają na wyjściu 2 MHz. Czy istnieje sposób na odwrócenie wyjścia Timera 1 A lub wyjścia B w trybie CTC?
Teraz sprawdziłem swój kod na standardowym Arduino Uno (ATMega328, 16 MHz) zamiast na własnej płycie 20 MHz, a to jest mój kod ładnego stałego zegara 2 MHz w trybie CTC ze styków 9 i 10, Timer 1 styki wyjściowe:
#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() {
}
Ślady oscyloskopu dla obu pinów są identyczne i zsynchronizowane, jak mogę odwrócić jeden z dwóch sygnałów? Tryb odwracania w arkuszu danych wydaje się nic nie robić w trybie CTC. Czy źle czytam arkusz danych, czy w końcu będę zmuszony użyć niższej częstotliwości i trybu PWM?
Aby dodać określone pytanie „nagroda” do mojego pierwotnego zapytania:
Więc jakie zmiany muszę wprowadzić w powyższym kodzie, aby nadawał idealnie odwrócony sygnał na styku 9 i 11 przy najwyższej możliwej częstotliwości dla zegara 16 MHz , czy to jest 2 MHz czy nie?
Na razie będę się trzymał standardowego Arduino Uno, aby moja własna płyta nie wprowadziła trybu błędu i aby każdy, kto ma arduino, mógł wypróbować mój kod powyżej i potwierdzić, że działa tak, jak wspomniałem, a nie tak, jak ja potrzeba!