Atmel AVR mikrodenetleyicisinin Timer1'ini, Arduino'da kullanılan AtMega328'i veya ATTiny85'i, birbirinin ayna görüntüsü olan iki saat sinyali çıkışı için kullanmaya çalışıyorum. Oluşturmaya çalıştığım frekans, denetleyicide neredeyse hiçbir şey yapmak istemedikçe çıkış pinlerini değiştirmek için kod kullanarak bunu yapmak için çok yüksek olan 1 MHz ila 2 MHz veya daha fazla bir değişkendir. Bu yüzden zamanlayıcı çıkışını doğrudan ilişkili pinlerde kullanmak istiyorum. Arduino kütüphaneleri veya dili ile sınırlı olmayan GCC araç zincirini kullanıyorum.
Atmega328'deki Timer1'in kendisiyle ilişkili iki pimi vardır ve bunlardan iki özdeş 1MHz ila 2MHz sinyal alabilirim. Veri sayfası ters bir dalga formu alabileceğimi söylese de, bu beni karıştırıyor. Ayrıca Timer1 ile PWM ayarlarını kullanarak 1 MHz'de farklı görev döngüleri olan iki sinyal alabilirim, ancak her iki sinyal de aynı anda yükselir, daha kısa olan daha erken düşer. Bu benim projeme hizmet etmiyor. PWM darbe genişliği varyasyonuna bile ihtiyacım yok, sadece zıt fazın iki özdeş "saat" tipi sinyaline ihtiyacım var, hepsi bu.
Kimsenin bunu yapmak için bana kod yazmasını istemiyorum, sadece zamanlayıcının hangi modunun / bayraklarının bana zamanlayıcı ile ilişkili iki pimden birinde basit bir ters dalga şekli vermesi gerektiğini söylemesi gerekiyor. Mümkünse, tek seçenek olmadığı sürece çıkışlardan biri için harici bir ters çevirme devresi kullanmaktan kaçınmak istiyorum.
ATTiny'de bu mümkün ise, daha da iyi olacaktır. ATTiny ayrıca bir zamanlayıcı ile ilişkili 2 pime sahiptir, ancak ATMega ile aynı seçeneklere sahip olduğundan emin değilim.
Zaten 20 MHz'lik bir kristalim var ve PCB'ye bağlı kapasitörler var ve 20 MHz saat ATMega328'de güvenilir bir şekilde çalışıyor. ATTiny85 PCB'de 8 MHz'lik bir kristal var ve bu da güvenilir bir şekilde çalışıyor.
Lütfen yardım et. Teşekkür ederim.
GÜNCELLEME : Şimdiye kadar cevaplarda ve yorumlarda bazı geçersiz varsayımlar olabilir, belki de açıklığa kavuşturmalıyım: Orijinal yazımda 8 MHz değil 20 MHz saat kullandığımı ve ayrıca PWM'ye ihtiyaç duymadığımı unutmayın. .
Yeterince yüksek bir çıkış frekansı veren tek mod, PTC modları 2 MHz çıkış için çalışmadığından CTC modu gibi görünüyor . CTC modunda Zamanlayıcı 1 çıkışı A veya çıkış B'yi ters çevirmenin bir yolu var mı?
Şimdi kodumu kontrol etmek için kendi 20 MHz kartım yerine standart Arduino Uno'ya (ATMega328, 16 MHz) geçtim ve bu, kod 9 ve 10, Timer'den CTC modunda güzel bir sabit 2 MHz saat için kodum 1 çıkış pini:
#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() {
}
Her iki pim için osiloskop izleri aynıdır ve senkronize olarak, iki sinyalden nasıl ters çevrilebilirim? Veri sayfasındaki ters çevirme modunun CTC modunda hiçbir şey yapmadığı görülür. Veri sayfasını yanlış mı okuyorum yoksa sonuçta daha düşük bir frekans ve PWM modu kullanmak zorunda kalacak mıyım?
Orijinal sorguma belirli bir "ödül" sorusu eklemek için:
Peki yukarıdaki kodumda , 16 MHz saat için pin 9 ve 11'de mümkün olan en yüksek frekansta mükemmel şekilde tersine çevrilmiş sinyaller vermek için hangi değişiklikleri yapmam gerekir? 2 MHz mi yoksa değil mi?
Şimdilik standart bir Arduino Uno ile sadık kalacağım, böylece ana kartım tarafından tanıtılan bir hata modu yok ve böylece bir arduino olan herkes yukarıdaki kodumu deneyebilir ve bahsettiğim gibi çalıştığını onaylayabilirim ihtiyaç!