Mikrodenetleyicinin Temelleri Keşfedildi

Sorunları Ortadan Kaldırmak Için Enstrümanımızı Deneyin





Mikrodenetleyici IC'leri hakkında harika olan bir şey var, bunlar neredeyse dünyanın her yerinde ve elektronik perakendecilerde mevcut.

Giriş

Temel olarak mikrodenetleyici cihazlar, çevredeki ortamın değerlendirmelerini içeren uygulamalarda ve benzer elektroniklerde yaygın olarak kullanılmaktadır.



Motor kontrol uygulamalarında, LED aydınlatmada, eğim sensörü, ivmeölçer, hız ölçer, veri kaydediciler, sıcaklık kontrol cihazları, klavyeler vb. Gibi çeşitli sensörlerde belirli bir parametrenin görüntülenmesi için kullanılan bu cihazları bulabilirsiniz.

Mikrodenetleyicilerle ilgili temel anlayış, bazen bir yonga içinde bilgisayar olarak adlandırılan çok gelişmiş olan AVR Amega32 mikro denetleyicisine başvurarak elde edilebilir.



Bu cihaz, bir program oluşturmak için bir dizi komut yürütmek üzere atanmıştır.

Burada göreceğiniz programın dili C ++ 'dır. Buradaki kursta bu dili daha derinlemesine öğreneceksiniz.

MCU'lar söz konusu olduğunda, tüm pin çıkışlarını kontrol etme ve yapılandırma seçeneğine sahip olma imkanına sahip olursunuz.

Bundan biraz yoruluyorsanız, sadece sakinleşin çünkü hiç de karmaşık bir şey değil, biz ilerlerken tüm yönlerden istikrarlı ama sağlam bir şekilde rahatlayacaksınız.

Bir MCU çipinde, çipin güç pinleri olan Vdd ve Vss dışındaki tüm pinlere özel işaretler atanabilir.

Pinout Ayrıntıları

Çipe üstten bakarsanız, küçük üçgen bir çentik görürsünüz, bu çentiklerin başladığı noktadan başlayarak çipin 1 numaralı iğnesinin bu çentiğin hemen altında başladığını sayar.

Bu pimden başlayarak, o tarafta (solda) aşağıya doğru 20 pim ve diğer tarafta (sağda) sağ tarafta aşağıdan yukarıya doğru devam eden başka bir 20 pim bulacaksınız.

Çentikten başlayan ilk 8 pin, tüm program indeks sıfır ile başladığından, IC'nin indeks pinlerini oluşturan PBO-7'dir.

Yukarıdaki pin çıkışı serisi PORT B ​​olarak adlandırılırken, A'dan D'ye atanan diğer aynı port grupları vardır.

Bu bağlantı noktaları, INPUT adı verilen beslenen bir veriyi kabul etmek ve tanımak ve ayrıca OUTPUT adı verilen belirli bir biçimde veri iletmek için atanabilir.

Genel kategoride yer alan pinlerden ikisi, Vdd ve GND olarak da anılan (+) / (-) pinleridir.

PORT D'den (PDO-6) bir pim, çipin sol tarafında, alt alanda yer alır.

PORT D'nin 7 numaralı pini olan PD7, tek başına ayakta ve sağ taraftaki pin çıkışı serisine başlarken izlenebilmektedir.

Şimdi PORT D'nin bittiği çipin sağ tarafından hareket eden PORT C, sırayla sayımına başlar.

Bunlar, MCU'nun analogdan dijitale kadar birçok ilginç pinine katkıda bulunur.

Bu pinler, harici olarak yapılandırılmış analog devre aşamaları aracılığıyla birçok parametreyi algılamak için algılama girişleri olma özelliğine sahiptir.

Yukarıdaki pimler PORT A'yı oluşturur.

Yukarıdaki pinler arasında analogdan dijitale dönüşüm, bir termister gibi sıradan bir sensör kullanılarak tespit edilen bir analog sıcaklık seviyesinin, MCU tarafından kolayca kabul edilen ve dönüştürücü tarafından PORT A pinlerinden birine uygulandığı bir örnek yardımıyla anlaşılabilir. sıfırdan 255 derece F'ye kadar dijital bir okuma üretmek için (10 bitlik bir çıktı elde etmek için yükseltilebilen 8 bitlik bir rakam).

MCU'larda görülebilecek diğer bir özellik, mevcut programlama alanı veya mikro denetleyici için belirtilen değişkenler ve program için alanı belirleyen bellektir.

Buna ek olarak, MCU'ların ilgili parametreleri saymak için atanmış yerleşik bir saati vardır.

Saat özellikleri, MCU'nun, belirli cihazın özelliklerine bağlı olarak mikrosaniye aralığında hızlı olabilen ve ayrıca istenen herhangi bir kapsamda daha yavaş olabilen birçok farklı sayma işlemi için kendisini uygulamasını sağlar.

Şimdiye kadar mikro denetleyici kavramını bir dereceye kadar ve bağlantı noktaları ve pimleri ile ilgili olarak anlamış olabilirsiniz.

Programcıdan Mikrodenetleyiciye SPI Bağlayıcısı Nasıl Oluşturulur

Şimdi konuya biraz daha derinlemesine girme ve programlama dünyasını araştırma zamanı.

Çipe bir program yükleme prosedürüne girmeden önce, SPI (Seri Çevresel Arayüz) konektörünü MCU ile entegre etmenin uygun bir yolunu bulmamız gerektiğini söylemiştik.

Ancak bundan sonra bile SPI'yi MCU pin çıkışlarına itemeyiz, değil mi? SPI'dan gelen uzatılmış tellerin doğrudan ekmek tahtasına takılmasına da izin veremeyiz. Bu ayrıca yanlış bağlantı yapan yanlış pinlerle bağlanan yanlış kablo ayarlarına da neden olabilir.

Bu nedenle, işleri kesinlikle kusursuz hale getirmek için, prosedürleri minik bir veroboard üzerinden yapıyoruz ve burada gerekli bağlantı metal pimlerini 'başlık' olarak da adlandırılan lehimli olarak elde ediyoruz. Bu başlık pimleri artık SPI konektörüne bağlanmak için kullanılabilir. Bu başlıktan gelen bağlantılar, devre tahtası bağlantıları için kullanılabilen başka bir paralel başlık pimlerine sonlandırılabilir.

Böylece, yukarıdaki montaj artık SPI için MCU'ya sıkı ve güvenilir bir ara bağlantı platformu oluşturur.

Uptil şimdi her şey güzel ve mükemmel görünüyor, bu yüzden PC'niz ile MCU arasında gerekli olan programcı konusunda para kazanmaya devam edelim.

Bu programcı birimlerini yapan ve satan birçok şirket olabilir, bu nedenle bunları temin etmek sizin için sorun olmamalı, örneğin Adafruit Industries, USBtinyISP veya Sparkfun vb.

Bunlardan birkaçı geleneksel tiplerden tamamen farklı görünebilir, ancak temelde her şeye aynıdır ve standart programlama kurallarını izler ve PC'niz ile AVR mikro denetleyici arasında bir arayüz olarak kullanılabilir.

Bununla birlikte, bir AVR Atmega32 değil de başka bir MCU kullanıyorsanız, o belirli MCU yongası için uygun şekilde uyumlu bir programlayıcıyı kontrol etmeniz gerekebilir.

Bu programcıların epeyce bir kısmının aynı sürücüleri kullandığı gözlemlenebilir, bir şeyle ilgilenilmesi gerekir ve sonraki bölümlerimizde bununla ilgili daha fazla şey öğreneceğiz.

PC'nizi mikrodenetleyici çipine bağlamak gerçekten çok basittir ve bunun için işlemlerin ne kadar basit olduğunu bilmek sizi memnun edecektir. Öyleyse hemen düğmeye basalımJ

Yukarıda açıklanan SPI arayüz kartını yapmak zor değildir, tüm mesele lehim ütünüzün, küçük bir genel amaçlı kart üzerindeki gösterilen iki başlık sırasındaki pimlerdeki tüm bağlantılardan geçmesini sağlamaktır.

Yukarıdaki şekil, başlıklar arasındaki kabloları birbirine bağlarken izlemeniz gereken bağlantı ayrıntılarını gösterir.

İşleri daha da basitleştirmek için, yukarıdaki resme bakarak aşağıdaki bağlantı ayrıntılarını aynı şekilde inceleyelim:

Sol üstten başlayan SPI pini 'Master IN, Slave OUT' (MISO) 'ya gider

Merkez soldan SPI pimi saat pimi (SCK) ile bağlanır

Sol alttaki SPI pimi Sıfırlama ile birleşir. (Aşağıdaki eğitimlerde bu pin hakkında ayrıntılı bilgi edineceğiz)

MCU'nun GND pini ile sağ alt kancalarla ilgili SPI, GND, kaynağın sıfır besleme hattını veya negatif (göreceli) rayını oluşturan pimi ifade eder.

Orta sağ başlıktan sona eren SPI, MCU’nun 'Master Out, Slave IN' (MOSI) pinine bağlanır.

Sağ üst başlıktan çıkan SPI, MCU'nun Vdd veya pozitif besleme pini olan MCU'nun (+) ile bağlantılıdır.

Bu kadar.

İki konektörü açıklandığı gibi bağlayın ve SPI arayüz kartınız gerekli eylemler için hazırdır.

Daha fazla yardım için yukarıda gösterilen şekle başvurabilirsiniz, son arayüz panonuz, yukarıdaki tartışma yardımıyla tüm kablo bağlantıları uygun şekilde yapıldıktan sonra böyle görünmelidir.

Umarım önceki eğiticide açıklandığı gibi SPI arayüzünü zaten oluşturmuşsunuzdur ve şimdi bilgisayarımızın PC ile MCU arasında entegre etmemiz gereken programcıyı kabul etmesini sağlamanın zamanı geldi.

Bir MCU için Basit Bir Programlama Kodu Oluşturma

Bilgisayarı mikrodenetleyiciye bağlamak için Sparkfun'dan temin edilebilen bir USBTinyISP ünitesi alıyoruz.

Windows gibi herhangi bir bilgisayar işletim sisteminin, bilgisayara herhangi bir şey yüklemenin yararsız olacağı sürücülere ihtiyaç duyacağını biliyoruz, bu nedenle programcımızın bilgisayarınıza yüklemek için sürücülere ihtiyacı olacaktır.

Sürücüleri bilgisayarınızın işletim sistemine yüklemek için gereken prosedürlere göz atalım, burada 32 bit veya 64 bit özellikli Windows 7 işletim sistemi örneğini alıyoruz.

Sparkfun.com'u açın ve “cep AVR programcı sayfası” na tıklayın. Bağlantı, sayfa içinde kolayca görselleştirilebilir.

Ardından, belgelerin altında 'Windows sürücüsünü' bulun ve üzerine tıklayın.

Bu size bilgisayarınızdaki pocketprog-driver.zip dosyasını sağlayacaktır.

Bilgisayarınıza gidin, indirme konumunu bulun ve indirilen dosyayı bir klasöre açın.

Bilgisayarınızın 64-bit işletim sistemi olması durumunda, 32-bit işletim sistemi ile aşağıda verildiği gibi birkaç adımı daha izlemeniz gerekir, kuruluma doğrudan açılmış dosyadan başlayabilirsiniz.

64 bit için şunları izleyin, 32 bit için basitçe göz ardı edin:

Google 'libusb sourceforge' ve bu bağlantıların son sürümüne tıklayın.

Birkaç ek dosyayla karşılaşırsınız, ancak bib dosyasını bulmakla ilgilenirsiniz, yani: libusb-win32-bin - #. #. #. #. Zip

Şimdi gidin ve bilgisayarınızda bu indirme konumunu bulun, sıkıştırmasını açın ve klasörlerden birine kaydedin.

Bu klasöre, amd64 klasörüne ilerleyerek bin klasörüne gidin.

Burada birkaç klasör göreceksiniz: ghcalled libusb0.dll ve libusb0.sys.

Bunları şu şekilde yeniden adlandırmak isteyebilirsiniz: libusb0_x64.dll ve libusb0_x64.sys.

Şimdi yukarıdaki dosyaları pocketprog-driver klasörüne kopyalamanız gerekecek, mevcut sürümdeki dosyaların üzerine yazmanız yeterlidir.

Yukarıdaki sürücüleri kurmak için, türüne göre oldukça geleneksel olmayan aşağıdaki yöntem ilginizi çekecektir:

Bu bir 'eski donanım ekle' modudur.

'Başlat Menüsü' nü tıklayın

Ardından 'bilgisayar' üzerine sağ tıklayarak devam edin

'Yönet' i ve son olarak 'cihaz yöneticisi' ni tıklayın

Ardından, menünün içinde 'Eski Donanım Ekle' yi seçin

Sihirbaz eklenene kadar 'ileri' düğmesine basın

Talimatları izleyerek, 'Gelişmiş bir listeden seçmeniz gereken donanımı kur' üzerine tıklayın, bu, radyo düğmesi simgesini söz konusu seçime yönlendirecektir. Aslında bu, içinde yuvarlak mavi bir dosya bulunan küçük bir daire gibi görünen bir pencere kontrol düğmesidir.

Şimdi sadece 'İleri' yi tıklayın

Bu size tıklamanız gereken 'Tüm Cihazları Göster' menüsünü gösterecektir.

Bundan sonra 'Diski Var' Simgesine tıklayın.

'Gözat' simgesinin yardımıyla, pocketprog-sürücü klasörünün konumuna gidin. Seçim sizin tarafınızdan doğru bir şekilde yapıldıysa, o klasöre yerleştirilen pocketprog.inf dosyasını görselleştireceksiniz.

Bu dosyaya çift tıklayın ve sürücünün PC'nize yüklendiğine kesinlikle şahit olacaksınız.

Tekrar ve Dışarı !! Sonraki sayfadaki bir sonraki eğiticimize geçelim.

Şimdiye kadar gerekli yazılımı kurmuş ve SPI arayüzünü oluşturmuş olabilirsiniz.

Bir Programı Mikroişlemci çipine Aktarma

Bir sonraki adım, planlanan uygulama için bir devre tahtası, bir LED ve hesaplanan bir direnç gibi birkaç bileşen gerektirecektir.

Bu bölümde programcının test yöntemini öğrenecek ve ilgili sürücülerin ve yazılımın kurulumunu onaylayacağız.

Sürücülerin ve yazılımın doğru şekilde kurulup kurulmadığını doğrulamak için avrdude olarak bilinen basit bir program uygulayacağız.

AVRdude, dosyanın MCU'ya gerçek aktarımının mümkün olmadığı en son WinAVR kurulumuyla ilişkili bir programdır.

Bu program, gerekli işlemler için MCU tarafından esasen anlaşılır hale gelen bir .hex dosya biçimidir.

Doğrulamanın başarılı olmaması durumunda, programcı dosyanın transferini yapamayacaktır.

Aşağıdaki talimatların yardımıyla test prosedürünü nasıl uygulayabileceğimize hızlıca bakalım:

DOS (Disk işletim sistemi) istemini, 'başlat menüsü' ne tıklayıp verilen arama kutusuna cmd.exe yazarak açın.

Şimdi AVRdude'u gerçekleştirmek DOS komut istemine avrdude –c usbtiny –p m32 yazarak yapılabilir. Bu uygulanır uygulanmaz, DOS, bağlantının başarılı olup olmadığını anında onaylayacaktır.

Yukarıdaki komutta, '-c', 'usbtiny' programcı parametre spesifikasyonunu içeren bir bildirim bayrağıdır, '-p' etiketi ise mikro denetleyici cihazını tanımlar ('m32, Atmega32'yi belirtir).

Farklı bir MCU kullandıysanız, uygulama için ilgili önekleri eklemeniz gerekecektir.

Yukarıdaki prosedür bittiğinde, DOS komut istemine 'çıkış' yazabilirsiniz ve bu sizi pencereden dışarı çıkaracaktır.

Gerçek programlama ayrıntılarını ciddi olarak merak ediyorsanız, bunun için öncelikle programın uygulanabileceği harici analog LED devresini lehimlememiz ve inşa etmemiz gerekir, çünkü MCU'dan gelen yanıtı kabul edecek bir sistem yoksa, programlama ve mikro denetleyicinin çalışması oldukça anlamsız olurdu.

LED kartını yapmak çok basittir, tamamen LED'in iki ucunu bir veroboard üzerine lehimlemek ve direnci LED'in bir ucuna bağlamaktır. Bu LED'in rolü, MCU çıkışından gelen aşırı voltaj reklam akımı nedeniyle yanmaması için akımı LED'e sınırlamaktır.

Direncin değeri aşağıdaki basit formül kullanılarak hesaplanabilir:

R = (Ub - LEDfwd) / I

Ub'nin besleme voltajı olduğu yerde, LEDfwd, kullanılan LED'in optimum çalışma voltajıdır ve I, onun optimal amfisidir.

Bir LED ileri voltajı = 2.5V ve akım I = 20mA olan bir KIRMIZI LED kullandığımızı varsayalım, yukarıdaki denklem aşağıdaki gibi çözülebilir:

MCU'dan gelen voltaj 5V olacağından şu şekilde ifade edilebilir:

R = (5 - 2.5) /. 02 = 125 ohm, ¼ watt, en yakın değer 120 ohm olacak.

Şimdi, 120 ohm'luk bir direnç ve bir veroboard olan LED'e sahibiz, basitçe yukarıdaki bileşenleri şemada verildiği gibi mikrodenetleyici ile birbirine bağlayın.

Bu yapıldıktan sonra, MCU yukarıdaki LED kurulumunda amaçlanan yanıt için programlanabilir.

Sırada, MCU'nun programlanması.

Mikrodenetleyicinin bazı anlamlı uygulamaları gerçekleştirmesine izin vermek için, MCU'ya uygun talimatlar yazmak zorunludur.

Bir Programlama Ortamı Nasıl Kurulur ve WinAVR Nasıl Araştırılır

Bunun için muhtemelen bilgisayarımızda kendi “metin düzenleyicimizi” kullanabiliriz, ancak sıradan bir metin editörü yerine daha profesyonel bir “programlama ortamının” kullanılmasını takdir edebiliriz, çünkü bu yaklaşım biraz keyif almanıza izin verir. Bu 'programlama ortamı' paketi içinde yerleşik ilginç özellikler.

Programları farklı diller aracılığıyla oluşturmayı ve düzenlemeyi destekler ve ayrıca bunları bir mikro denetleyici çipi tarafından kolayca anlaşılan ve kabul edilen bir teslim edilebilir modda derler.

Nihayetinde bu, WinAVR tarafından desteklenecek ve ilgili MCU yongasına aktarılacaktır.

WinAVR, programlarda sorun giderme ve olası sözdizimi ve derleme hataları ve hataları hakkında bizi uyarma gibi diğer birçok işlemi yürütmek için de donatılabilir. Bunları daha sonraki eğitimlerimizde tartışacağız.

WinAVR kurulumunun son derece hızlı ve hızlı olmasını istersiniz. Aşağıdaki noktalarla ayrıntılara girelim:

WinAVR kaynak dövme dosyaları klasöründen en son sürümleri indirmeniz gerekecektir. Bu indirmeyle ilgili resmi web sitesinden bazı yararlı bilgilere rastlarsınız.

İndirme işleminin gerçekleşmesini istiyorsanız yanıt verebilmeniz için bir güvenlik sorgusu size sorulacaktır, bu sorulur, indirilecek dosyanın çalıştırılabilir bir dosya olduğu sorulur.

Dosyayı indirin ve üzerine tıklayarak yürütme işlemine başlayın. Kurulum başlasın.

İşlem, rahatlığınıza göre kurulumu kolaylaştırabilmeniz için bazı cevaplanabilir sorularla size rehberlik edecektir. Bunların birçoğunu varsayılan biçimleriyle görmezden gelmek istersiniz, eylemler için en uygun olanları seçmek size kalmıştır.

Şimdiye kadar her şeyi oldukça normal ve kolay buluyordunuz ve birkaç seçenek buluyordunuz, başlangıç ​​menüsü size atılıyor. Endişelenmeyin, bunlardan sadece bazıları aslında “programcılar not defteri” adında bir temden sadece birini kullanıyor olabilir.

Bu simgeye tıklandığında, kullanıcı arayüzünü başlatır, böylece programların yazımını uygulayabilirsiniz (oluşturma ve düzenleme gibi). Kodları derlemenize ve mikrodenetleyiciye yerleştirmenize yardımcı olacak menü komutlarından oluşan programa da şahit olacaksınız.

Yukarıdaki programcı not defterinin temel görevi, yazacağınız insan tarafından okunabilir bir kodu yalnızca MCU tarafından anlaşılabilir bir dizi talimata dönüştürmektir.

Bir sonraki öğretici, Windows ile uyumluluğundan ve mikrodenetleyici IC'nizle mükemmel bir şekilde 'el sıkıştığından' emin olabilmemiz için yukarıdaki programcının testini kapsayacaktır.

Bir LED'i AÇMAK için MCU Nasıl Programlanır

Bu onaylandıktan sonra, sadece kod transfer prosedürünün hatalarla karşılaşmamasını sağlamak için küçük bir 'hiçbir şey yapma' kodu oluşturmaya devam edeceğiz.

Elbette artık ilk programımızı MCU içinde uygulamaya hazırız, ancak ondan önce, önceki eğitimlerimizde yaptıklarımızı hızlı bir şekilde özetlemek ilginç olurdu:

AVR Atmel mikrodenetleyicisini gerekli şartnamemize göre tedarik ettik, burada çizimler için ATMega32 kullandık, daha sonra mikro denetleyici temellerini ve bir programı MCU çipine aktarmaktan sorumlu olan programlayıcı birimini öğrendik.

Ayrıca, bilgisayarınızın programlama eylemleri için mikro denetleyiciye bağlanabilmesi için gerekli olan SP arabirim bağlayıcısını oluşturduk.

Bundan sonra, sürücülerin bilgisayara 32-bit ve 64-but işletim sistemi için doğru şekilde yüklenip yüklenmediğini onayladık.

Daha sonra, kodların mikrodenetleyiciye kolay yazılması ve aktarılmasını kolaylaştırmak için Win AVR adlı programlama ortamını kurduk, ardından programcıyı PC'nizle ve birbirine bağlı mikrodenetleyiciyle doğrulamak için avrdude uygulamasını gerçekleştirdik.

Son olarak, önceki bölümde LED / direnç devresini oluşturmayı bitirdik ve ilgili MCU çıkışlarına bağladık.

Bu gerçekten çok iş ama yine de bazı gerçek programlama işlerine hemen geçmenin zamanı geldi!

Başlangıç ​​olarak, mikro denetleyiciyi üç kategoriye ayırmak isteriz, bu anlayışımızı çok kolaylaştıracaktır:

Kontrol, Tespit ve İletişim

Yukarıdaki işlevlerin birçok farklı şekilde programlanabileceğini bilmek ilginç olurdu.

İlk programımızda mikrodenetleyiciye harici bir parametreyi 'kontrol etmesini' emrederdik, evet haklısınız, son zamanlarda yaptığımız LED olurdu.

Kesin olarak, MCU'ya bağlı LED'i AÇIK konuma getirmesini söyleyeceğiz, evet bunun oldukça ilkel göründüğünü biliyorum, ancak başlangıç ​​aşamasının her zaman kolay olması gerekir.

Mevcut işle ilerlemek, MCU kontrolünü LED yapmak aslında oldukça basittir:

Bunun için PORT B'deki pin # 0'a LED için gerekli 5V'yi üretmesi talimatını veriyoruz.

Önceki öğreticiden hatırlayın, LED'in anotunu MCU'nun yukarıda belirtilen pinine bağladık.

MCU'nun bu pinine adreslenmesi gereken iki temel şey vardır: 1) çıkış ve 2) 5 volt

Belirli bir pime MCU'nun çıktısı olması için talimat verebileceğimiz bir yol öğreneceğiz.

Çipin çıkışı olarak ayarlandığında, bir uygulama için istenildiği gibi 'yüksek' (5V) veya 'düşük' (0V) olması talimatını verebiliriz.

Bir MCU gibi herhangi bir mantık devresi, pimler bir çıkış veya bir girişi bozabileceğinden ve mantıksal yüksek veya mantık düşük üretecek şekilde yapılandırılabildiğinden, pinlerin yalnızca mantıksal yüksek veya mantıksal düşük olacak şekilde atanması gerekir. , mikro denetleyiciler veya bu konuyla ilgili herhangi bir dijital IC için bu birkaç durum dışında herhangi bir ara veya tanımlanmamış durum yoktur. Aynısı, MCU’nun her bir pini için de geçerlidir.

Giriş ve çıkış pin atamalarına gelince, girişler harici analog aşamalardan gelen sinyalleri kabul edecek şekilde konumlandırılırken, çıkışlar bunları belirtilen mantıksal durumlara veya bir frekansa yorumlamaktan sorumlu olacaktır.

Yukarıdaki atamalar birçok farklı yöntemle yapılabilse de, basitlik uğruna bunlardan birini tartışıyor olurduk. Bununla birlikte, şu anda sunulacak olanın kolay ve ilginç görünmesine rağmen, bu kadar uygulanabilir olmadığı ve tüm MCU uygulamaları için önerilen bir tür olmadığı unutulmamalıdır, aynı nedenle kursun ilerleyen bölümlerinde daha popüler programlama yöntemleriyle tanışacaksınız. . Bu programlar, muhtemelen diğer bazı işlevleri yerine getirmek için atanmış olabilecek diğer bitişik bileşenleri etkilemeden yalnızca istenen pimlerin spesifikasyonlara göre atanmasına izin verecektir.

Ancak şu anda diğer iğneler hakkında çok fazla endişelenmeyeceğiz ve yalnızca ilgili iğneleri kullanarak bazı düzeylerde komplikasyonlardan kaçınacağız.

Bir pimi çıkış olarak atamak için Veri Yönü Kaydı'nı (DDR) kullanmamız gerekir. Buradaki kaydın ne anlama geldiğini merak ediyorsanız, bu sadece MCU'da mikro denetleyicinin belirli bir şekilde yanıt vermesini sağlayan bir alandır.

DDR'yi kullanarak pini ya bir 'çıktı' gibi bir veri gönderecek veya bir 'giriş' biçimindeki verileri kabul edecek şekilde ayarlayabiliriz.

Bununla birlikte, kelime konusunda kafanız karışabilir, bu ne anlama geliyor? Bir veri, sürekli olarak mantıksal sıfır (0V) veya mantık yüksek (5V) olarak atanabilen pimlere üçüncü bir boyut ekler, ancak palsların frekansı gibi hızlı bir şekilde değişebilen sinyaller ne olacak? Bir frekansa, belirli aralıklarla veya periyotlarla salınan yüksek ve düşük mantık (5V ve 0V) eşlik eder, böylece zamana yönelik hale gelir ve zamana göre ayarlanabilir, bu nedenle 'veri' olarak tanımlarız, yani başka bir işleve göre bir işlev (mantık durumları ve zaman).

Pin0'ı çıkış olarak atamanın bir yöntemi aşağıdaki kodu yazmaktır:

DDRB = 0b00000001

Yukarıdaki programda, DDRB, PORT B ​​0b için Veri Yönü Kaydını belirtir, derleyiciye bir sayının aşağıdaki ikili ifadesi ile ilgili talimat verirken, ifadenin sonundaki '1' pin0'ın konumunu, yani formdaki konumunu belirtir. PORT B'nin ilk pininin.

PORT B'nin 8 pini onunla ilişkilendirdiğini (0'dan pim 7'ye) öğrendiğimizi hatırlarsanız ve yukarıdaki kodun içinde 8 hane olduğunu fark ederseniz, yani her bir rakam PORT B'nin bu 8 pini belirtir.

Şimdi bir sonraki prosedür bu pime (pin0) 5V atamak olacaktır. Yine, çalışma prensibi, aşağıdaki ikili kodla ifade edildiği gibi DDR ile aynıdır:

PORTB = 0b00000001

Görüldüğü gibi, yukarıdaki kodla öncekinin arasındaki tek fark, bu kodda PORT yazmacını kullanmış olmamızdır. Bu kayıt, özellikle MCU içinde konumlandırıldığı belirli bağlantı noktasının pin atamalarını yönetir. Böylece bu pinout'lar için gerçek veri mantığı (0 veya 1) atamamızı sağlar.

Şimdi programımızın yaklaşık ayrıntılarıyla ilgili bazılarını tartışmak isteyebiliriz. Tüm programların uygulamayı başlatmak için belirli bir alan gerektirdiğini bildiğimiz gibi, bu, belirli bir tarifle ilgili tüm malzemeleri bilen ancak nereden başlayacağı konusunda talimat verilmeyen bir şefle karşılaştırılabilir.

Buradaki 'ana' işlev, C / C ++ programlarının her birinin yürütmeyi başlattığı konumdur. Bu nedenle, ana şu şekilde oluşturulabilir:

int main (void)
{
}

Bununla birlikte, programın DDR ve PORT yazmacı ayrıntılarını ve bunların MCU yongası içindeki işleyişini yorumlamasını sağlamak için, AVR MCU ile ilgili tüm verileri içeren ek bir ifadenin dahil edilmesi gerekir. Belki de bu katılımı tüm programlarımıza eklemek isteriz.

#Dahil etmek
int main (void)
{
}

Derleme başlar başlamaz, derleyicinin ön işlemci bölümü “io.h” dosyasını tanımlamak için AVR dizinine odaklanır. Buradaki '.h' uzantısı, bunun bir başlık dosyası olduğunu ve dosyanın içindeki bu kodun oluşturulmakta olan kaynak dosyanın başlangıcında (head) tanıtılacağını, dolayısıyla 'başlık' adını belirtir.

Burada DDR ve PORT ifadelerini kodumuza ekleyebiliriz çünkü io.h başlık dosyasının eklenmesi derleyiciyi bunlarla ilgili yönlendirirdi.

#Dahil etmek

int main (void)

{

DDRB = 0b00000001 // Veri Yönü Kaydı pin0 ayarını çıkışa ve kalan pinleri giriş olarak

PORTB = 0b00000001 // pin0'ı 5 volt olarak ayarla

}

Yukarıdakiler, 5V büyüklüğe sahip çıkış olarak pin0'ın oryantasyonunu düzeltir. Ancak yine de bu pin için belirlenmemiş bir sorun var, bu pinin MCU çalıştırıldığı sürece süresiz olarak AÇIK duruma getirilmesi için henüz talimat verilmemiş olmasıdır. Bu sonsuz geri besleme döngüsü, MCU'dan gelen bu pinin KAPALI konuma geçmemesini, bunun yerine 5V çıkışı ile süresiz olarak devam etmesini sağlayacaktır.

Bir pin için döngü talimatı uygulamanın birçok farklı yöntemi olsa da, burada 'while' döngüsünü kullanmayı deneyebiliriz. Adından da anlaşılacağı gibi, 'while' döngüsü mikrodenetleyiciye güç 'mevcutken' atanan pin çıkışı için atanmış 5V ile etkin kalmanız gerektiğini söyler.

#Dahil etmek

int main (void)

{

DDRB = 0b00000001 // Veri Yönü Kaydı pin0 ayarını çıkışa ve kalan pinleri giriş olarak

PORTB = 0b00000001 // pin0'ı 5 volt olarak ayarla

süre (1)

{

// Kod, defalarca çalıştırılması gerektiğinde burada olurdu ... sonsuza kadar

}

}

Burada 'while' döngüsü için bir argüman biçiminde '1' kullandığımızı not etmek isteyebilirsiniz, çünkü '0' dışındaki her şey mantıksal bir 'doğru' olarak kabul edilebilir.

Bu, 'while' döngüsünün mantıksal bir 'doğru' dışında hiçbir şeyden sorumlu olmayacağı anlamına gelir; bu, belirli bir iğnenin belirtilen durumla süresiz olarak kilitleneceği anlamına gelir.

MCU, Vdd ve Vss üzerinden güç aldığı sürece, LED'in atanmış pim üzerinde kalıcı olarak AÇIK olduğuna tanık olunabilir.

İşte bu, şimdi elde etmek istediğimiz sonuca sahibiz ve sonunda bu kadar çok çalışmadan sonra bunun gerçekleştiğini görebiliriz, ancak yine de sıkı çalışmamızın tatlı sonucunu görmek çok tatmin edici.

Sonraki öğreticilerde, yukarıdaki LED'e bir 'zaman' boyutu eklemeyi, yani belirli bir hızda nasıl yanıp sönmesini sağlayacağımızı öğreneceğiz.

Aslında, yukarıdaki uygulamada, LED aslında yanıp sönüyor, ancak döngü hızı o kadar hızlı ki, neredeyse LED aydınlatması üzerinde kalıcı bir AÇIK anahtar gibidir.

LED'in bu gecikmeli hızda yanıp sönmesini sağlamak için bu döngünün istenildiği gibi bir gecikmeyle nasıl eklenebileceğini göreceğiz.

AVR mikrodenetleyicisini Kullanarak LED Yanıp Sönme Nasıl Yapılır

Son tartışmada, bir mikrodenetleyici aracılığıyla bir LED'in nasıl AÇIK hale getirileceğini öğrendik, olağanüstü değil mi? O kadar fazla olmayabilir!

Burada, iki yönlü bir işlevsellik atfederek yukarıdaki LED aydınlatmasını nasıl renklendireceğimizi öğreneceğiz, yani belirli bir frekans veya hızda yanıp sönmesini veya yanıp sönmesini sağlamaya çalışacağız. Ayrıca bu oranın kullanıcı tarafından istenildiği şekilde nasıl artırılabileceğini veya azaltılabileceğini göreceğiz.

Şuna bir bakalım:

#Dahil etmek

#Dahil etmek

int main (void)

{

DDRB | = 1<< PINB0

süre (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Yukarıdaki ifadede kullanılan garip semboller (&, ^, | vb.) İle şaşkın hissediyorsanız (& orada değil, ancak diğer benzer kodlarda kullanılabilir), işte bunlar hakkında bilmek isteyeceğiniz ilgili bilgiler. :

Genellikle yukarıdaki kodla kullanılan AND, OR, NOT ve XOR gibi birçok standart mantıksal algoritmayı içerir.

Bu mantıksal işlevsellik, atanmış doğruluk tablolarına göre özellikle '1' ve '0' bitlerini karşılaştırır.

Aşağıdaki bit düzenlemesini analiz ederek bir fikir edineceğiz:

01001011 ve
10001101
eşittir
00001001

Yukarıdaki kodda &, C programlamasında kullanıldığı gibi AND anlamına gelir.

Satırları dikey olarak okumak, 0 ve 1'in 0, 1'e eşit olduğunu ve 0'ın 0'a eşit olduğunu, 0'ın 0'a eşit olduğunu ve 1'in 1'e eşit olduğunu gösterir. Okumak bu kadar basittir. Bunlar, bir AND operatörünün doğruluk tablosuna göredir.

Aşağıdaki tabloyu değerlendirirsek, “|” sembolünü gösterir. 'VEYA' işlevselliğinin kullanımını ifade eden '|' bilgisayar klavyenizdeki 'geri tuşu' nun hemen solunda bulunabilir:

01001011 |
10001101
eşittir
11001111

Aynı şekilde VEYA mantığı işlevselliğinin bu doğruluk tablosu, 0 veya 1 bitlerinin 1, 1 veya 0'ın 1, 0 veya 0'ın 0'a eşit olduğunu ve 1 veya 1'in 1'e eşit olduğunu gösterir.

Aşağıdaki bit kombinasyonu, ^ ile gösterilen XOR mantık operatörü içindir ve AND, OR doğruluk tablolarında yaptığımız gibi çalışılabilir:

01001011 ^
10001101
eşittir
11000110

Şimdi ilk programa devam edelim ve içindeki aşağıdaki satırın ne anlama geldiğini öğrenelim:

#Dahil etmek

Önceki eğiticilerimiz sayesinde ifadenin nasıl işlediğini biliyoruz, bu yüzden onu tekrar etmeyeceğiz, ancak #include ile ifade edilen ve araştırılması gereken yeni bir 'dahil etme' gibi görünüyor.

Bu 'dahil etme' de delay.h bize bazı kolay uygulama yöntemleri sağlar.

Adından da anlaşılacağı gibi delay.h belirli bir programda bir gecikme oluşturmamızı sağlar.

Bir sonraki ifade int main (void), daha önceki yazılarımızda bunu zaten ele aldığımız için devam eden tartışmadan çıkarılabilir.

Ardından değiştirilmiş DDRB geliyor.

Aşağıda, 0'dan 7'ye kadar olan tüm pinler girişleri oluşturmak için değiştirildiğinden pinleri atamanın daha iyi bir yolu olmayan önceki formu göstermektedir. Ancak, diğer bazı işlevler için bu iğneleri gerektiren daha uzun bir program oluşturmak isteseydik durumun ne olacağını bir düşünün. Örneğin, bir aletin uzaktan anahtarlanması için pin2 gerekli olabilir. Bu durumda, aynı girdiyi yalnızca deneme yanılma yoluyla atamaktan memnun olmazdık. Bu, uzak vericiden cihaz alıcısına yanlış yanıt anlamına gelebilir.

DDRB = 0b00000001

Biz sadece bir biti etkilemek istiyoruz, şapka pin0 bit, bu ikili bir maskeleme ile yürütülebilecek 'VEYA' fonksiyonelliğine göz atarak.

DDRB = DDRB | 0b00000001

Burada bir 'VEYA' maskesiyle örtülmüştür: 0b00000001, ancak gerçek bir ikili sayı gibi görünse de, örneğin daha önceki DDRB: 0b01001010 durumunda, maskeleme yoluyla buna bir OR uygulamak şunu verebilir: 0b01001010 | 0b00000001 = 0b01001011.

Ortaya çıkan fark, sadece bitleri değişen pin0 ile olur!

Yukarıdaki ifadeyi C ++ aracılığıyla daha da sıkıştırmak şunu verir:

DDRB | = 0b00000001

Ancak verilen programda daha da fazlası olduğunu görüyoruz. Oldukça yasal ve açık görünse de, özellikle rahatlığımız için temelde oluşturulmuşsa, io.h başlık dosyasındaki bazı ifadelerden yararlanmamız gerekir mi?

Yani 'DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Yani 0b00000000 ile başlıyoruz ve 0b0000001'i üretmek için bir “1” koyuyoruz ve sonra onu sola 0 pozisyonlara transfer ediyoruz, bu da yukarıdaki ile tamamen aynı 0b00000001 verir.

Şimdi, PINB4 olduğunu varsayarsak, ifade 1 olarak ifade edilebilir.<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

'1' den sonra dört sıfır olduğu anlamına gelen sıfır indeksi kullandığımıza dikkat edin.

Şimdi 'süre' döngüsüne geçersek, daha önce 'sonsuz döngü' yi not etmiştik. Ama belki şimdi mikro denetleyicinin istenen uygulamalardan bazılarını uygulamasını istiyoruz. Bu, yalnızca verilen döngü içinde mümkün olabilir. Belirli bir dizinin tekrar tekrar tekrar edildiği döngüdür.

Yürütmenin döngüden önce yerleştirilmesi durumunda, yalnızca bir kez uygulanacaktı.

Bununla birlikte, LED'in sürekli olarak yanıp sönmesini sağlamak için, döngü içinde PINB0'ı dönüşümlü olarak AÇIK / KAPALI konuma getirmek gerekir. Burada ayrıca, LED'in yanıp sönmesinin imkansız olacağı gecikmeleri de görüyoruz. Ancak bu, LED'i çıplak gözle tanıması zor olan çok hızlı bir hızda yanıp sönmeye zorlar, gözlerimizle tanımlanabilmesi için biraz yavaşlaması gerekir.

İkili sayıdaki belirli bir bitin kurulum prosedürünün farkındayız, ancak henüz '1' olması durumunda belirli bir '0' biti uygulama yönteminden emin değiliz.

Aşağıdaki program bunu yaparken görülebilir, ancak programda görünmeyebileceğini de göreceğiz.

İlk iki ifade, biti '1' (5V, LED ışıklar) olarak değiştirir, ardından 100 ms için bir duraklama başlatılır.

Sonraki satırlar PINB0 bitini '0' a çevirir (sıfır voltaj, LED kapanır), ancak üzgünüm AND karşılaştırması bitten '0' yürütemez, ancak '~' DEĞİL ikili maske için tüm 0'ları 1'lere çevirebilir ve bunun tersi de geçerlidir.

Bu sadece PINB0 bitini etkilememizi ve onu '0' a çevirmemizi sağlayacaktır. Parantez, maskeleme uygulamasını içerecek şekilde dahil edildi, öyle ki NOT işlemi, sadece sol kaydırmadan önceki '1' üzerine değil, tüm maskeler için uygulanabilir.<<”.

PORTB | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

AÇMA KAPALI gecikmeleri veya eşit süreli dönemler oluşturmak için, önceki dört satırı ikiye kısaltabilir ve XOR işlevini kendi yararımıza uygulayabiliriz. Bir XOR uygulamasında, 0 olması durumunda 1'e atanmış bir pinin, 0 olması ve bunun tersi olması not edilmelidir. Bu uygulama yalnızca PINB0'ı etkileyecektir. Komut uygulandığında, sadece biti mevcut mantığın tersine çevirecektir.

PORTB ^ = 1<< PINB0
_delay_ms (100)

YAPILDI! LED'iniz şimdi ayarlanan hıza göre yanıp sönüyordu… Basit değil mi?




Önceki: Çoklu Cihazlar Uzaktan Kumanda Devresi Sonraki: AC Faz, Nötr, Toprak Arıza Gösterge Devresi