Я намагаюся використовувати Timer1 мікроконтролера Atmel AVR, або AtMega328, який використовується в Arduino, або ATTiny85, для виведення двох тактових сигналів, які є дзеркальними зображеннями один одного. Частота, яку я намагаюсь генерувати, є змінною від 1 МГц до 2 МГц або більше, яка занадто висока, щоб зробити це за допомогою коду для перемикання вихідних штифтів, якщо я не хочу робити майже нічого іншого в контролері. Тому я хочу використовувати вихід таймера безпосередньо на пов'язаних штифтах. Я використовую ланцюжок інструментів GCC, щоб не обмежуватися бібліотеками або мовою arduino.
Timer1 в Atmega328 пов'язаний з ним двома контактами, і я можу отримати з них два однакових сигналу від 1 МГц до 2 МГц. Хоча аркуш даних, схоже, говорить про те, що я можу отримати перевернуту форму хвилі, це мене бентежить. Я також можу отримати два сигнали, які є різними циклами роботи на 1 МГц, використовуючи параметри ШІМ з Timer1, але обидва сигнали одночасно виходять високими, коротший - раніше низьким. Це не служить моєму проекту. Мені навіть не потрібні зміни ширини імпульсу ШІМ, мені просто потрібні два однакові сигнали типу «годинник» протилежної фази, ось і все.
Я не прошу, щоб хто-небудь писав код для мене, щоб це зробити, мені просто потрібен хтось, який підкаже мені, який режим / прапорці таймера повинні дати мені просту перевернуту форму хвилі на одному з двох контактів, пов’язаних із таймером. Якщо можливо, я хочу уникати використання зовнішньої інвертуючої схеми для одного з виходів, якщо це не єдиний варіант.
Якщо це можливо взагалі в ATTiny, це буде ще краще. ATTiny також має два штирі, пов'язані з одним таймером, але я не впевнений, що у нього є ті ж параметри, що і у ATMega.
У мене вже є підключені до друкованої плати кристали та конденсатори 20 МГц, а тактова частота 20 МГц надійно працює на ATMega328. На платі ATTiny85 у мене є 8 МГц кристал, який також надійно працює.
Будь ласка, допоможіть. Дякую.
ОНОВЛЕННЯ : У відповідях та коментарях поки що є неправдиві припущення, тому, можливо, я повинен уточнити: Зауважте, що в своєму початковому дописі я зазначив, що я використовую тактовий сигнал 20 МГц, а не 8 МГц , а також, що мені не потрібна ШІМ .
Єдиним режимом, який дає досить високу вихідну частоту, здається, є режим CTC оскільки ШІМ-режими не працюють для виходу 2 МГц. Чи є спосіб перетворити або вихід T таймера 1, або вихід B в режимі CTC?
Тепер я перейшов на стандартний Arduino Uno (ATMega328, 16 МГц) замість власної плати 20 МГц, щоб перевірити свій код, і це мій код для приємної стійкої тактової частоти 2 МГц в режимі CTC з штифтів 9 і 10, таймер 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() {
}
Сліди осцилоскопа для обох штифтів однакові та синхронізовані, як я можу отримати будь-який із двох перевернутих сигналів? Здається, режим інвертування в аркуші даних нічого не робить в режимі CTC. Чи неправильно я читаю аркуш, чи змушений буде використовувати режим нижчої частоти та ШІМ?
Щоб додати конкретне запитання "баунті" до мого оригінального запиту:
Отже, які зміни мені потрібно внести до свого коду вище, щоб він давав ідеально перевернуті сигнали на штирі 9 і 11 на максимально можливій частоті для тактового частоти 16 МГц , чи це 2 МГц чи ні?
Я буду дотримуватися стандартного Arduino Uno поки що, щоб не було режиму помилок, що вводиться моєю домотканою дошкою, і щоб кожен, хто має ардуїно, міг спробувати мій код вище і підтвердити, що він працює як я вже згадував, а не як я потрібно!