Ev ağ donanımı Atmega8 mikrodenetleyiciler. Yeni Başlayanlar İçin Atmega8 Programlama

Atmega8 mikrodenetleyiciler. Yeni Başlayanlar İçin Atmega8 Programlama

Bir LED'i bir G/Ç bağlantı noktası hattına bağlama

Her şeyin çok sayıda örnekle ayrıntılı olarak anlatıldığı bu materyali inceledikten sonra, AVR mikrokontrolörlerinin giriş/çıkış bağlantı noktalarında kolayca ustalaşabilir ve programlayabilirsiniz.

  • Bölüm 2. LED'i G/Ç bağlantı noktası hattına bağlama
  • Bölüm 3. Transistörün G/Ç bağlantı noktası hattına bağlanması
Mikrodenetleyici üzerinde bir örnek ele alacağız ATMega8 .

Programı yazacağız Atmel Stüdyo 6.0 .

Devreyi taklit edeceğiz Proteus 7 Profesyonel .

Mikrodenetleyicilerin incelenmesinde ilk örnek bir LED'in bağlanması ve kontrol edilmesidir; bu en basit ve en belirgin örnektir. Bu örnek, “Merhaba Dünya!” programı gibi mikro denetleyicilerin incelenmesinde bir klasik haline geldi. diğer programlama dillerini öğrenirken.
Her bir G/Ç portunun geçebileceği maksimum akım 40 mA'dır.
Her bir G/Ç bağlantı noktası hattının taşıyabileceği maksimum akım 20 mA'dır.
I/O port hatlarına LED dahil bir yük bağlamadan önce, I/O port hattında izin verilen yükü aşarak mikro denetleyiciyi yakabileceğinizi bilmeniz gerekir.
Mikrodenetleyicinin G/Ç bağlantı noktası hatlarından akan akımı sınırlamak için bir direnç hesaplayıp bağlamanız gerekir.

Şekil: LED pin çıkışı.

Şekil: LED anodunun mikro denetleyiciye bağlanması.

Şekil: LED katotunun mikro denetleyiciye bağlanması.

Bir LED bağlanırken giriş/çıkış bağlantı noktalarının hatlarına bağlanan akım sınırlama direncinin direnci aşağıdaki formülle hesaplanır:

Nerede:
- Vs- güç kaynağı gerilimi;
- Vsp- G/Ç bağlantı noktası hattındaki voltaj düşüşü;
- Vd- LED boyunca doğrudan voltaj düşüşü;
- İD- LED'de doğru akım;
- Kn- LED güvenilirlik katsayısı;

Örnek:
- güç kaynağı gerilimi - 5V;
- LED boyunca doğrudan voltaj düşüşü – 2B ;
10mA (Veri sayfasından LED'e alınmıştır);
- LED robotların güvenilirlik katsayısı – 75% (Veri sayfasından LED'e alınmıştır);
- G/Ç bağlantı noktası hattında voltaj düşüşü – 0,5V (Veri sayfasından mikrodenetleyiciye alınmıştır: Vol(çıkış düşük voltajı) – eğer akım içeri akarsa ve Voh (çıkış yüksek voltajı) – eğer akım dışarı akarsa);

Böylece direnç değeri R = 166,66Ohm, en yakın yüksek direnç değeri seçilir.

LED'in ileri gerilimi bilinmiyorsa direnç Ohm kanunu kullanılarak hesaplanabilir.

Nerede:
- sen- devrenin bir bölümüne uygulanan voltaj;
- BEN

Örnek:
4.5V;
- G/Ç bağlantı noktası hattının nominal akımı – 20mA.

Direnç değerini belirledikten sonra R gücü hesaplamak lazım P, devrede akım aktığında dirençte ısı şeklinde salınacak olan watt cinsinden ölçülür.

Nerede:
- sen– devrenin bir bölümüne uygulanan voltaj;
- BEN- G/Ç bağlantı noktası hattının nominal akımı.

Örnek:
- devrenin bir bölümüne uygulanan voltaj - 4.5V;
- LED'de ileri akım – 20mA.

Dirençlere tahsis edilen gücü hesapladıktan sonra direnç gücünün en yakın yüksek değerini seçiyoruz. Direncin güç dağıtımı yetersizse arızalanabilir.

- düşük güçlü bir LED anodunun G/Ç bağlantı noktası hattına bağlanması:

#katmak // Ana program int main(void) ( // Giriş/çıkış bağlantı noktalarını yapılandırın DDRC = 0b11111111; // C bağlantı noktasının tüm bitlerini "Çıkış" moduna yapılandırın PORTC = 0b11111111; // C bağlantı noktasının tüm bitlerini günlüğe ayarlayın "1" (Port çıkışındaki voltaj Vcc'ye eşittir) // Sonsuz döngü iken (1) ( ))

- düşük güçlü bir LED katotunun G/Ç bağlantı noktası hattına bağlanması:

// Harici kütüphaneleri dahil et #include #katmak // Ana program int main(void) ( // Giriş/çıkış bağlantı noktalarını yapılandırın DDRC = 0b11111111; // C bağlantı noktasının tüm bitlerini "Çıkış" moduna yapılandırın PORTC = 0b00000000; // C bağlantı noktasının tüm bitlerini günlüğe ayarlayın "0" (Port çıkışındaki voltaj GND'ye eşittir) // Sonsuz döngü iken (1) ( ))

- anot ve katotlu düşük güçlü bir LED'in G/Ç bağlantı noktası hattına bağlanması:

// Harici kütüphaneleri dahil et #include #katmak // Ana program int main(void) ( // Giriş/çıkış bağlantı noktalarını yapılandırın DDRD = 0b11111111; // Bağlantı noktası D'nin tüm bitlerini "Çıkış" moduna yapılandırın PORTD = 0b11111111; // Bağlantı noktası D'nin tüm bitlerini günlüğe ayarlayın "1" (Port çıkışındaki voltaj Vcc'ye eşittir) DDRC = 0b11111111; //Port C'nin tüm bitlerini “Çıkış” moduna ayarlayın PORTC = 0b00000000; //Port C'nin tüm bitlerini lojik “0” olarak ayarlayın (Port çıkışındaki voltaj GND'ye eşittir) / / Sonsuz döngü iken (1) ( ))

Basit bir konu gibi görünebilir, ancak yorumlarda bir mikro denetleyicinin nasıl bağlanacağına dair sorularla boğulmuştum. Bir LED'in, bir düğmenin, gücün ona nasıl bağlanacağı. Ne yapmalı AGND veya AREF. Neden gerekli? AVCC ve onun gibi şeyler. Yani sorular olduğuna göre konu net değil ve mümkün olduğu kadar kapsamlı bir cevap vermek gerekiyor. AVR denetleyicileri için her şeyi anlatıyorum, ancak bazı PIC'ler için her şey çok ama çok benzer. Çünkü buradaki prensipler aynıdır.

Beslenme
Mikrodenetleyicinin çalışması için enerjiye, yani elektriğe ihtiyacı vardır. Bunu yapmak için elbette onunla ilgili bir besleme başlatmanız gerekiyor. MK besleme gerilimi Atmel AVR arasında değişir 1.8 önce 5 seriye ve modele bağlı olarak volt. Tüm AVR 5 volttan çalışabilir (tamamen düşük voltajlı seriler varsa, lütfen yorumlarda açıklığa kavuşturun çünkü böylelerini görmedim). Bu nedenle kontrol cihazımızın besleme voltajının her zaman 5 volt civarında olduğunu varsayacağız. Besleme voltajının artısı genellikle şu şekilde belirlenir: Vcc. Sıfır terminali (aynı zamanda Dünya, Konut ve buna ne diyorlarsa) belirlenir GND. Örnek olarak bir bilgisayarın güç kaynağını ele alırsak. O zaman siyah kablo GND'dir (bu arada, topraklama kablosu geleneksel olarak siyaha boyanır) ve kırmızı olan +5'tir ve bu bizim olacaktır. Vcc. Mikrodenetleyiciyi pillerden besleyecekseniz pillerin eksisini şu şekilde alacağız: GND ve artı için Vcc(Asıl mesele, akülerden gelen besleme voltajının belirli bir MK için belirtilen sınırlar dahilinde olmasıdır, sorun veri sayfasındadır. Parametre genellikle özelliklerin genel açıklamasında ilk sayfada yazılır:

Çalışma Gerilimleri
–1,8 — 5,5V (ATtiny2313V)
–2,7 — 5,5V (ATtiny2313)
Hız Dereceleri
–ATtiny2313V: 0 - 4 MHz @ 1,8 - 5,5V, 0 - 10 MHz @ 2,7 - 5,5V
–ATtiny2313: 0 – 10 MHz @ 2,7 – 5,5V, 0 – 20 MHz @ 4,5 – 5,5V

Besleme voltajının alt sınırının çok daha düşük olduğu özel düşük voltaj serilerinin (örneğin 2313V düşük voltaj) bulunduğunu lütfen unutmayın. Frekanslarla ilgili bir sonraki noktaya da dikkat etmekte fayda var. Bu, maksimum frekansın besleme voltajına bağımlılığını gösterir. Düşük voltajda sınırlama frekanslarının daha düşük olduğu görülebilir. Ve alçak gerilim serileri, yüksek gerilim muadillerine göre iki kat daha yavaştır. Ancak tüm işlemciler hız aşırtma konusunda esnektir ;)))))

Seri kontrolörlerle çalışma için AVR Sadece yemek yeterli. Tüm girişlere Vcc 5 voltumuzu (veya ne varsa) uygulamanız gerekir ve tüm girişler GND yere dikilmelidir. Bir mikrodenetleyicinin birçok girişi olabilir Vcc ve birçok giriş GND(özellikle bir kare içindeyse TQFP vücut. Her taraftan çıkıntı yapan pitalovo var). Pek çok pin, kurulum kolaylığı için değil, kristalin her taraftan eşit şekilde beslenmesi amacıyla yapılmıştır, böylece dahili güç devreleri aşırı yüklenmez. Aksi takdirde, güç kaynağını yalnızca bir tarafa bağladığınızı ve çipin diğer tarafında her port hattına bir LED asıp aynı anda yaktığınızı hayal edin. Böyle bir akım yükünden çıldıran dahili ince film güç veri yolu buharlaştı ve işlemci ANINDA aldı ve görünüşte hiçbir neden yokken toynaklarını fırlattı. Bu yüzden TÜM Vcc ve GND ÇIKIŞLARI BAĞLANMALIDIR. Bunları uygun şekilde bağlayın ve açın.

Bazı sorular gündeme geliyor AGND Ve AVCC- Bu, Analogdan Dijitale Dönüştürücünün analog topraklaması ve güç kaynağıdır. ADC çok hassas bir voltaj ölçerdir, bu nedenle geleneksel güç kaynağı devresinde alışılmadık bir durum olan parazitin ölçümün kalitesini etkilememesi için ek filtrelerle çalıştırılması tavsiye edilir. Bu amaçla hassas devrelerde toprak dijital ve analog olarak ayrılır (yalnızca bir noktaya bağlanmaları gerekir) ve AVCC voltaj filtre bobini aracılığıyla sağlanır. Bir ADC kullanmayı planlamıyorsanız veya doğru ölçümler yapmayı düşünmüyorsanız, bu durumda ADC'yi kullanmak oldukça kabul edilebilir. AVCC ile aynı 5 voltu uygulayın Vcc, A AGND herkesle aynı toprağa ekin. Ama onları bağlamanız gerekir!!! AVCC'nin EMNIP'i aynı zamanda A bağlantı noktasına da güç sağlar.

Uyarı!!!

Mega8 çipinde çip topolojisi düzeyinde bir hata var gibi görünüyor - Vcc ve AVcc çipin içinde birbirine bağlı. Aralarındaki direnç yaklaşık (!!!) 5 Ohm'dur Karşılaştırma için, ATmega16 ve ATmega168'de Vcc ve AVcc arasındaki direnç onlarca MEGA ohm'dur! Veri sayfasında bu konuyla ilgili hala bir belirti yok, ancak 2004'teki AVRFreaks konularından birinde insanların ADC'nin dijital gürültüsüyle kafa kafaya verdikleri söyleniyor, ardından Atmel desteğine WTF??? diye yazdılar. Ve diyorlar ki, çipte bir hata var ve Vcc ile AVcc kristalin içine bağlı. Bu bilgiler ışığında Mega8 için gazı AVcc'ye ayarlamanın pratikte faydasız olduğunu düşünüyorum. Ancak her durumda AVcc'ye güç verilmesi gerekir; bu dahili bağlantının ne kadar güçlü olduğunu kim bilebilir?

AVR Mikrodenetleyicinin en basit bağlantı şeması aşağıda gösterilmiştir:

Gördüğünüz gibi güç devresine bir bobin eklendi AVCC ve kapasitörler. Araya yüz nanofarad seramik kapasitör yerleştirmek iyi bir uygulamadır. Vcc Ve GND her mikro devre (ve mikro devrenin çok sayıda güç girişi ve toprağı varsa, o zaman her güç kaynağı ile her toprak arasında) güç çıkışlarına mümkün olduğunca yakın - dijital devrelerin çalışmasından kaynaklanan güç veriyolundaki kısa darbe gürültüsünü düzeltir . Güç devresindeki 47 mKF'lik bir kapasitör, daha derin voltaj dalgalanmalarını yumuşatacaktır. arasındaki kondansatör AVcc Ve GND ayrıca beslenmeyi sakinleştirecek ADC.

Giriş AREF bu voltaj referans girişidir ADC. Genel olarak, hesaplanacağı göreli bir voltaj uygulayabilirsiniz. ADC ancak genellikle ya dahili bir 2,56 volt referansı kullanılır ya da AVCC, bu nedenle AREF Referans voltajının kalitesini biraz artıracak bir kapasitörün asılması tavsiye edilir. ADC(ve çıktı okumalarının yeterliliği desteğin kalitesine bağlıdır) ADC).

Devreyi sıfırla
Direnç açık SIFIRLA. Genellikle AVR kendi dahili sıfırlama devresine sahiptir ve sinyal SIFIRLA içeriden zaten 100 kOhm'luk bir dirençle yukarı çekilmiştir Vcc. ANCAK! Sıkıştırma o kadar kötü ki, mikrokontrolör her hapşırmada sıfırlanıyor. Örneğin parmakla bacağa dokunmak RST, hatta bir ücret karşılığında sadece parmağa dokunmaktan bile. Bu nedenle şiddetle tavsiye edilir RST 10k dirençle güç kaynağına çekin. Daha az değerli değil, çünkü... o zaman devre içi programcının bu sıkılmanın üstesinden gelememesi ve devre içindeki MK'nin yanıp sönmesinin mümkün olmaması ihtimali vardır. 10k doğru.

Ayrıca bu sıfırlama şeması da var:

Bunu dikkat çekici kılan şey, devre açıldığında kapasitörün deşarj olması ve voltajın artmasıdır. RST sıfıra yakın - mikrodenetleyici başlamıyor çünkü ona sürekli bir sıfırlama. Ancak zamanla bir direnç aracılığıyla kapasitör şarj olacak ve voltaj artacaktır. RST log1'e ulaştığında MK başlayacaktır. Düğme, gerekirse sıfırlamayı zorlamanıza olanak tanır.

Bu örnekte gecikme yaklaşık olarak T=R*C olacaktır - yaklaşık bir saniye. Bu gecikme neden? Evet, en azından karttaki tüm cihazlara güç verilmeden ve sabit duruma ulaşmadan MK'nin başlamaması için. Eski MK'lerde ( AT89S51örneğin) böyle bir zincir ilk sıfırlamayı sağlamadan MK hiç başlamayabilir.

Temel olarak, AVR Gerekirse başlatma gecikmesi programlı olarak yapılabilir - aktif eylemleri başlatmadan önce bunu yarım saniye kadar azaltın. Böylece Conder atılabilir. Ve düğme... ne istersen. Harici bir taneye ihtiyacınız var mı? SIFIRLA? O zaman bırak. Genelde bırakıyorum.

Saat kaynağı
Saat üreteci mikro denetleyicinin kalbidir. Her darbe için denetleyicinin içinde bir tür işlem meydana gelir - veriler kayıtlar ve veri yolları aracılığıyla gönderilir, bağlantı noktası pinleri değiştirilir, zamanlayıcılar tıklanır. Saat frekansı ne kadar hızlı olursa, MK eylemlerini o kadar hızlı gerçekleştirir ve daha fazla enerji tüketir (mantık kapılarını değiştirmek enerji gerektirir, ne kadar sık ​​geçiş yaparlarsa o kadar fazla enerjiye ihtiyaç duyulur).

Darbeler, mikro denetleyiciye yerleştirilmiş bir saat üreteci tarafından ayarlanır. Ancak harici bir jeneratör de olabilir, her şey çok esnek bir şekilde yapılandırılmıştır! Dahili jeneratörün çalışma hızı, mikro denetleyicinin ve kablo demetinin ayarlarına bağlıdır.


Jeneratör şunlar olabilir:

  • Dahili ana RC devresi ile dahili.
    Bu durumda hiçbir bağlamaya gerek yoktur! Ve XTAL1 ve XTAL2 pinleri hiçbir şekilde bağlanamaz veya normal giriş/çıkış bağlantı noktaları olarak kullanılabilirler (eğer MK buna izin veriyorsa). Genellikle 4 dahili frekans değerinden birini seçebilirsiniz. Bu mod varsayılan olarak ayarlanmıştır.
  • Harici ana RC devresi ile dahili.
    Burada mikrodenetleyicinin dışına bir kapasitör ve direnç bağlamanız gerekecektir. Direnç değerini ayarlayarak saat frekansını anında değiştirmenizi sağlar.
  • Harici ana kuvars ile dahili.
    Dışarıya bir kuvars rezonatör ve bir çift kapasitör yerleştirildi. Kuvars düşük frekanslıysa (1 MHz'e kadar), kapasitörler kurulmaz.
  • Harici.
    Başka bir cihazdan, saati ayarlayan MK girişine dikdörtgen bir sinyal gönderilir. Bu mod, örneğin birden fazla mikro denetleyicinin tek bir jeneratörden katı senkronizasyonla çalışmasına ihtiyaç duyduğumuzda kullanışlıdır.

Farklı planların farklı avantajları vardır:
Ne zaman dahili RC devresi Kartta yerden tasarruf ediyoruz, ek parçalara ihtiyacımız yok ama maksimum frekansa ulaşamıyoruz ve frekans biraz sıcaklığa bağlı ve dalgalanabiliyor.

Harici kuvars mükemmel bir doğruluğa sahiptir, ancak fazladan 15 rubleye mal olur ve ek parçalar gerektirir ve en rahatsız edici olanı, çoğu zaman birkaç G/Ç ayağını yer. Ayrıca harici kuvars kullanarak MK'den maksimum performans elde edebilirsiniz. MC frekansı, seçilen kuvarsın keskinleştirildiği frekansa göre belirlenir. Harici RC devresi MK osilatörünün dahili olandan daha hızlı çalışmasını sağlar, kuvarstan daha az maliyetlidir, ancak frekans kararlılığı konusunda dahili RC devresiyle aynı sorunlara sahiptir.

MK'nin saatini ölçmeye yönelik yöntemler, bölümdeki veri sayfasında açıklanmaktadır. Sistem Saati ve Saat Seçenekleri ve tamamen konfigürasyona göre belirlenir Sigorta Uçları. Bu arada şiddetle tavsiye ederim SİGORTAYA DOKUNMAYIN Ne yaptığınızı ve nedenini kesin olarak öğrenene kadar. Çünkü Bir şeyi yanlış ayarlayarak, mikrodenetleyiciyi çok hızlı bir şekilde işe yaramaz bir silikon parçasına dönüştürebilirsiniz, onu hayata döndürmek çok zor olacaktır (ama mümkün!)

LED'leri ve düğmeleri mikrodenetleyiciye bağlama
Mikrodenetleyici, dış dünyayla etkileşimi olmadan tek başına ilginç değildir - içeride ne yaptığı kimin umurunda? Ama bunu bir şekilde gösterebilir veya etkileyebilirseniz...

Böylece düğme ve LED aşağıdaki şekilde bağlanır:


Düğme için seçilen G/Ç ayağını düğme aracılığıyla toprağa bağlamanız gerekir. Çıkışın kendisi şu şekilde yapılandırılmalıdır: pull-up ile giriş(DDRxy=0 PORTxy=1). Daha sonra düğmeye basılmadığında pull-up direnci aracılığıyla girişte ve bitlerden yüksek bir voltaj seviyesi oluşacaktır. PINhu Okurken 1 verecektir, butona basıldığında giriş topraklanacak ve üzerindeki voltaj sıfıra düşecektir, bu da demektir ki PINxy 0 okunacaktır. Kayıt bitlerindeki sıfırlara göre PINх düğmelere basıldığını biliyoruz.

Noktalı çizgi ek bir çekme direncini göstermektedir. AVR'nin içindeki bağlantı noktasına bir pull-up bağlanabilmesine rağmen oldukça zayıftır - 100 kOhm. Bu, yanlış alarma neden olacak şekilde parazit veya parazit nedeniyle kolayca yere sabitlenebileceği anlamına gelir. Ve bu dahili çekme dirençleri parazit nedeniyle yanmayı gerçekten seviyor. Zaten PullUp dirençleri öldürülmüş bir düzine mikrodenetleyicim var. Her şey çalışıyor, ancak sıkma yok - yandı. Dışarıya bir direnç asıyorsunuz ve sanki hiçbir şey olmamış gibi çalışıyor. Bu nedenle, kritik devreler için, 10 kOhm'luk bir harici çekme eklemenizi şiddetle tavsiye ederim - dahili olan kapalı olsa bile, harici olan hizmet verecektir. Öğrenme süreci sırasında bunu unutabilirsiniz.

Işık yayan diyot bağlantı noktasına iki şekilde bağlanır. Şemaya göre Liman karası veya Bağlantı Noktası Gücü. İlk durumda, diyotu ateşlemek için log1 portuna yüksek bir seviye çıkışı vermeniz gerekir (yaklaşık olarak Vcc'ye eşit). İkinci durumda, diyotu yakmak için, porta log0 çıkışını yapmanız gerekir - düşük bir seviye (sıfıra yakın). İçin AVR Hiçbir fark yok gibi görünüyor, ancak birçok eski mikrodenetleyici serisi yukarıya göre çok daha iyi aşağı çekildi, bu nedenle Port-Power devresi daha yaygındır. Her iki şemayı da PCB düzeninin rahatlığına dayanarak kullanıyorum. Yazılım düzeyinde pek bir fark yok.
LED ile çalışacak bağlantı noktası pini şu şekilde yapılandırılmalıdır: çıkış(DDRxy=1) ve ardından PORTxy'deki değere bağlı olarak pin yüksek veya düşük voltaj seviyesine sahip olacaktır.

Işık yayan diyot bir direnç aracılığıyla bağlanmalıdır. Gerçek şu ki LED'in doğrudan direnci çok küçük. Ve içinden geçen akımı sınırlamazsanız, o zaman yanabilir. Veya daha muhtemel olanı, mikrodenetleyicinin pimini yakmak, bu arada, 20-30mA gibi bir şey çekebiliyor. Ve normal bir LED'in yanması için (şu anda her türlü LED'i düşünmüyoruz, bu canavarlar amfileri yiyebilir) yaklaşık 3...15 mA'ya ihtiyacınız vardır.

Yani, hazırlıksız olarak şunu düşünüyoruz:

  • MK ayağının çıkışındaki voltaj yaklaşık 5 volttur, LED üzerindeki voltaj düşüşü genellikle yaklaşık 2,5 volttur (daha yüksek olamaz, aksi takdirde diyot gerekenden daha fazla akım tüketir ve boğularak güzel duman yayar)
  • Böylece sınırlama direncinin alması gereken voltaj 5-2,5 = 2,5V olacaktır.
  • 5mA'lik bir akıma ihtiyacımız var - LED'i beslemenin bir anlamı yok, aydınlatmaya değil göstergeye ihtiyacımız var :)
  • R=U/I= 2,5/5E-3 = 500 Ohm. Serideki en yakın olanı 510 Ohm'dur. Hadi alalım. Prensip olarak, elinize ne gelirse 220 Ohm'dan 680 Ohm'a kadar ayarlayabilirsiniz - normal şekilde yanacaktır.

Çok sayıda LED bağlamanız gerekiyorsa, her birinin kendi direnci vardır. Elbette açgözlü davranıp herkese bir direnç koyabilirsiniz. Ancak burada bir serseri olacak - yalnızca bir direnç var, ancak çok sayıda diyot var! Buna göre, ne kadar çok diyot ateşlersek, her biri o kadar az akım alacaktır - bir dirençten gelen akım dörde bölünecektir. Ancak daha küçük bir direnç koyamazsınız - çünkü bir diyot ateşlendiğinde, dört için akımın bir kısmını alacak ve kanatçıkları birbirine yapıştıracaktır (veya portu yakacaktır).

Birkaç devre tasarımı tuhaflığı veya pinlerin kaydedilmesiyle ilgili birkaç kelime

Lehimlenemeyen şeyin programlanması gerekir. (C) halk bilgeliği.

Çoğu zaman denetleyicinin belleğinin görev için fazlasıyla yeterli olduğu ve performansın en üst düzeyde olduğu ancak yeterli bacağın olmadığı görülür. Bu nedenle, sırf daha fazla pini olduğu için yedekli ve daha pahalı bir mikrodenetleyici kurmanız gerekir. Program kodunu karmaşıklaştırarak donanımdan nasıl tasarruf edebileceğinize dair size birkaç örnek göstereceğim.

Bu tür tasarrufların temel taşı genellikle pin atamalarının zaman içinde dinamik olarak ayrılması ilkesidir. Yani, örneğin, bir çıkış herhangi bir veri yolu üzerinde çalışabilir ve veri yolu aktif olmadığında, aynı çıkış aracılığıyla bir düğmenin durumunu kontrol edebilir veya başka bir veri yolu üzerinden bir şey iletebilirsiniz. İki farklı görev arasında hızlı bir şekilde (saniyede onlarca hatta binlerce kez) geçiş yaparak "eş zamanlı çalışma" etkisini elde edebilirsiniz.

Buradaki en önemli şey iki kurala uymaktır:

  • İki farklı uygulama birbirini etkilememelidir; Zaman ayrımı, bitişik bir fonksiyonun test edilen fonksiyonun sonucunu bozmayacağı şekilde oluşturulmalıdır.
  • Hiçbir durumda voltaj seviyeleri çakışmamalıdır.

Sana bir örnek vereyim:

  • Belirli bir sensörden gelen çıkışın ve bir düğmenin asıldığı bir pinimiz var. Aktif modda sensör çıkışı 0, 1, sensöre Etkinleştirme sinyali gelmediğinde ise Hi-Z olabilir.
  • Düğme, kısa devre yoluyla hatta sert bir 0 verir.

Nasıl çalışması gerekir:
Diyelim ki çoğu zaman mikrodenetleyici girişini Hi-Z girişi için yapılandırdık ve Enable sinyalinin de uygulandığı sensörden okumalar aldık. Bir butonu yoklamamız gerektiğinde Enable'ı sensörden uzaklaştırıyoruz ve çıkışları Hi-Z moduna geçiyor ve bize müdahale etmiyor. Mikrodenetleyici çıkışını Pull-Up moduna geçiriyoruz ve girişte sıfır olup olmadığını kontrol ediyoruz - basılan düğmenin sinyali. Kontrol ettin mi? MK girişini Hi-Z girişine aktarıp sensöre tekrar Enable uyguluyoruz. Ve saniyede pek çok kez.

Burada iki çelişkimiz var:

  • Mantıksal çelişki
    Hattaki 0, iki durumda sensörden veya düğmeden olabilir. Ancak bu durumda sağduyuyu ve gerekli işlevselliği kullanarak mantıksal çelişkiyi görmezden gelebiliriz.

    Sadece düğmeye basmanın sensör okumalarını bozduğunu bileceğiz, bu da sensör çalışırken düğmeye basmayacağımız anlamına geliyor. Ve sensör okumalarının bir düğmeye basmakla karıştırılmaması için, sensörden veri beklediğimiz anda düğmeyi yoklamıyoruz. Elbette bu aptalca eylemlere karşı koruma sağlamayacaktır. Ancak örneği basitleştirmek için kusursuz korumayı şu anda hesaba katmıyorum.

  • Elektriksel çelişki
    Sensör 1'i ayarlarsa ve düğmeye basarsak, aynı kablodaki GND ve Vcc'nin anlaşamayacağı ve birinin öleceği açıktır. Bu durumda, sensörün çıkışı daha zayıf olduğundan ölecektir - zayıf bir transistörün bakır bir düğmeyle rekabet etmesi mümkün değildir.

    Böyle bir çelişki organizasyonel yöntemlerle çözülemez - hattaki voltajı gözle belirlemek ve düğmeye basıp basmayacağınıza karar vermek imkansızdır. Ve programın şu anda nerede olduğu ancak tahmin edilebilir. Bu nedenle şematik olarak çözeceğiz.
    Buton devresine bir direnç ekleyelim, direnç küçüktür, hattın en zayıf terminalinin maksimum akımına göre hesaplanır.

    Örneğin, sensör çıkışı 10mA'dan fazlasını sağlayamıyorsa, o zaman Vcc'den GND'ye geçen akımın bu değeri aşmayacağı şekilde bir rezistöre ihtiyacımız var. 5 volt beslemeyle 510 ohm olacaktır. Artık sensör tarafından hatta log1 yüksek seviye olsa bile butona basmak mantıksal seviyede bozulmaya bile neden olmayacaktır çünkü direnç, bağlantı noktasının maksimum yükü dikkate alınarak tasarlanmıştır

Örnek biraz kaotik çıktı ama özün açık olduğunu düşünüyorum. Sadece nasıl yapıldığını değil, neden yapıldığını da görüp anlamanızı istiyorum :)

Tek ayak üzerindeki çeşitli işlevlere birkaç örnek:
İlk önce, İSS konektörü. Uzun zaman önce, programdaki hataları ayıklayana kadar bir mikro denetleyiciyi önce programcı bloğuna, sonra panoya, sonra tekrar tekrar sokmanın nasıl bir şey olduğunu unuttum. ISP konnektörünün 6 pini kart üzerinde dışarı çıkıyor ve hata ayıklama sırasında programlayıcı her zaman karta takılı oluyor ve bazen programı her 10 dakikada bir birkaç kez değiştiriyorum. Sordum ve kontrol ettim. Çalışmıyor? Düzelttim, tekrar flashladım... Çalışana kadar böyle devam etti. MK'nin yanıp sönme kaynağı binlerce kez hesaplanır. Ancak ISP konektörü pinleri yiyor. En fazla 3 adet - MOSI, MISO, SCK.

Prensip olarak bu pinlere düğme de takabilirsiniz. Bu durumda kimse kimseyi rahatsız etmeyecek, asıl önemli olan ürün yazılımı sırasında bu düğmelere basmamaktır. Ayrıca LED'leri de asabilirsiniz (bu durumda en basit olanı başarısız olabilir, ancak aferin!), ardından ürün yazılımını yanıp sönerken çok neşeyle titreyecekler :)))

Ayrıca ISP'nin altındaki hatta başka bir şey de asabilirsiniz, asıl önemli olan böylece donanım yazılımını güncellerken bu BİR ŞEY aniden tuhaflaşmaya başlamaz. Örneğin, 100 kilogramlık bir manipülatörün kontrolü ISP hattında asılı kalıyor ve ürün yazılımı sırasında bir sürü çılgın veri aldı - bu yüzden çıldırabilir ve birinin kafasını parçalayabilir. Genel olarak düşünmeniz gerekiyor. Ancak veri yolu arayüzü aracılığıyla çalışan bir şeyle aşağıdaki şema işe yarayacaktır:

Çıkışı 0'dan 1'e değiştirip üst ve alt diyotu açıyoruz. Her ikisini de yakmamız gerekiyorsa, mikrodenetleyici çıkışını moduna geçirmemiz yeterlidir. Merhaba-Z ve sanki orada değilmiş gibi ve diyotlar bir geçiş akımıyla yanacak. Veya diyotları hızlı bir şekilde aralarında değiştirin, bu durumda her ikisi de gözle yanacaktır. Devrenin dezavantajı açıktır - diyotlar söndürülemez. Ancak plana göre en azından birinin yanması gerekiyorsa neden olmasın? Güncelleme: Daha sonra LED'leri ve dirençleri toplam voltaj düşüşlerinin besleme voltajı seviyesinde olacak şekilde seçmenin mümkün olduğunu düşündüm ve bu durumda toplam dirençler akımı bacak Hi-'deyken çok küçük bir seviyeye taşıyacak. Z, diyotlar hiç yanmayacak. En azından gözle hiç fark edilmeyecektir. Zifiri karanlık hariç.

Bir sonraki seçenek bacaklardan tasarruf etmez, ancak iki diyota güç veya toprak veriyolunu sürüklemeden baskılı devre kartının düzenini basitleştirmenize olanak tanır:

Düğmelere de benzer taktikler uygulayarak kablolamayı basitleştirebilir veya 6 düğmeyi üç ayak boyunca dağıtabilirsiniz.
Burada da her şey basit - bir bacak kaldırıyor, ikincisi onu yere indiriyor. Düğmeye basılması, çekme ayağında voltaj düşüşüne neden olur. Program bunu algılar ve sırayla her düğmeyi yoklar. Daha sonra bacakların rolleri değişir ve bir sonraki düğme seçilir.

Altı düğmeli modda durum benzerdir - bir bacak kaldırmayı sağlar, diğeri yere basar ve üçüncüsü bir Hi-Z paçavra gibi davranır ve yansıtmaz. Ancak bir yan etkisi var. Mesela “B” butonunu soruyoruz. Bunu yapmak için üst satırı şuraya yerleştiriyoruz: pull-up ile giriş(PORTxy=1, DDRxy=0), ortalama şunu verir düşük çıkış seviyesi(PORTxy=0, DDRxy=1), düşük olan sürece dahil olmadığı için sürece katılmaz. Merhaba-Z(PORTxy=0, DDRxy=0). “B” tuşuna basarsak o anda üst satır sarkacak ve program “B” tuşuna basıldığını anlayacaktır ancak “B” tuşuna basmayıp “E” ve “B” tuşuna basarsak ” aynı zamanda üst satır da sarkacak ve program orada olmamasına rağmen “B” ye basıldığını düşünecek. Bu planın dezavantajları, tıklamaların yanlış işlenebilmesidir. Dolayısıyla, cihaz her şeyi ayrım gözetmeksizin kullanan cahil operatörler tarafından kullanılacaksa, böyle bir plandan vazgeçmek daha iyidir.

Ve son olarak bir düğmeyi ve LED'i nasıl birleştirebileceğinizi gösteren bir şema:


Aynı zamanda yalnızca dinamiklerde de çalışır. Yani, her zaman LED'in durumunu görüntüleriz - yani bağlantı noktasına 0 (diyot açık) veya Hi-Z (diyot açık değil) çıkışı yaparız. Ve bir düğmeyi yoklamamız gerektiğinde, geçici olarak (birkaç mikrosaniye için) çıkışı çekme giriş moduna (DDRxy=0 PORTxy=1) geçirir ve düğmeyi dinleriz. Çıkışta güçlü bir yüksek seviyenin olduğu mod (DDRxy=1 PORTxy=1) hiçbir koşulda etkinleştirilemez çünkü Düğmeye bastığınızda bağlantı noktasını yakabilirsiniz.

Eksileri - düğmeye bastığınızda, ona nasıl bakarsanız bakın LED yanar. Ancak bu bir hata değil, bir özellik olabilir :)

Bunlar turtalar. Şimdi tüm bu dinamik özellikleri + kendi algoritmasını uygulayan bir program hayal edin. Ya sonsuz bir anket dizisi ya da her türden bayraktan oluşan bir lejyon ortaya çıkıyor. Bu gibi durumlarda, en basit sevk veya işbirlikçi sevk, doktorun emrettiği şeydir; her anketi görevinizin döngüsü boyunca yürütürsünüz ve endişelenmezsiniz. Ama her yerde biraz ATTiny2313 kullanıyorsunuz ve Mega8'i veya daha şişman bir şeyi aynı göreve itenlere alaycı bir şekilde bakıyorsunuz :)

Hiçbir şey bilmiyorum ve bir şeyleri yakmaktan korkuyorum, ne yapmalıyım???

Korkmayın ve yapın. Sonuçta bir mikrodenetleyici, ölümünden yakınacağınız kadar pahalı bir şey değildir. Çöpe attım ve çantadan yenisini çıkardım. En kötü ihtimalle, eğer gerçekten korkutucuysa, her şeyin zaten olması gerektiği gibi lehimlendiği ve kablolandığı hazır bir demo kartı satın alabilirsiniz. Tek yapmanız gereken programlamak ve sonucu görmek.

Daha sonra demo ödemesinin nasıl yapıldığı örneğini kullanarak kendinize ait bir şey yapmaya çalışın. Demo panosunun kendisi bir mikro denetleyici + bazı başlangıç ​​​​çevre birimleridir; bu, bir dizi basit deney için yeterlidir ve diğer cihazlara bağlanmayı ve çalışmayı kolaylaştırabilir. Deneyimlerime dayanarak tasarlanan ve tüm ileri eğitim kursunun dayanacağı STK500 veya AVR Butterfly gibi markalı sistemler veya benimki gibi farklı demo panoları var.

Farklı AVR mikrodenetleyici modelleri hakkında nasıl bilgi arayacağımızı öğreneceğiz ve Linux işletim sisteminde PDF belgelerinin nasıl okunacağını anlayacağız. Birkaç iletken kullanarak ISP arayüzünü kullanarak bir mikro denetleyiciyi bir programcıya nasıl bağlayacağımızı öğrenelim.

Mikrodenetleyici çipini programlayıcıya doğru şekilde bağlamak için nerede olduğunu ve hangi pinlere sahip olduğunu bulmanız gerekir. İlgilendiğimiz mikrodenetleyici hakkında kapsamlı bilgi edinmek için resmi web sitesinden veri sayfasını indirin ( veri Sayfası) ilgilendiğimiz çip için - ATMEL mikrokontrolörleri için veri sayfaları.

Veri sayfasının ilk sayfası, mikro denetleyicinin yeteneklerinin ayrıntılı bir açıklamasını sağlar ve ardından her bir durum türü için mikro devrelerin pin şeması verilir. AVR çipinin her veri sayfası İngilizce olarak pek çok ayrıntılı bilgi içerir; örneğin, ATmega8 mikro denetleyicisinin veri sayfası 326 sayfa içerir!

İngilizce bilmiyor musun? - biraz çalışmaya çalışın, radyo elektroniği ve bilgisayar teknolojisinin modern dünyasında onsuz artık çok zor, evrensel bir uluslararası dildir. Bu arada, bir kelimenin veya cümlenin ne anlama geldiğini bilmiyorsanız, bunu çeviri.google.com makine çeviri hizmeti aracılığıyla çevirin.

Linux'ta PDF Belgelerini Okumak

Kural olarak, mikro devreler için tüm veri sayfaları şu formatta sağlanır: PDF'ler(Taşınabilir Belge Formatı), Adobe Systems tarafından geliştirilen, farklı platformlarda kullanıma yönelik bir elektronik belge formatıdır.

Windows için PDF belgelerini okumak ve bunlarla çalışmak için birçok farklı program vardır. İşletim sisteminde Linux PDF formatı ayrıca mükemmel yazılım desteğine sahiptir.

  • Okular, KDE masaüstü ortamında bulunan çok yönlü ve güçlü bir belge görüntüleyicidir;
  • Qpdfview - PDF, DjVu ve PS formatlarındaki belgeleri görüntülemek için basit ve hafif bir program;
  • Evince (Belge Görüntüleyici) - PostScript (PS), EPS, DJVU, DVI, PDF için çok hızlı ve hafif bir belge görüntüleyici;
  • Xpdf, yüksek performanslı bir PDF görüntüleyicidir.

PDF'yi Linux'ta görüntülemek için hangi programı seçmeliyim? - Okular ve Evince programları görevleriyle çok iyi başa çıkıyor.

KDE masaüstü ortamınız kuruluysa, büyük olasılıkla Okular programı sistemde zaten mevcuttur. Okular kurulu değilse, bunu şu komutla düzeltebilirsiniz:

Sudo apt-get install okular okular-ekstra-arka uçlar

KDE - GNOME, XFCE, UNITY dışında bir çalışma ortamınız varsa Evince'i kurmak daha ekonomik bir çözüm olacaktır çünkü Okular programını bu ortamlara kurmak KDE çalışma ortamından bazı bileşenler gerektirecektir.

Pirinç. 1. Linux için evrensel belge görüntüleyici Evince - PDF belgelerini mikrodenetleyicilerde sayfalamak için bir araç.

Evince belge görüntüleyici, büyük belgeleri açma konusunda çok iyidir ve bazen Okular'ın okuyamadığı belgelerle baş edebilir. Evince'in Linux'a Kurulumu:

Sudo apt-get install evince

Artık GNU Linux işletim sistemi altında PDF formatındaki belgeleri okurken sorun yaşamayacağınızı düşünüyorum.

AVR mikro denetleyicisini programlayıcıya bağlama

Yukarıda mikrodenetleyiciyi programlayıcıya bağlamak için ISP pinlerini bağlamanız gerektiği söylendi: VCC, GND, MISO, MOSI, SCK, RST. Bu isimlerdeki pinler tüm mikrodenetleyicilerde mevcut olduğundan veri sayfası bize yardımcı olacaktır.

Pirinç. 2. ATmega8 mikro denetleyicisinin pin çıkışı ve ISP'ye (USB ASP) bağlanması.

USB ASP programlayıcının ISP konektöründe +5V (VCC) voltajı vardır, bu nedenle çipi programlamak için programlayıcıdan veya daha doğrusu bağlı olduğu USB bağlantı noktasından gelen gücü kullanabilirsiniz.

COM ve LPT bağlantı noktalarını kullanan daha önce tartışılan programlayıcılarda VCC çıkışı yoktur, bu da bu programlayıcıları kullanırken mikro denetleyicinin GND (-) ve VCC (+) pinlerine bir kablodan 5V besleme voltajı verilmesi gerektiği anlamına gelir. dış kaynak.

Mikrodenetleyiciyi lehimsiz bir devre tahtası üzerindeki USB ASP programlayıcısına bağlamak, atlama telleri (her iki ucunda pin bulunan iletkenler) kullanılarak gerçekleştirilmesi çok kolaydır.

Pirinç. 3. USB ASP programlayıcısını lehimsiz devre tahtası üzerindeki ISP konektörüne bağlayın.

Bugün daha basit bir mikrodenetleyici kullanmaya çalışacağız ATtiny2313 ve ona 16 karakterlik iki satır içeren bir karakter LCD ekranı bağlayın.

Ekranı standart 4 bitlik şekilde bağlayacağız.

Önceki derslerden ekrana zaten çok aşina olduğumuz için öncelikle elbette mikro denetleyiciyle başlayacağız.

Denetleyici veri sayfasını açalım ATtiny2313 ve pin şemasını görelim

Bu denetleyicinin iki tür kasada mevcut olduğunu görüyoruz, ancak onu bir DIP paketinde aldığım için kasanın bu özel versiyonunu ele alacağız ve prensip olarak görünüş dışında pek farklılık göstermiyorlar, peki sayı nasıl bacak sayısı aynı - her biri 20 adet.

Üzerinde çalıştığımız ve çalışmaya devam edeceğimiz ATMega8 kontrol cihazının 28 ayağına kıyasla 20 ayağı olduğundan, dolayısıyla olasılıklar da daha az olacaktır.

Prensip olarak ATmega8'in sahip olduğu her şey burada, tek şey daha az sayıda bağlantı noktası pençesinin olması. Ancak önümüzdeki görev onu SPI veri yolu üzerinden başka bir denetleyiciye bağlamayı denemek olduğundan, bu bizi çok fazla üzmüyor.

Başka farklılıklar da var, ancak bunlar önemsizdir ve gerektiğinde onları tanıyacağız.

Şöyle bir devre kuralım (resmi büyütmek için resme tıklayın)

Ekran, D bağlantı noktasının pinlerine bağlanır. PD1 ve PD2 kontrol girişlerine, geri kalanı ise D4-D7 ekran modülünün pinlerine bağlanır.

TINY2313_LCD isminde bir proje oluşturalım, ekranı Atmega8'e bağlamak için projedeki ana modül dışındaki her şeyi içine aktaralım.

Elbette bazı şeylerin yeniden yapılması gerekecek. Bunu yapmak için hangi bacağın neye bağlı olduğunu dikkatlice incelemeniz gerekir. Ekranın E veri yolu PD2'ye ve RS veri yolu PD1'e bağlı, bu yüzden dosyada değişiklik yapalım lcd.h

#tanımlamake1LİMAN|=0b0000 01 00 // E satırını 1 olarak ayarladık

#tanımlamake0LİMAN&=0b1111 10 11 // E satırını 0 olarak ayarladık

#tanımlamakrs1LİMAN|=0b00000 01 0 // RS hattını 1'e (veri) ayarladık

#tanımlamakrs0LİMAN&=0b11111 10 1 // RS hattını 0'a ayarlayın (komut)

Kalın yazı tipinden de görebileceğimiz gibi, bu kadar köklü değişiklikler yaşamadık.

Şimdi bilgi girişleri. Burada PD3-PD6 bacaklarını kullanıyoruz, yani Atmega8 bağlantısına göre 1 puan kaydırılıyorlar, bu yüzden dosyadaki bir şeyi de düzelteceğiz. lcd.c işlevde yarım bayt gönder

LİMAN&=0b 1 0000 111; // DB4-DB7 girişlerindeki bilgileri silin, gerisini kendi haline bırakın

Ama hepsi bu değil. İletilen veriyi daha önce 4 birim kaydırmıştık, ancak şimdi yukarıdaki değişiklikler nedeniyle yalnızca 3 birim kaydırmamız gerekecek. Bu nedenle aynı fonksiyonda ilk satırı da düzelteceğiz.

C<<=3 ;

Değişikliklerin hepsi bu. Katılıyorum, o kadar da iyi değiller! Bu, her zaman evrensel kod yazmaya çalışmamız ve makro ikameler kullanmamız sayesinde elde edilir. Eğer bir anda buna vakit ayırmamış olsaydık, kütüphanemizin hemen hemen tüm fonksiyonlarındaki kodları düzeltmek zorunda kalacaktık.

Ana modülde, D portunun başlatılmasına dokunmuyoruz; ders 12'deki gibi tüm modülün çıkış durumuna geçmesine izin verin.

Projeyi bir araya getirmeye çalışalım ve önce sonucu Proteus'ta görelim, çünkü bunun için bir proje de yaptım, bu da Atmel Studio projesiyle birlikte ekteki arşivde olacak.

Bizim için her şey harika çalışıyor! Bu şekilde bir kontrolör için bir projeyi diğerine hızlı bir şekilde yeniden oluşturabilirsiniz.

Proteus çok iyi ama gerçek ayrıntılara bakmak her zaman daha güzel. Bu kontrolör için bir hata ayıklama panosu yapmadığım veya monte etmediğim için devrenin tamamı bir devre tahtası üzerine monte edildi. Programlayıcıyı bunun gibi standart bir konektörle bağlayacağız

İşte diyagramın tamamı

Burada her şey standart. RESET'e vb. çekme direnci.

Şimdi denetleyiciyi avrdude'da flaşlamadan önce denetleyiciyi seçmemiz ve flash belleğini okumamız gerekiyor.

Daha sonra SİGORTALAR sekmesine gidin ve sigortaları doğru şekilde ayarlayın. Kuvars rezonatörümüz olmadığı için sigortaları bu şekilde takıyoruz

Saat yöntemleri

MK'yi saatlemenin kanonik yolu, bir kuvars rezonatörünü karşılık gelen pimlere bağlamaktır (Şekil 18.11, a). Tipik bir durumda C1 ve C2 kapasitörlerinin kapasitansı 22-36 pF olmalıdır (kuvarsın dahil edilmesi için bkz. Bölüm 15). Çoğu Tiny ve Mega modelde tüketimi düzenlemenize olanak tanıyan özel bir yapılandırma biti bulunur. Bu bit bire (programlanmamış) ayarlandığında salınım genliği azalır, ancak olası frekans aralığı ve genel gürültü bağışıklığı daralır, bu nedenle bu modun kullanılması önerilmez (aşağıya bakın). Düşük frekanslı bir kuvars rezonatör de kullanılabilir (örneğin, 32.768 Hz'lik bir "saat"), C1 ve C2 kapasitörlerinin kurulmasına gerek yoktur, çünkü eğimi O değerine ayarlarken dahili 36 pF kapasitörler dahil edilir. MC'de bağlanır.

Kuvars yerine seramik rezonatör kullanılabilir. Bu hatların yazarı, aynı bağlantıda kuvars yerine minyatür bir endüktans kullanarak (4,7 μH değeri ve 91 pF kapasitör kapasitesiyle, frekans yaklaşık 10 MHz'dir) MK'yi standart dışı frekanslarda çalıştırmayı başardı.

Pirinç. 18.11. Aşağıdakileri kullanarak bir AVR mikro denetleyicisinin saatini belirleme yöntemleri: a - bir kuvars rezonatör; b - harici jeneratör; c - RC zincirleri

Doğal olarak MK, harici bir jeneratörden de saatlendirilebilir (Şekil 18.11, b). Bu, özellikle MK'yi harici bileşenlerle senkronize etmeniz gerektiğinde veya uygun jeneratörler (örneğin, Epson'un SG-8002 serisi) kullanıldığında çok hassas bir saat frekansına sahip olmanız gerektiğinde kullanışlıdır.

Aksine, doğruluk gerekmediğinde harici bir LAN zinciri kullanabilirsiniz (Şekil 18.11, c). Bu devrede C1 kapasitansı en az 22 pF olmalı ve R1 direnci 3,3-100 ohm aralığından seçilmelidir. Bu durumda frekans, F = 2/3 RC formülü ile belirlenir, SCR konfigürasyon hücresine mantıksal bir sıfır yazarsanız CI hiç ayarlanamaz, böylece dahili bir 36 pF kapasitör bağlanır.

Son olarak, hiçbir harici bileşen olmadan da yapabilirsiniz - yaklaşık 1, 2, 4 ve 8 MHz'e eşit dört frekansta çalışabilen yerleşik IG jeneratörünü kullanın. Bu özellik en iyi düşük seviye modlarda kullanılır (1x Tiny, 8 pinli bir pakette mevcuttur - daha sonra bir rezonatör veya harici osilatör bağlamak için tasarlanan pinler, normal G/Ç bağlantı noktaları gibi başka amaçlar için kullanılabilir. Klasik ailesi yerleşik RC osilatörü yoktu.

Varsayılan olarak, Tiny ve Mega ailelerinin MK'leri 1 MHz frekansında (cksel = oooi) yerleşik osilatörle çalışacak şekilde ayarlanmıştır, bu nedenle diğer modlarda çalışmak için cksel yapılandırma hücrelerini buna göre ayarlamanız gerekir (bkz. Tablo 18.1). Bunun pratikte nasıl yapılacağı 19. Bölüm'de tartışılacaktır. 1 MHz ve üzeri geleneksel rezonatörler için bu hücrelerin önerilen değeri, cksel hücrelerinde birler ve sk'de sıfırdır.

Detaylar

Hücreleri kurarken, cksel = oooo durumunun (kuvars rezonatör iiii için en yaygın kullanılan değere göre ayna) MK'yi harici bir osilatörden saat moduna geçirdiği ve bu durumda bile yapamayacağı dikkate alınmalıdır. harici bir frekans uygulanmadan programlanabilir. Ayrıca, modu düşük frekanslı bir rezonatörle ayarlamaya çalışırsanız, yüksek frekanslı MC artık başlamayacaktır ve tüm programcılar bu kadar düşük saat frekanslarında çalışamaz. Bu nedenle, sadece cksel'i değil, hücreleri manipüle ederken, son derece dikkatli olmanız ve tam olarak ne kurduğunuza dair iyi bir fikre sahip olmanız gerekir. Bu konu bir sonraki bölümde daha ayrıntılı olarak tartışılmaktadır.

Tablo 18.1. CKSEL konfigürasyon hücrelerinin saat modlarına göre ayarlanması

Saat kaynağı

Harici frekans

Dahili /?C-jeneratörü

Dahili RC osilatörü

Dahili /?C-jeneratörü

Dahili RC osilatörü

Harici RC zinciri

Harici /?C zinciri

Harici RC zinciri

Harici RC zinciri

Düşük frekanslı rezonatör

Tablo 16.1 (son)

Saat kaynağı

Seramik rezonatör

Seramik rezonatör

kuvars rezonatör

Kuvars rezonatör

Paralel G/Ç bağlantı noktaları

Farklı modellerde G/Ç bağlantı noktaları (harici cihazlarla bilgi alışverişi için G/Ç kayıtları veya MK seri bağlantı noktalarıyla karıştırılmaması gerektiğini tekrarlıyoruz) 1'den 7'ye kadar değişebilir. Bağlantı noktaları nominal olarak 8 bittir, bazılarında durumlar Bit kapasitesi paketteki pin sayısıyla sınırlıdır ve sekizden az olabilir. Bağlantı noktaları A, B, C, D vb. harflerle gösterilir ve bu sıraların olması şart değildir: daha düşük modellerde örneğin yalnızca B ve D bağlantı noktaları (ATtiny2313'te olduğu gibi) veya genellikle yalnızca bir bağlantı noktası olabilir. B (ATtinylx'te olduğu gibi).

Kasadaki kontak sayısını azaltmak için, çoğu durumda, bağlantı noktalarına karşılık gelen harici pinler, ana işlevlerine (çift yönlü giriş/çıkış) ek olarak ek bir tane daha içerir. Sıfırlama pini dışında, alternatif modda çalışabiliyorsa özel bir port pini değişiminin gerekmediğini unutmayın. Örneğin, programınızda bir UART seri bağlantı noktasını başlatırsanız, ilgili bağlantı noktası pinleri (örneğin, ATmega8335'te bunlar PDO ve PD1 bağlantı noktası pinleridir) UART girişi ve çıkışı olarak alternatif bir işlevde çalışacaktır. Ancak pinlerin bu tür özel kullanım aralıklarında prensip olarak sıradan çift yönlü pinler olarak kullanılabilirler. Pratikte fonksiyonları birbirinden izole etmek için devre tasarımı önlemlerinin kullanılması gerekir, bu nedenle bu özelliğin kötüye kullanılması önerilmez.

Bağlantı noktası pinleri yeterince özerktir ve modları birbirinden bağımsız olarak ayarlanabilir. Varsayılan olarak, güç açıldığında tüm ek cihazlar devre dışı bırakılır ve bağlantı noktaları giriş olarak çalışır ve yüksek hızda (yani yüksek giriş empedansında) üçüncü durumda bulunur. Çıkış için çalışmak, programda veri yönü kaydında istenen çıkışa karşılık gelen biti ayarlamanız gereken özel talimatlar gerektirir (bu kayıt, DDRx olarak adlandırılır; burada x, belirli bir bağlantı noktasını belirten bir harftir; örneğin, A bağlantı noktası ddra olacaktır). Bit sıfırlanırsa (yani mantıksal sıfıra eşitse), çıkış bir giriş olarak çalışır (varsayılan olarak); ayarlanırsa (yani mantıksal bire eşitse), o zaman çıkış olarak çalışır.

Çıkışı bir duruma ayarlamak için, port veri kaydındaki (portx ile gösterilir) karşılık gelen biti ayrı ayrı ayarlamanız ve O'ya ayarlamak için bu biti sıfırlamanız gerekir. Çıkışın çalışma yönü (giriş-çıkış, DDRx kaydı) ile durumu (O-1, portx) karıştırılmamalıdır.

Portx veri kaydı aslında sadece bir çıktı arabelleğidir; ona yazılan her şey anında çıktı olarak alınır. Ancak, varsayılan olarak yapıldığı gibi bağlantı noktası pinini girişe ayarlarsanız (yani, ddrx yön kaydına mantıksal bir sıfır yazarsanız), o zaman portx veri kaydı biraz farklı bir rol oynayacaktır - bitlerini sıfıra ayarlamak şu anlama gelir: giriş yüksek dirençli üçüncü durumdadır ve bunu bire ayarlamak terminale 35-120 kOhm dirençli bir "yukarı çekme" direnci bağlayacaktır.

Kenar boşluklarındaki notlar

Çoğu durumda, yerleşik çekme direnci güvenilir çalışma için yeterli değildir - parazit nedeniyle MC arızalanabilir ve bu dahili dirençle paralel olarak 1 dirençli ek bir harici direnç takmak daha iyidir. 5 kOhm'a kadar (tüketim açısından kritik durumlarda değeri 20-30 kOhm'a yükseltilebilir). Örneğin, girişe topraklanmış iki pimli harici bir düğme bağlarsanız veya pim, uzak cihazlarla (başka bir kartta bulunur) "ortak veri yolu" üzerinde çalışırsa veya pim, bir bağlantının işlevini yerine getirirse harici kesinti (aşağıya bakın), o zaman böyle bir ek direnç bağlanmalıdır.

Giriş durumundaysa port pinindeki seviyeyi okuma prosedürü tamamen önemsiz değildir. Portx veri kaydından veri okumak cazip gelebilir, ancak bu hiçbir işe yaramayacaktır; yalnızca oraya daha önce yazdıklarınızı okuyacaksınız. Ve girişte (doğrudan mikro devrenin çıkışında) gerçekte neyin mevcut olduğunu okumak için başka bir olasılık daha sağlanır. Bunu yapmak için pinx ile gösterilen bir diziye erişmeniz gerekir. Erişim, geleneksel RVV'lerin bireysel bitleriyle aynı şekilde gerçekleştirilir (bkz. Bölüm 19), ancak pinx bir kayıt değildir, yalnızca belirli bir adres aralığıdır ve buradan okunarak, port girişindeki arabellek elemanlarından gelen bilgilere erişim sağlanır. PiNx adreslerine bir şeyler yazmak elbette mümkün değil.

Kesintiler

PC'lerde olduğu gibi mikrodenetleyicilerde de kesintiler iki türlü olur. Ancak bir PC'de kesintiler donanıma (örneğin, bir zamanlayıcı veya klavyeden) ve yazılıma (aslında kesintiler değil, ancak BIOS'ta yazılan alt rutinler - Windows'un yayılmasıyla birlikte, bu kavram programcı pratiğinden neredeyse kaybolmuştur) bölünmüşse, o zaman MK'de doğal olarak tüm Kesintiler donanımdır ve dahili ve harici olarak ayrılırlar. Ayrı ayrı herhangi bir kesinti ve bunların genel olarak meydana gelme olasılığı, önceden özel izin gerektirir.

Herhangi bir kesintiyi başlatmak için programda dört şey yapmanız gerektiği kesinlikle anlaşılmalıdır: genel olarak kesintileri etkinleştirin (varsayılan olarak devre dışıdırlar), ardından bu özel kesintiyi etkinleştirin, bunun için mevcut modlardan birini ayarlayın ve son olarak , kesme vektörünü ayarlayın: işaretçiyi, kesme işleyicisi alt yordam prosedürünün bulunduğu etikete ayarlayın. Ve elbette bundan sonra işleyicinin kendisini yazmanız gerekir, aksi takdirde tüm bunlar boşuna olacaktır. Bu konu Bölüm 19'da daha ayrıntılı olarak tartışılmaktadır.

Dahili kesintiler, sistem çekirdeğine ek olan herhangi bir cihazdan (zamanlayıcılardan, analog karşılaştırıcıdan, seri bağlantı noktasından vb.) kaynaklanabilir. Dahili kesinti, sistemde meydana gelen ve ana programın yürütülmesini kesintiye uğratan bir olaydır. AVR'deki dahili kesinti sistemi oldukça kapsamlıdır ve cihazların sistem çekirdeği ile etkileşimi için ana sistemi temsil eder ve bu konuya bir kereden fazla döneceğiz.

AVR MK'de en az iki harici kesinti vardır, INTO, INT1 (çoğu Megas'ta üçüncüsü vardır - ICHT2). Harici kesinti, bu amaç için özel olarak tasarlanmış girişlerden birinde bir sinyal göründüğünde meydana gelen bir olaydır. Kesintiye neden olan üç tür olay vardır ve bunlar yazılımda ayarlanabilir: bu, düşük voltaj seviyesi veya ilgili pin üzerindeki pozitif veya negatif kenar olabilir. İlginç bir şekilde, tüm bu olaylara ilişkin kesintiler, ilgili port pini bir çıkış olarak yapılandırılsa bile yürütülür.

Bu modların kullanım özelliklerine kısaca bakalım. İlgili giriş düşük olduğunda düşük seviyeli bir kesinti (mod varsayılan olarak ayarlanmıştır, başlatmak için sadece ilgili kesmeyi etkinleştirmeniz yeterlidir) meydana gelir. "Her seferinde", gerçekten her seferinde, yani olumsuz bir dürtü bir süre devam ederse, o zaman sona eren kesinti işleme prosedürünün tekrar tekrar tekrarlanacağı ve ana programın çalışmasını önleyeceği anlamına gelir. Bu nedenle, bu harici kesme modunu kullanmanın genel şeması, oluştuğu anda onu derhal devre dışı bırakmaktır (işleme prosedürü bir kez başlatıldığında bir kez tamamlanacaktır) ve yalnızca harici etki zaten sona erdiğinde yeniden etkinleştirmektir (örneğin, eğer bu bir düğmeye basılmasıdır, ardından bir veya iki saniye sonra zamanlayıcı tarafından tekrar izin verilmesi gerekir).

Bunun aksine, yükselen veya düşen kesintiler bir kez gerçekleştirilir. Elbette temasın sıçramasına karşı koruma yoktur ve olamaz çünkü MK sıçramayı bir dizi kısa darbeden ayırt edemez. Bu kritikse, geri dönmeye karşı koruma sağlamak için harici önlemler almanız veya seviye kesintisi için kullandığınız yöntemin aynısını kullanmanız gerekir - kesme işleyici prosedürü içinde, ilk komutla kesintinin kendisini devre dışı bırakın ve bir süre sonra başka bir prosedürde ( zamanlayıcıyla veya başka bir olayla) sorunu yeniden çözmek için (bu "sıçramayı önleme" yöntemi aslında tek atımlık bir cihazın kullanımıyla aynıdır, bkz. Bölüm 15).

Detaylar

Dikkatli okuyucunun meşru bir sorusu var - neden harici düzeyde bir kesme moduna ihtiyacımız var? Gerçek şu ki, tüm modellerde, MK çıkışında düşük bir seviyenin göründüğü anda, eşzamansız olarak gerçekleştirilir. Elbette kesinti tespiti yalnızca mevcut talimatın sonunda gerçekleşebilir, dolayısıyla çok kısa darbeler kaybolabilir. Ancak çoğu model için kenar kontrol modundaki INTO ve INT1 kesintileri, denetleyici saat sinyali seviyelerinde bir fark olduğu anda yalnızca eşzamanlı olarak tam tersi şekilde belirlenir, bu nedenle süreleri bir saat periyodundan kısa olmamalıdır. . Ancak en önemli şey bu değil: Senkron modun kesinlikle bu saat sinyalinin varlığını gerektirmesi olmasaydı, genel olarak bu modlarda hiçbir fark olmazdı. Bu nedenle, asenkron bir harici kesinti, saat üreteci çalışmadığında, ancak senkron olanın çalışmadığı durumlarda, derin güç tasarrufu modlarından birinde bulunan bir denetleyiciyi "uyandırabilir". Ve Classic ailesinin AT90S8515'i gibi sıradan MCU'lar (ancak mega analogu değil!), derin "uykudan" yalnızca harici bir seviye kesintisi ile uyandırılabilir ve bu, kullanımı her zaman uygun değildir. Meda ailesinin çoğu modelinde (ATmegaS hariç daha genç modellerde), yalnızca kenarlarda (seviyeye göre olamaz), ancak INTO ve INT1'in aksine eşzamansız olarak meydana gelen başka bir kesinti olan INT2 vardır. ATtiny2313'te (ancak "klasik" analogunda değil!) böyle bir asenkron kesinti, B bağlantı noktasının 8 pininden herhangi birinden gelen bir sinyalle meydana gelebilir. Bu, güç tasarrufu modunda denetleyicinin kullanılabilirliğini önemli ölçüde artırır.

Zamanlayıcılar-sayaçlar

Çoğu AVR MK'de biri 16 bit, geri kalanı 8 bit olmak üzere iki veya üç zamanlayıcı sayacı bulunur (eski Mega modellerde toplam sayaç sayısı 6'ya kadar olabilir). Tüm sayaçlar değerleri önceden yükleme yeteneğine sahiptir ve doğrudan işlemci saat frekansından (SC) veya 8, 64, 256 veya 1024'e (bazı durumlarda 16 ve 32'ye) bölünerek ve ayrıca bir harici sinyal. Genel olarak, MK'deki zamanlayıcıların tasarımı, söylediğimiz gibi, 561HEU/14 sayaçlarına benzer (bkz. Bölüm 15), yalnızca işlevleri önemli ölçüde genişletilmiştir.

AVR mimarisinde, 8 bitlik sayaç zamanlayıcılara O ve 2 numaraları atanır ve 16 bitlik sayaçlara 1, 3 vb. sayılar atanır. Bazı 8 bitlik sayaçlar (iki tane varsa genellikle Zamanlayıcı 2) ayrı bir saat üretecinden asenkron modda çalışabilir ve MCU'nun geri kalanı "uyku" durumunda olsa bile çalışmaya devam edebilir, bu da onlara izin verir gerçek zamanlı saat olarak kullanılacak.

Sayaç zamanlayıcılarını harici darbelerin sıradan sayaçları olarak kullanırken (ve darbenin hem düşüşünde hem de kenarında reaksiyon mümkündür), sayılan darbelerin frekansı MK saat üretecinin frekansının yarısını geçmemelidir (ve asimetrik harici kıvrımlı, talimatlar sınırlama frekansının daha da düşük bir değerini önerir - saatten 0,4). Bunun nedeni, harici darbeleri sayarken kenarlarının eşzamanlı olarak tespit edilmesidir (saat sinyalinin pozitif kenarı anlarında). Ek olarak, harici bir darbenin gelmesinden sonra sayaç içeriğinin güncellenmesindeki gecikmenin 2,5 saat periyoduna kadar çıkabileceği dikkate alınmalıdır.

Bunlar oldukça güçlü sınırlamalardır, bu nedenle, örneğin, evrensel bir frekans ölçer olarak bir MK kullanmak pek uygun değildir - uygun birleşimsel mantık veya FPGA'ler (programlanabilir mantık entegre devreleri) kullanarak yüksek hızlı devreler tasarlamak daha iyidir.

Bir sayaç taşması meydana geldiğinde, ilgili kesmeyi tetikleyebilecek bir olay meydana gelir. 8 bitlik Zamanlayıcı O sayacı bazı durumlarda bu fonksiyonla sınırlıdır. Zamanlayıcı 2, varsa, sayılan değerin önceden belirlenmiş bir değerle eşleşmesi durumunda bir kesmeyi de tetikleyebilir. 16 bitlik sayaçlar daha "gelişmiş" olup, bağımsız olarak belirlenen iki sayı A ve B ile çakıştıklarında kesintilere neden olabilirler. Bu durumda, sayaçlar sıfırlanabilir veya saymaya devam edilebilir ve özel pinler üzerinde darbeler üretilebilir (örn. donanım, program katılımı olmadan).

Ek olarak, 16 bitlik sayaçlar özel bir pin üzerinde harici tek darbeleri "yakalayabilir". Bu durumda bir kesme çağrılabilir ve sayacın içeriği belirli bir kayda yerleştirilir. Sayacın kendisi sıfırlanabilir ve tekrar saymaya başlayabilir veya saymaya devam edebilir. Bu mod, harici bir sinyalin periyodunu ölçmek veya belirli düzensiz olayları (bir Geiger sayacındaki parçacıkların geçişi gibi) saymak için kullanılmaya uygundur. Bu tür olayların kaynağının, daha sonra darbe şekillendirici olarak kullanılan yerleşik bir analog karşılaştırıcı da olabilmesi önemlidir.

Tüm sayaç zamanlayıcıları sözde çalışabilir. PWM modları, yani 8-, 9-, 10- veya 16-bit darbe genişliği modülatörleri (PWM) olarak ve birbirinden bağımsız olarak, çok kanallı PWM'nin uygulanmasına olanak tanır. Teknik belgelerde, karmaşıklıkları, çok yönlülükleri ve hantallıkları nedeniyle bu modlara birçok sayfa ayrılmıştır. Bu modların ses çalma için en basit kullanımı, ses sinyalleriyle bağlantılı olarak Bölüm 22'de kısaca tartışılacaktır. Ses sentezinin PWM modlarının tek ve hatta en yüksek öncelikli amacı olmadığını unutmayın; bu modlar aynı zamanda gücü veya akımı düzenlemek (örneğin pilleri şarj ederken), motorları kontrol etmek, sinyal düzeltme ve dijitalden analoğa dönüştürme için de kullanılabilir. .

Zamanlayıcı sayaçlarına ek olarak istisnasız tüm AVR denetleyicilerinde bir Watchdog zamanlayıcı bulunur. Temel olarak MK'yi belirli bir zaman aralığından sonra enerji tasarrufu modundan çıkarmak için tasarlanmıştır, ancak aynı zamanda MK'nin acil durumda yeniden başlatılması için de kullanılabilir. Örneğin, programın çalışması harici sinyallerin gelmesine bağlıysa, o zaman bunlar kaybolursa (örneğin, hattaki bir kesinti nedeniyle), MK "takılabilir" ve Watchdog zamanlayıcısı onu ortaya çıkaracaktır. bu devletin.

Seri bağlantı girişleri

Harici cihazlarla veri alışverişi için seri bağlantı noktaları herhangi bir MK'nin en önemli bileşenidir, onlar olmadan dış dünyayla “iletişimi” keskin bir şekilde sınırlıdır. Sıralı olarak adlandırılırlar çünkü bir seferde yalnızca bir bit iletilir (bazı durumlarda eşzamanlı iletim ve alım mümkündür, ancak yine de her seferinde yalnızca bir bit). Seri bağlantı noktalarının paralel bağlantı noktalarına göre en önemli avantajı (tam baytlar veya dört parçalı parçalar aynı anda değiştirildiğinde) bağlantı sayısındaki azalmadır. Ancak tek durum bu değil: Paradoksal olarak seri arayüzler, hatlardaki gecikmeler iletim hızını etkilemeye başladığında, yüksek hızlarda paralel arayüzlere göre önemli bir avantaj sağlıyor. İkincisi kesinlikle aynı yapılamaz ve seri arayüzlerin artık hakim olmaya başlamasının nedenlerinden biri de budur (tipik örnekler COM, LPT ve SCSI yerine USB ve FireWire veya IDE yerine Seri ATA'dır).

Veri hacimlerimiz olan mikrodenetleyici cihazlarda elbette aktarım hızı bizi ikinci planda ilgilendiriyor ancak bağlantı kablolarının sayısı çok kritik bir faktör. Dolayısıyla bu kitapta ele alacağımız tüm harici cihazların seri arayüzleri olacaktır.

Hemen hemen her seri bağlantı noktası, normal MK pinleri kullanılarak yazılımda simüle edilebilir. Bir zamanlar bu noptoB'lerin en popüleri olan UART'ta bile bu yapılıyordu. Ancak o zamandan beri MK'ler donanım seri bağlantı noktaları edindi, ancak bu onların mutlak kullanımına ihtiyaç olduğu anlamına gelmiyor. Seri portların yazılım simülasyonunun kolaylığı bir başka avantajdır.

Bir AVR MCU'da bulunabilecek tüm port türleri arasında özellikle UART-Evrensel Asenkron Alıcı-Verici, yani "evrensel asenkron alıcı-verici"ye dikkat edeceğiz. UART, RS-232 protokolünü destekleyen herhangi bir cihazın ana parçasıdır, ancak yalnızca o değil ("evrensel" olması boşuna değildir) - örneğin, RS-485 ve RS-422 endüstriyel standartları da UART aracılığıyla uygulanmaktadır. RS-232'den genel yapı mantığına göre değil, yalnızca elektriksel parametrelere ve izin verilen hızlara göre farklılık gösterdikleri için. Kişisel bilgisayarlarda aynı RS-232 protokolünü kullanarak çalışan bir COM bağlantı noktası bulunur ve UART düğümü de onun temel parçasıdır.

Bu nedenle UART, MK ile bilgisayar arasında veri alışverişinin ana yolu olarak hizmet eder. Çoğu modern PC modelinde COM bağlantı noktasının bulunmamasının bir engel olmadığını unutmayın: bunun için USB-COM adaptörleri vardır ve masaüstü modeline COM bağlantı noktalarına sahip ek bir kart takılabilir.

Kenar boşluklarındaki notlar

Bu bizim için neden bu kadar önemli? Gerçek şu ki, cihaz düzenini bir bilgisayara bağlayarak, cihazın işlevselliği tarafından veri alışverişi sağlanmasa bile, gönderme işlemini programın doğru yerlerine geçici olarak yerleştirerek programda hata ayıklamak çok daha kolaydır. İlgili kayıtların değerleri PC'ye kaydedilir ve bunları bir veya bir terminal emülatör programı kullanılarak gerçek zamanlı olarak alınır. Bu, hantal AVR Studio'da uzmanlaşmaktan çok daha kullanışlıdır ve hatta bazı pahalı hata ayıklama kartlarıyla birlikte gelir. Bu nedenle benim tavsiyem, kendinize hemen bir programlama konnektörü (sonraki bölüme bakın) ve boş modem kablosunu bağlamak için konnektörlü bir UART/RS-232 seviye dönüştürücü içeren bir hata ayıklama kartı yapmanızdır (bkz. Bölüm 21).

UART'ın pratikte nasıl kullanılacağı Bölüm 21'de ele alınmaktadır. UART'a ek olarak, neredeyse tüm AVR MCU'lar tüm seri bağlantı noktalarının en basitini - SPI (Seri Çevresel Arayüz) içerir. SPI cihazının çalışma prensibinden Bölüm 16'da bahsedilmişti. Temel basitliği kısmen kötü bir rol oynadı: SPI protokollerinin tamamen aynı olduğu iki cihaz bulmak zordur; genellikle bu port üzerinden değişime bir veya daha fazlası eşlik eder " çanlar ve ıslıklar". AVR programlamanın da SPI aracılığıyla gerçekleştirildiğine dikkat edilmelidir, ancak genel olarak bu arayüz ve veri alışverişi için SPI farklı şeylerdir, ancak çoğu durumda aynı pinlere sahiptirler.

Ancak bu kitapta, Bölüm 21'de, daha yavaş da olsa daha karmaşık I^C arayüzüne bakacağız; bu arayüz, pek çok çevre birimi cihazının üzerinde çalıştığı için daha sık ihtiyaç duyulur.

Belirli devreleri sunarken AVR ailesinin MK'sinin diğer bazı bileşenlerini (örneğin ADC'ler) ele alacağız - daha net olacaktır. Burada mikrodenetleyiciye olan uzun tanıtımımızı tamamlayıp nasıl programlanacağı sorusuna geçeceğiz.

Sitede yeni

>

En popüler