PIC Eğitimi - Kayıtlardan Kesintilere

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





PIC programlamanın en küçük ayrıntılarına girmeden önce, birkaç iyi programlama yöntemini öğrenmek önemli olacaktır.

Kayıtları Anlamak

Öncelikle, programın herhangi bir noktasına bir (noktalı virgül) yazdığınızı varsayalım, bu noktalı virgülden sonra gelenler, elbette taşıyıcı pozisyona geri gelene kadar derleyici tarafından yok sayılır.



Yukarıdaki özellik, programın bir parçası olmayacak şekilde yorum veya açıklama eklememize izin verir, ancak yanındaki yorumların yardımıyla programı tanımlamamızı kolaylaştırır. Herhangi bir IC'yi programlarken yorum yazmak tavsiye edilen bir uygulamadır.

Kurstaki bir sonraki önemli şey, çeşitli sabitlere isimler atamaktır (bunları daha sonra ayrıntılı olarak öğreneceksiniz). Bu ayrıca, dahil edilen sayılarla karıştırılmak yerine, neye yazıldığını veya ilgili değerlerle ilgili olarak neyin yazıldığını anlamayı kolaylaştırır.



Yukarıdakiler, anında tanıma için gerçek adlar biçiminde yapılmalıdır, örneğin COUNT, burada tüm büyük harflerin onu farklı kılmak için kullanıldığını ve ayrıca bunun sabit bir değer olduğunu belirtmek için kullanıldığına dikkat etmek önemlidir.


Gördüğümüz gibi, yukarıdakiler noktalı virgüllerden oluşan bir kutu şeklinde yapılmıştır, bu sadece daha temiz görünmesini sağlar. Ek olarak, programı kağıt üzerinde de belgelemeyi deneyin, bu uygulama olayları adım adım anlamanıza yardımcı olacaktır.

2. Kayıtlar.

Bir PIC içindeki kayıt, yazılı ayrıntıları kabul eden ve ondan okumaya izin veren bir alandır. İçeriği görselleştirebileceğiniz ve üzerine yazarak ekleyebileceğiniz bir kağıt parçasıyla karşılaştırabilirsiniz.

Aşağıdaki şekil, bir PIC16F84 içine gömülü tipik bir kayıt dosyası haritasını göstermektedir. Biçim, gerçekte PIC içinde ayarlanmış bir şey değildir, basitçe, bitlerin çip içinde nasıl düzenlenebileceğini belirtmek ve ilgili komutlardan birkaçını anlamak içindir.

Temelde Banka 0 ve Sıra 1'e bölündüğünü görebilirsiniz. Banka 1, PIC'nin fiili çalışmasını kontrol etmekten sorumludur, örneğin PIC'yi A Portundaki hangi bitlerin giriş olarak atandığını ve hangilerinin çıkış olarak olduğunu telafi eder.

Banka 2 sadece bilgiyi manipüle etmek içindir.

Bunu aşağıdaki örnekle anlayalım:

PortA yüksek bir bit atamak istediğimizi varsayalım. Bunun için, bir çıkış şeklinde Port A'da belirtilen bit veya pini ayarlamak için önce Banka 1'e gitmemiz gerekir. Bundan sonra Banka 0'a dönüyoruz ve bu belirli pime bir mantık 1 (bit 1) gönderiyoruz.

Banka 1'de kullanmak istediğimiz en yaygın kayıtlar STATUS, TRISA ve TRISB'dir.

STATUS, Bank 0'a dönmemize yardımcı olur, TRISA, Port A'daki hangi pinlerin çıkış ve hangilerinin giriş olabileceğini seçmemize izin verirken TRISB, Port B'de çıkış ve giriş pinleri arasında seçim yapmayı kolaylaştırır. BANK 0'daki SELECT kaydı kullanıcıya izin verir. Banka 1'e çevirmek için.

Tüm konsepti aşağıdaki açıklama ile özetleyelim:

DURUM:

Sıra 0'dan Sıra 1'e geçmek için DURUM yazmacına komut veriyoruz. Bu, STATUS yazmacının 5. bitini 1'e ayarlayarak gerçekleştirilir. Bank 0'a geri dönmek için, STATUS yazmacının 5. bitini 0'a atarız. STATUS kaydı 03h adresinde konumlandırılır, burada h numarayı belirtir Onaltılık olabilir.

TRISA ve TRISB:

Bunlar karşılık olarak 85h ve 86h adreslerinde bulunmaktadır. Bir pini bir çıkış veya giriş olarak programlamak için, yazmaçtaki belirli bit'e sadece bir sıfır veya bir gönderiyoruz. Şimdi bu iki yolla yapılabilir, ikili veya Hex yoluyla. Parametreyi dönüştüremeyen kişi, değerleri uygulamak için bilimsel bir hesap makinesine gidebilir.

Şimdi Port A'da 5 pime karşılık gelen 5 pimimiz var. Pinlerden birini giriş olarak sabitlemeyi düşünürsek, belirli bit için bir '1' göndeririz.

Pinlerden birini çıkış olarak atamak istememiz durumunda, belirli bir pini '0' olarak ayarlardık. Bitler, bitlere tam olarak karşılık gelir veya daha kesin olarak bit 0 RA0'dır, bit 1 RA1, bit 2 = RA2 vb. Olabilir. Bunu şu şekilde anlayalım:

RA0, RA3 ve RA4'ü çıktı olarak sabitlemek istediğinizi, RA1 / RA2'yi i / ps olarak sabitlemek istediğinizi varsayalım, bunu 00110 (06h) göndererek yapacaksınız. Bit 0'ın burada gösterildiği gibi sağa doğru olduğunu kontrol edin:

Bağlantı Noktası A Pin RA4 RA3 RA2 RA1 RA0

Bit Numarası 4 3 2 1 0

İkili 0 0 1 1 0

Aynısı TRISB için de geçerli.

PORTA ve PORTB

Çıkış pinlerinden birini yükseğe çıkarmak için, PORTA veya PORTB yazmacımızdaki ilgili bit için bir '1' sunuyoruz. TRISA ve TRISB kayıtları için de benzer bir prosedür izlenebilir. İlk örnek kodlamamıza geçmeden önce, daha fazla yazmaçtan oluşan bir kupayı anlayalım, yani w ve f.

W ve F

W kaydı, seçtiğiniz herhangi bir değeri atamanızı sağlayan sıradan bir kayıttır. W'ye bir büyüklük atadığınız anda, bunu başka bir değere ekleyerek veya basitçe hareket ettirerek devam edebilirsiniz. Başka bir değer atandığında, ayrıntılar W'nin üzerine yazılır.

F kayıt defteri, yazılı içeriğini bir kayda iletir. Bu F kaydının bir sicil üzerine bir değer atamasını isteriz, STATUS veya TRISA kayıtlarının üzerinde olabilir, çünkü bunlar değerleri doğrudan üzerlerine koymamıza izin vermez. Örnek Bir Program

Yukarıdaki talimatın nasıl uygulandığını bize gösterecek ve ayrıca kurstaki talimatlardan birkaçına da şahit olacak aşağıdaki örnek kodu inceleyelim.

Yukarıda tartışıldığı gibi Bağlantı Noktasını düzeltmekle başlayalım.

Bunun için Banka 0'dan Banka1'e geçmemiz gerekir, bu 03h adresinde, bit 5 ila 1'de bulunan DURUM yazmacını kurarak yapılır.

BSF 03h, 5

BSF, Bit Set F anlamına gelir. Bu komuttan sonra iki sayı kullanıyoruz - STATUS kayıt adresi olan 03h ve bit numarasına karşılık gelen 5 sayısı.

Yani, dediğimiz şey '03h adresindeki bit 5'i 1'e ayarla'.

Şimdi Bank 1'deyiz.

MOVLW 00110b

00110 ikili değerini (b harfi, sayının ikili olduğu anlamına gelir) genel amaçlı kaydımıza W koyuyoruz. Elbette bunu onaltılık olarak yapabilirdim, bu durumda talimatımız şöyle olurdu:

MOVLW 06h

Ya çalışır. MOVLW, İngilizce'deki değeri doğrudan W yazmacına koymak anlamına gelen 'Literal Değeri W İçine Taşı' anlamına gelir.

Şimdi, portu kurmak için bu değeri TRISA kaydımıza koymamız gerekiyor:

MOVWF 85 saat

Bu talimat “W'nin İçeriğini Takip Eden Kayıt Adresine Taşı” anlamına gelir, bu durumda adres TRISA'yı ifade eder.

Bu noktada TRISA kaydımız 00110 rakamını taşımaktadır veya grafik olarak sunulmuştur:

Bağlantı Noktası A Pin RA4 RA3 RA2 RA1 RA0

İkili 0 0 1 1 0

Giriş / Çıkış O O I I O

Şimdi Port A pinlerimize sahibiz, bilgilerden birini ayarlamak için Bank 0'a dönmeliyiz.

BCF 03h, 5

Bu talimat BSF'nin tersini gerçekleştirir. 'Bit Clear F' anlamına gelir. Karşılık gelen bir çift sayı, yazmacın adresidir, burada STATUS yazmacının yanı sıra bu durumda bit beşidir. Şu anda tam olarak tamamladığımız şey, beşinci biti

DURUM 0'a kaydol

Bu noktada Banka 0'a döndük.
Aşağıdaki kod, hepsi bir blokta yer almaktadır:

BSF 03h, 5 Sıra 1'e git
MOVLW 06h 00110'u W'ya koyun
MOVWF 85h 00110'u TRISA'ya taşı
BCF 03h, 5 Bank 0'a geri dön

Son talimatta, muhtemelen giriş veya çıkış olarak PIC üzerindeki GÇ bağlantı noktası pinlerini oluşturmanın yolunu onayladık.

Bu kurs boyunca, bağlantı noktalarına veri göndermenize yardımcı olalım.

Verileri Bağlantı Noktalarına Gönderme

Sonraki eğitimde, PIC'in tam olarak beklediğimiz şeyi gerçekleştirdiğini görebilmeniz için eksiksiz bir program ayrıntısı ve basit bir devre şemasından oluşan bir LED'i açıp kapatarak tamamlayacağız.

PIC'nizi aşağıdaki sonuçlarla bir araya getirmeye ve programlamaya çalışmayın, çünkü bunlar yalnızca görseldir. Başlangıçta, çıkış olarak Port A bit 2'yi kuracağız:

Bu, önceki eğitimden anlaşılabilir. Tek fark, A üzerindeki pinlerin her bitini üç durumlu yazmacıya 0h vererek çıkış olarak sabitledik. Öyleyse şimdi yapması gereken şey bir LED'i yakmak.

Bunu, pinlerden birini (LED'e bağlı olanı) yüksek programlayarak başarırız. Farklı bir şekilde ifade etmek gerekirse, iğneye bir '1' uygularız. Bu tam olarak nasıl yapılır (her satır için açıklama için yorumları inceleyin):

Bu nedenle, şimdi başardığımız şey, LED'i bir kez açıp kapatmaktır. Arzu ettiğimiz şey, LED'in daha sonra sürekli olarak yanmasıdır.

Başlangıca dönmek için programı alarak bunu başarıyoruz. Bunu, programımızın başında başlangıçta bir etiket oluşturarak ve daha sonra programı oraya geri dönmesi için bilgilendirerek gerçekleştiriyoruz. Bir etiketi oldukça açık bir şekilde belirtiyoruz.

Bir terim giriyoruz, BAŞLAT diyelim, sonra kodu yazın:

Gösterildiği gibi, başlangıçta programın hemen başında 'Başlat' ifadesinden bahsetmiştik.

Daha sonra, programın en sonunda açıkça 'Başlamaya Git' ten bahsettik. 'Goto' talimatı, beyan ettiği şeyi gerçekleştirir.

Bu program, devreyi her açtığımızda LED'i sürekli olarak açıp kapatacak ve elektriği kestiğimizde KAPALI konuma geçecektir. Belki programımızı bir kez daha kontrol etmeliyiz:

Elbette yorumları atladık, ancak yine de talimatları ve sayıları gözlemleyebiliriz.

Programda sorun gidermeye çalışmanız ve kodu yazarken tüm adresleri ezberlemeniz durumunda bu biraz kafa karıştırıcı olabilir.

Yorumlar hala yerleştirilmiş olsa da biraz dağınık hale gelebilir. Bu, sayıların isimlendirilmesini gerektirecek ve ek bir talimatla gerçekleştirilebilir: 'equ' 'equ' talimatı, bazı şeylerin başka bir maddeye eşit olabileceğini önerir.

Montajcı için PIC için bir talimat olmayabilir. Bu talimat, bir kayıt adres konumuna ad veya bir programlama terimine bir sabit atamayı kolaylaştırır.

Programımız için birkaç sabit oluşturacağız ve ayrıca programı ne kadar kolay okuduğuna da şahit olacağız.

Şu andan beri sabit değerleri sabitledik, onları programımıza ayarlayarak ilerleyebiliriz. Kullanılmadan önce sabit değerlerin belirlenmesi gerekir.

bu nedenle her zaman programın başında konumlandırdığınızdan emin olun. Önceki etiketlemeyi en yenisi ile karşılaştırmak için programı bir kez daha yorumları hariç tutarak yeniden yazacağız.

Belki de sabitlerin programın biraz daha kolay anlaşılmasını sağladığını fark edebilirsiniz, ancak yine de yorum alamıyoruz, yine de bitirmediğimiz için endişelenmenize gerek yok.

Yanıp sönen LED programımızın küçük bir dezavantajı olabilir.
Her komutun bitirilmesi için 1 saat dizisine ihtiyacı vardır. 4 MHz'lik bir kristal kullanıyorsak, her talimat 1 / 4MHz veya 1uS'nin bitmesini gerektirir.

Sadece beş talimat kullandığımız için, LED 5uS'de etkinleşecek ve sonra sönecektir. Bu, insanların fark etmesi için çok hızlı olabilir, ayrıca LED'in tamamen açık olduğu anlaşılacaktır.

Bunun yerine başarmamız gereken şey, LED'i açmak ve LED'i kapatmak arasında bir engel oluşturmaktır. Engelleme teorisi, daha önceki bir miktardan geriye doğru saymamızdır, bu yüzden sıfıra ulaştığında, saymayı bırakırız.

Sıfır değeri, gecikmenin sonucunu belirtir ve program boyunca sürecimizi çalışmaya devam ederiz. Bu nedenle, ilk yapmamız gereken, sayacımız olarak kullanmak için bir sabit belirlemektir.

Bu sabit COUNT diyelim. Bundan sonra, bir sayının ne kadar önemli sayılacağını belirlemeliyiz. Kuşkusuz, dahil edebileceğimiz en büyük rakam 255 veya onaltılık FFh'dir, önceki derste bahsettiğim gibi, equ komutu bir yazmaç durumuna bir ifade atar.

Bu, COUNT'umuzu tahsis ettiğimiz miktar ne olursa olsun, bir kaydın öğeleriyle eşleşeceği anlamına gelir. FFh değerini belirlemeye çalışırsak, programı derlediğimizde bir hata yapacağız.

FFh konumu olmasının nedeni, bu nedenle ona erişemiyoruz. Bu nedenle, gerçek bir sayıyı nasıl belirlemeliyiz? Kesinlikle, az miktarda yanal düşünme gerektirecektir.

Örneğin COUNT'umuzu 08h adresine atarsak, bu temel bir hedef kayıt varış yerini gösterir. Varsayılan olarak, dokunulmamış alanlar FFh olarak ayarlanmıştır. Sonuç olarak, COUNT 08h'ye götürürse, ilk çalıştırdığımızda FFh değeriyle karşılaşırsınız. Yine de, ben, COUNT'u başka bir numaraya nasıl sabitleyebiliriz? Uyguladığımız tek şey, önce bu hedefe bir değerleme 'taşımak'.

Örnek olarak, COUNT'un 85h değerine sahip olmasını dilediğimizi varsayalım, COUNT equ 85h'den bahsedemeyiz çünkü bu, Port A için Tri-State sicil dışı konumdur. Kesin olarak başardığımız şey şudur: movlw 85h W register movwf 08h içindeki 85h değeri

Şimdi onu 08h kaydımıza taşıyın. Daha sonra, COUNT equ 08h ifade edersek, COUNT 85h değeriyle eşleşir. Narin, değil mi! Bu nedenle, başlangıçta sabitimizi belirleriz: COUNT equ 08h Aşağıdaki bu COUNT'u sıfır olana kadar bir azaltmalıyız.

Basitçe, bir 'goto' ve bir etiket kullanarak bunu bizim için başarmak üzere tasarlanmış bir talimat vardır.

Uygulayacağımız talimat şudur: DECFSZ COUNT, 1 Bu komut, 'Kaydı (burada COUNT) virgülü izleyen numarayla azaltın. Sıfıra ulaşırsak, iki nokta ileri atlayın. ’Onu rotamıza yerleştirmeden önce, ilk olarak iş başında bulalım.

Yaptığımız şey, başlangıçta sabit COUNT'u 255'e kurmaktır. Sonraki segment decfsz komutumuza yakın LABEL adlı bir etiketi konumlandırır.

Decfsz COUNT, 1, COUNT değerini bir azaltır ve nihai sonucu doğrudan COUNT içinde tutar. Dahası, COUNT’un 0 değerine sahip olup olmadığını kontrol eder.

Aksi takdirde, bu durumda programı sonraki satıra geçmesi için tetikler. Şimdi bizi decfsz talimatımıza geri götüren bir 'goto' bildirimimiz var.

COUNT değerinin eşit performans göstermesi durumunda, decfsz komutu programımızın 2 nokta ileri atlamasına neden olur ve 'Burada devam edin' iddiasında bulunduğumuz yere gönderilir.

Bu nedenle, gözlemleyebileceğiniz için, programın ilerlemeden önce önceden belirlenen bir süre için tek bir noktada oturmasını sağladık. Bu bir gecikme döngüsü olarak adlandırılabilir.

Gecikme Döngülerini Anlamak

Daha önemli bir gecikmeye ihtiyacımız olması durumunda, bir döngüyü diğerinden takip edebiliriz. Ekstra döngüler, gecikmeyi uzattı. LED flaşı gözlemlemek istediğimizi varsayarak en az iki tane yapalım .. Bu gecikme döngülerini programımıza yerleştireceğiz ve yorumlarla bunu gerçek bir program haline getirerek başaracağız:

Bu programı derlemek ve ardından PIC'yi programlamak mümkündür. Açıkçası, gerçekten çalışıp çalışmadığını kontrol etmek için devreyi çıkarmaya çalıştığınızdan emin olun. Aşağıdaki, PIC'yi programladığınız anda oluşturmanız gereken bir devre şemasıdır.


Aferin, aslında ilk PIC programınızı oluşturabilir, ayrıca bir LED'i yakıp söndürmek için bir devre kurabilirsiniz. Şimdiye kadar, bu kursları tamamladıysanız, toplamda 35 öğretmenden yedisini öğrenmiş olabilirsiniz, ancak şüphesiz şu ana kadar G / Ç bağlantı noktalarını kontrol ediyor olabilirsiniz!

LED flaşı daha hızlı hale getirmek için gecikme döngülerini değiştirmeyi dener miydiniz - aslında LED flaşı görmek için minimum COUNT değeri nedir? Ya da belki, LED'i sabitlemek için ilkinden sonra 3. veya tamamlayıcı bir gecikme döngüsü eklemek isteyeceksiniz. her gecikme döngüsü için benzersiz bir sabit.

LED flaşı belirli bir hızda, örneğin bir saniye sonra oluşturmak için, potansiyel olarak gecikme döngülerinizle gerçekten oynayabilirsiniz. Bir sonraki öğretimde, programı kompakt ve basit tutmak için bir alt yordam olarak bilinen bir şeyi nasıl kullanabileceğimize bakalım. Bir alt yordam, kodun veya programın ayrılmaz bir parçasıdır ve buna ihtiyaç duyduğunuzda anılabilir. Alt rutinler, aynı işlevi sık sık gerçekleştirdiğiniz durumlarda kullanılır.

Altyordamlar nelerdir

Bir alt yordam kullanmanın faydaları, bir alt yordamın içindeki değeri programınız boyunca on kez değiştirmek yerine, bir kez değiştirmenin daha kolay olacağı ve ayrıca programınızın içinde tükettiği bellek düzeyini azaltmaya büyük ölçüde katkıda bulunacağıdır. PIC. Bir alt programı kontrol edeceğiz:

Başlangıçta, alt programımıza bir atama sağlamamız gerekiyor ve bu durumda RUTİN'i seçtik. Bundan sonra normal şekilde yürütmek istediğimiz kodu yazıyoruz. Bu nedenle yanıp sönen led programımızda gecikmeyi seçtik. Son olarak, RETURN komutunu tuşlayarak alt programı sonlandırıyoruz.

Programımızın herhangi bir yerinden altyordamı başlatmak için, hızlı bir şekilde CALL komutunu ve ardından altyordam atamasını yazıyoruz.

Bunu biraz daha derinlemesine ele alacağız. Programımızın, xxx'in alt yordamımızın adı olduğu CALL xxx bölümüne ulaştığımızda, program, alt yordam xxx'in kurulu olduğu herhangi bir yere sıçrar. Alt programın içindeki talimatlar gerçekleştirilir.

RETURN talimatı yerine getirildiğinde, program CALL xxx komutumuzdan sonraki talimata dönerek ana programımıza geri döner.

Benzer alt yordamı istediğiniz gibi birkaç kez çağırmanız mümkündür, bu da alt yordamları kullanmanın programımızın genel süresini neden kısalttığını açıklar.

Yine de bilmeniz gereken birkaç faktör var. Başlangıçta, ana programımızda olduğu gibi, kullanabilmeniz için herhangi bir özel sabitin onaylanması gerekir.

Bunlar muhtemelen alt programın içinde veya doğrudan ana programın başlangıcında kabul edilebilir. Size, ana programınızın başında her şeyi kabul etmenizi öneriyorum, çünkü o zamandan beri her şeyin aynı konumda olduğunu anlıyorsunuz. Daha sonra, ana programın alt rutini atladığından emin olunmalıdır.

Bununla ima ettiğim şey, alt yordamı doğrudan birincil programınızın sonuna yerleştirmeniz gerektiğidir, ancak alt yordamın bulunduğu yerden atlamak için bir 'Goto' bildirimi kullanırsanız, program sizden bağımsız olarak alt yordamı devam ettirir ve uygular. gerek ya da başka türlü.

PIC, bir alt program ile ana program arasında ayrım yapmaz. Yanıp sönen led programımıza göz atacağız, ancak bu sefer gecikme döngüsü için bir alt program kullanacağız. İdeal olarak, programın ne kadar daha az karmaşık göründüğünü keşfedecek ve alt yordamın pratik olarak nasıl uygulandığını öğreneceksiniz.

Sonunda, gecikme döngümüz için bir alt yordam kullanarak, programın boyutlarını küçültmüş olabileceğimizi gözlemleyebilirsiniz.

Bir gecikme istediğimizde, muhtemelen LED açık veya kapalı olduğunda, temel olarak gecikme alt yordamı adını veriyoruz. Alt programın sonunda, program 'Çağrı' talimatımızı takip eden satıra geri döner. Yukarıdaki resimde LED'i yakıyoruz.

Bundan sonra alt programla iletişime geçiyoruz. Program daha sonra LED'i kapatabilmemiz için geri gelir. Alt yordamı bir kez daha çağırıyoruz, tam da alt yordamın tamamlanmış olması durumunda, program geri gelir ve tanıdığı sonraki talimat 'Başlamaya git' olur. İlgisini çekebilecek herhangi biri için, ilk programımız 120 bayt uzunluğundaydı.

Alt yordamın kullanımıyla, program boyutumuzu 103 bayta indirebildik. Bu o kadar harika görünmüyordu, ancak PIC içinde toplamda yalnızca 1024 bayta sahip olduğumuz göz önüne alındığında, her küçük miktarın faydası var.

Bir sonraki eğitimde, portlardan okumayı kontrol edelim.

Şimdiye kadar, bir LED'i açıp kapatabilmek için Port A'da beste yapıyoruz. Bu noktada portlardaki I / O pinlerini nasıl okuyacağımızı göreceğiz.

Giriş / Çıkış Portlarını Okuma

Bu, tam olarak harici bir devreyi bağlayabilmemizi ve sunduğu belirli çıktıları etkileyebilmemizi sağlamak içindir.

Daha önceki kurslarımızdan ezberlemeniz gerekiyorsa, G / Ç bağlantı noktalarını kurmak istiyorsanız, Banka 0'dan Banka 1'e atlamamız gerekiyordu. Bunu başlangıçta başaracağız:

Bu noktada, giriş için Port A'nın bit 0'ını sabitledik. şimdi pimin yüksek mi yoksa alçak mı olduğunu incelemeliyiz. Bunu başarmak için iki talimattan sadece biri kullanılabilir:

BTFSC ve BTFSS.

BTFSC talimatı, 'kaydettiğimiz bitin yanı sıra kayıt üzerinde bir bit testi yap' anlamına gelir.

0 olması durumunda, bu durumda sonraki talimatı atlarız '. BTFSS, 'Oluşturduğumuz kayıtta ve bitte bir bit testi yapın. 1 olarak ayarlanması durumunda, sonraki talimatı atlarız.

Hangisini kullanacağımız, girdiyi incelerken programımızın tam olarak nasıl yanıt vermesini istediğimizle belirlenir. Örnek olarak, girişin 1 olmasını beklememiz durumunda, BTFSS talimatını aşağıdaki şekilde kullanabiliriz:

Burada kodlayın:

BTFSS PortA, 0 Buradan başlayın Devam et:
:

PortA'daki bit 0'ın 1'e programlanması koşuluyla, program 'Burada devam et' e geçecektir.

Şu anda bir LED'i tek hızda uyarabilecek bir program yazacağız, ancak bir anahtar kapalıysa LED'i iki kat daha yavaş yanıp söner.

Belki de bu programı kendi başınıza uygulamak mümkündür, ancak yine de listeyi bir şekilde dahil ettik.

İlkeleri anlayıp anlamadığınızı kontrol etmek için tüm programı deneyebilir ve yazabilirsiniz. Eşdeğer devreyi daha önce olduğu gibi, PIC'in RA0'ına bağlı bir anahtar ve tedarikimizin pozitif rayını dahil ederek kullanacağız.

Burada başardığımız şey LED'i yakmaktır. Daha sonra anahtarın kapalı olup olmadığını belirlerim.

Sınırlı olması durumunda, daha sonra gecikme alt yordamımıza bağlanırım. Bu bize eskisi gibi eşdeğer bir gecikme sağlıyor, ancak bu noktada onunla iki kez iletişime geçiyoruz.

Aynı şey, LED kapalı olduğunda da geçerlidir. Anahtarın kapatılmaması durumunda, önceki açılış ve kapanış sürelerimizi kaydettik.

Bu dersleri en başından beri izlediyseniz, şu anda PIC 16F84 için 35 talimattan on tanesini keşfettiğinizi anlamaya çalışıyor olabilirsiniz! Ve bunların her bir parçası yalnızca bir LED'i açıp kapatarak öğrenilebilir.

Şimdiye kadar, PIC'in yanıp sönmesini ve bir LED'in açılıp kapanmasını oluşturduk.

Daha sonra PIC'mizi bir anahtar ekleyerek ve dolayısıyla flaş hızını değiştirerek başardık.

Bellek Alanını Verimli Kullanmak

Tek sorun, programın oldukça uzun olması ve bellek alanının oldukça verimsiz olmasıdır. Komutları ilk kez eklerken sorun yok gibi görünüyordu, ancak onu yürütmenin daha kolay bir yolu olmalıydı. Olumlu olarak, LED'i tam anlamıyla nasıl açıp kapattığımızı analiz edeceğiz.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

İlk önce w register'ımızı 02h ile doldurduk, ardından LED'i yakmak için PortA registerımıza aktardık. Kapatmak için, 00h ile paketledik ve ardından onu PortA kaydımıza kaydırdık.

Tüm bu rutinler arasında, LED'in yanıp sönmesini gözlemleyebilmemiz için bir alt programla temasa geçmek zorunda kaldık.

Bu nedenle, iki bilgi setini birkaç kez transfer etmemiz (bir kez w yazmacına sonra PORTA'ya) ve bir alt rutini iki kez çağırmamız (bir kez açık, sonra bir kez kapalı) gerekiyordu. Öyleyse, bunu daha fazla verimlilikle nasıl başarabiliriz? Çok basit.

XORF olarak bilinen farklı bir talimat kullanıyoruz. XORF talimatı, sağladığımız bilgilerle şart koştuğumuz kayıtta Özel OR işlevi çalıştırır. Devam etmeden önce dünyada Ayrıcalıklı bir Ameliyathanenin ne olduğunu açıklamam gerektiğine inanıyorum. İki girişimiz ve bir çıkışımız olması durumunda, iki giriş farklı olduğu sürece giriş yalnızca 1 olabilir. Aynı olsalar da, çıktı muhtemelen 0 olacaktır. Aşağıdakiler, bunları kontrol etmeyi seçen kişiler için bir doğruluk tablosudur:

A B F0 0 00 1 11 0 11 1 0

Bu noktada, B'yi önceki çıktımız gibi yaparsak ve basitçe A'nın değerini değiştirirsek neler olup bittiğini kontrol edeceğiz:

A B F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

A'nın değerini 1 ile aynı tutarsak ve bunu çıktıyla birlikte Özel VEYA kullanırsak, çıktı değişir. Bunu doğruluk tablosundan fark edemezseniz, aşağıdaki ikili değer kullanılarak görülebilir:

0 Akım Çıkışı
1 1 Yeni Çıkışlı EX-OR
EX-OR 1 0 Yeni Çıkışlı

Belki de bunu, çıktıyı 1 ile özel ORing yaparak bulabilirsin, şimdi çıkışı 0'dan 1'e değiştiriyor olacağız.
Bu nedenle, LED'imizi açıp kapatmak için yalnızca birkaç cümleye ihtiyacımız var:

MOVLW 02h
XORWF KAPI, 1

Tam olarak başaracağımız şey, 02h ile w registerımızı eklemektir. Bu durumda, PortA'mızda ne olursa olsun bu numarayı Özel ORing yapıyoruz. Bit 1'in 1 olması durumunda, 0'a değişecektir. Bit 1'in 0 olması durumunda, 1'e değişecektir. İkili nasıl çalıştığını görüntülemek için bu kodu bir veya iki kez inceleyelim:

KAPI
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Aslında her seferinde w register'ımıza aynı değeri yüklememiz gerekmiyor, bu nedenle bunu başlangıçta bir kez gerçekleştirmek ve basitçe geçiş komutumuza geri dönmek mümkündür. Ek olarak, PortA kaydımızda bir değer sabitlememiz gerekmiyor. Sebep? Elbette, güç açıldığında 1 olduğu için, onu kolayca değiştirebiliriz. Ben, güç açıldığında alternatif olarak 0, şimdi bile değiştirirdik.

Bu nedenle yeni oluşturulmuş kodumuzu görmek istersiniz. Birincisi, yanıp sönen LED kodumuzu temsil ederken, ikincisi, anahtarın eklenmesiyle birlikte olanı gösterir:

Bunu sadece tek bir kolay talimatı kullanarak bulabilmenizi dileyelim, şimdi programımızın ölçeğini azalttık. Gerçek şu ki, programlarımızı ne kadar azaltabileceğimizi göstermek için, aşağıdaki tabloda iki programı, tam olarak neyin oluşturduğunu ve boyutlarını gösterdik:

Program Değiştirme Boyutları (Bayt)
Yanıp Sönen LED Orijinal 120
Yanıp Sönen LED Alt Programı 103 Eklendi
Yanıp Sönen LED XOR İşlevi Kullanılan 91
Anahtarlı LED Orijinal 132
Kullanılan Anahtar XOR Fonksiyonlu LED 124.

Bu nedenle, sadece birkaç yeni talimat keşfetmedik, ek olarak komut dosyamızın boyutunu da düşürdük!

Aşağıda, tek tek bitleri nasıl oynayabileceğinizi, belirli basit aritmetiği ve veri tablolarını nasıl gerçekleştirebileceğinizi analiz edeceğiz.

Mantıksal Yöneticiler

Son eğitimde Exclusive OR işlemini sundum. ExOR işlevi, mantıksal bir operatör olarak anlaşılır.

Bu eğitimde, PIC'nin teşvik ettiği ek mantıksal operatörleri aydınlatacağım. Nokta programlarında herhangi bir durum olmayacak, ancak küçük kod alanları uygulayarak operatörleri kullanmanın kolay yöntemlerini öğreneceğiz.

AND işlevi temelde iki biti analiz eder ve aynı olup olmadıklarına dair bir 1 ve ayırt edici olmaları durumunda bir 0 verir. Örneğin, 1 VE 1'den söz etseydik, sonuç 1 olurken, 1 VE 0 ilan etmemiz durumunda sonuç 0 olur.

Söylemeye gerek yok, kelimeleri de değerlendirebiliyoruz, ayrıca AND işlevinin başardığı tüm iki terimi azar azar gözden geçiriyoruz. Aşağıdaki örnek, ürünle birlikte AND'li hale gelen 8 bitlik iki kelimeyi göstermektedir:

11001011
VE 10110011
10000011'e eşittir

Umarım kabul edersiniz, sonuçta 2 1s, bir çift kelimede birbirleriyle el ele olduğunda basitçe 1'e sahip olacaktır. Örneğin, portları doğrulamak için AND işlevini kullanabiliyoruz.

Bir devreye bağlı birkaç I / O pinini kontrol ediyorsak ve pinlerden sadece birkaçının yüksek olduğu belirli bir duruma dikkat etmeliyiz, bu durumda hemen hemen okuyabiliriz. bağlantı noktası, bundan sonra VE araştırmakta olduğumuz koşulla elde edilen sonuç, yukarıdaki durumla aynıdır.

PIC bize AND için iki bileşen sağlar.
Bunlar ANDLW ve ANDWF'dir. ANDLW, W kaydının ayrıntıları ve şart koştuğumuz bir miktar ile bir AND işlevi gerçekleştirmemize izin verir.

Sözdizimi şöyledir: ANDLW burada tam olarak ne yapacağımız VE W'nin içeriği.

AND işlevinin sonucu doğrudan W yazmacında saklanacaktır.
ANDWF, W kaydı ve farklı bir kayıt, örneğin bir PORT üzerinde bir AND işlevi gerçekleştirmemize izin verir. Sözdizimi şöyledir: ANDWF, burada hevesli olduğumuz kayıttır, ör. PORTA ve d, sonucu konumlandırmanız gereken PIC'yi gösterir. Eğer d = 0 ise, sonuç W yazmacına konur ve d = 1 ise, sonuç öngördüğümüz kütüğe kaydedilir. Aşağıdaki kodun iki bölümü, her AND işlevinin iyi bir örneğini göstermektedir.

Başlangıç, girişlerin 1100 olup olmadığını kontrol etmemiz gereken PORTA'nın durumunu incelemektir. Sonucu W yazmacına geri yerleştirebiliriz

movlw 1100
ANDWF 05h, 0 İkinci resim şimdi W yazmacının içeriğini doğrulayabilir:
ANDLW 1100

VEYA

Şimdiye kadar XOR'u tam olarak ifade etmek için bir OR işlevi keşfettik. Bu, iki bit aynı değilse, ancak farklıysa 1'e dönüşür. Kapsayıcı OR olan IOR adlı başka bir OR işlevi bulabilirsiniz. Bu işlev, bitlerden birinin 1 olması durumunda, ancak ek olarak her bitin 1 olması durumunda 1 üretecektir. Bunu açıklamak için aşağıda kesin bir doğruluk tablosu verilmiştir:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

Aritmetik Operatörler nedir

EKLE

Bu işlev, genellikle iddia ettiği şeyi başarır. İki rakama katkıda bulunur! İki rakamın eklenmesinin sonucunun 8 biti aşması durumunda, bu durumda muhtemelen bir TAŞIMA bayrağı ayarlanacaktır. TAŞIYICI bayrağı adres 03h bit 0'da bulunur.

Bu bit programlandığında, iki rakam 8 biti aştı. 0 olduğunda, bu durumda sonuç 8 bit içinde yer alır. Daha önce olduğu gibi, PIC bize iki ADD stili, özellikle de ADDLW ve ADDWF sunar. Tahmin etmiş olabileceğiniz gibi, bu yukarıdaki fonksiyona oldukça benzer. ADDLW, şart koştuğumuz W kaydının içeriğini sunar. Sözdizimi şöyledir: ADDLW ADDWF, W yazmacının içeriğini ve belirlediğimiz diğer bazı yazmacıları ekler.

Sözdizimi şöyledir: ADDWF, d nerede

ALT

Bu noktada, sanırım bu işlevin ne yaptığını tahmin edemezsiniz! Gerçekten, şüphelendin, bu işlev
bir bitini diğerinden çıkarır. Yine PIC bize 2 tat sağlıyor: SUBLW ve SUBWF. Sözdizimi, ADD işlevinin sözdizimi kesinlikle benzerdir, açık bir şekilde ADD yerine SUB yazmanız dışında

Artış PIC'e 1'i bir sayıya dahil etmek istememiz durumunda, kesinlikle ADD işlevini ve bir numarayı kullanabiliriz. ~ Bunun zorluğu, ilk önce rakamı W yazmacına yerleştirmemiz, ardından onu artırmak için ADDLW 1 kontrolünü kullanmamız gerektiğidir. 1'i bir kayda dahil etmek istememiz durumunda, daha da kötü olabilir. Önce 1 sayısını W yazmacına yerleştirmeliyiz, sonra ADDWF, 1'i kullanalım. Bu nedenle, örneğin, 0C konumuna 1'i dahil etmek için, diyelim ki, komut dosyasının aşağıdaki bölümüne sahip olmamız gerekir:

movlw 01
addwf 0c, 1

Bunu gerçekleştirmenin daha kolay bir yöntemi var. INCF komutunu uygulayabiliriz. Sözdizimi şudur: INCF, d burada, ilgilendiğimiz kayıt veya yer ve d, sonucu konumlandırmanız gereken PIC'yi gösterir. D = 0 durumunda, sonuç W yazmacının içindedir ve d = 1 durumunda sonuç, öngördüğümüz kayıtta belirlenir.

Bu bireysel talimatı kullanarak aslında kodlamanın yüzde ellisini yapabiliyoruz. Sonucun W yazmacına geri yüklenmesini istememiz durumunda, bu durumda yukarıdaki örneği kullanarak, 0C'nin öğelerini W yazmacına geri kaydırmak için ek bir komut eklememiz gerekebilir, ardından 0C yazmacını tekrar hayır ne olduğu önemli.

Arttırma komutu var. INCFSZ'dir. Bu komut, şart koştuğumuz kaydı artırabilir, ancak artımdan sonra kayıt 0'a eşit olursak (1 ila 127'yi dahil ettiğimizde ortaya çıkacaktır) bundan sonra PIC muhtemelen sonraki komutu geçecektir. Aşağıdaki kod kısmı bunu yansıtmaktadır:

Döngü incfsz 0C
Döngüye Git
:
:
Programın kalanı.

Kodun yukarıdaki bölümünde, 0C 1 artırılacaktır. Daha sonra PIC’i Döngü adlı etiketimize dönmesi ve 0C’yi tekrar 1 artırması için bilgilendiren bir talimatımız var. Bu, 0C 127'ye eşit olana kadar devam eder. Bu durumda, 0C'yi 1 arttırdığımızda, 0C şimdi 0 ile eşleşecektir. INCFSZ talimatımız, PIC'yi sonraki talimatı atlaması için çok iyi bilgilendirebilir, bu durumda bu durumda goto beyanı, dolayısıyla PIC, programın geri kalanıyla birlikte ilerleyecektir.

Azaltma

Şimdiye kadar azaltma işlevini daha önceki eğitimde tartıştık, bu nedenle artık revize etmeyeceğim.

Tamamlayıcı

Bu tartışmadaki son talimat, şart koştuğumuz kayıt defterindeki her bir biti tersine çevirecektir. Sözdizimi şöyledir: COMF, d burada

Bit İşlemlerini Anlamak

Bu, örneğin bir bağlantı noktasının pinlerini çıkıştan girişe vb. Hızlı bir şekilde değiştirmek için kullanılabilir. Bit fonksiyonları, bir ifade içinde tek bir biti şekillendirmemize izin verir. Öngördüğümüz kayıtlarda veya sayılarda tek bitleri ilerletmemize, ayarlamamıza ve bunlardan kurtulmamıza izin verir.

Bu kursun sonunda, ileriye ve sonra ters yönde ilerleyen bir dizi sıralama ışığı oluşturmak için tasarlanmış bir program açıklayacağız. Bunun daha önce özel VEYA işlevini incelediğimizde gerçekleştirildiğini gözlemledik, burada bağlantı noktalarını Münhasıran VEYA bir ifade ile ORTADIK. Şimdiye kadar PIC üzerinde bağlantı noktalarını kurduğumuzda birkaç bit işlev fark ettik ve

Kullanımlarını burada tekrar etmeme izin verin.

BCF

Bu talimat, belirlediğimiz bir kayıt defterinde şart koştuğumuz bir kısmı silecektir. Sözdizimi
dır-dir:
BCF,

Bunu daha önce STATUS yazmacındaki bir biti kaldırarak sayfa 1'den sayfa 0'a değiştirmek için kullandık. Aynı şekilde, herhangi bir farklı kayıtta / konumda bir biti 0'a sabitlemek için kullanabiliriz. Örneğin, 0C bölümünde kaydedilmiş 11001101'deki 3. biti 0'a ayarlamak istememiz durumunda,
ekle:

BCF 0C, 03

BSF

Bu komut, belirttiğimiz herhangi bir kayıtta 1'e şart koştuğumuz herhangi bir biti sabitler. Bunu daha önce Sayfa 0'dan Sayfa 1'e geçmek için kullandık. Sözdizimi: BSF, ve yukarıdaki BCF ile tam olarak aynı yöntemde kullanılıyor.

BTFSC Şimdiye kadar bir kayıtta bir bit ayarlayabilir veya temizleyebiliriz. Bununla birlikte, bir kayıtta bir bitin 1 mi yoksa 0 mı olduğunu kontrol etmemiz gerekip gerekmediğini hayal edin.

Şüphesiz BTFSC kullanmak mümkündür. Bit Test Kaydı F'yi belirtir ve Açıksa Atla. Bu talimat, kayıtta belirlediğimiz biti analiz edecek. Bitin 0 olması durumunda, komut PIC'yi sonraki talimatı atlaması için bilgilendirecektir.

Bu talimatı, örneğin taşıma bayrağı gibi bir bayrağı kontrol etmek istediğimizde kullanabiliriz. Bu, STATUS yazmacını okumamıza ve hangi bayrakların sabitlendiğini öğrenmek için ayrı bitleri aramamıza gerek kalmaz. 29 Örneğin, 2 figür ekledikten sonra Taşıma bayrağının 1 olarak ayarlanıp ayarlanmadığını kontrol etmek istersek, aşağıdakini yazabiliriz:

BTFSC 03sa, 0
1'e ayarlanmışsa burada devam et
veya burada 0 olarak ayarlanmışsa

Bit durumunun 1 olması durumunda, bu durumda BTFSC'den sonraki talimat tamamlanacaktır. 0'a ayarlanması durumunda, bu durumda sonraki komut atlanır. Kodun aşağıdaki bölümü, kullanılabileceği gösterir:

Döngü:
:
:
BTFSC 03,0
Döngüye Git

Yukarıdaki kodda, PIC, STATUS yazmacının (veya Taşıma bayrağının) bit 0'ının O'a tanımlanması durumunda basitçe döngüden çıkacaktır. Aksi takdirde, goto komutu yürütülecektir.

BTFSS

Bu talimat Bit Test Kaydı F'yi ve Ayarlanmışsa Atla'yı belirtir. Bu, BTFSC komutuyla karşılaştırılabilir, bunun dışında, değerlendirmekte olduğumuz bit 0 yerine 1'e ayarlanmışsa PIC sonraki talimatı atlayacaktır.

CLRF

Bu komut, bir yazmacın tüm ayrıntılarını 0'a sabitler. Sözdizimi şöyledir:

CLRF
CLRF 85h uygulayarak Bağlantı Noktalarının çıkışını 0 olarak ayarlamak için bunu daha önce kullandık. Ayrıca CLRF'yi kullanarak Bağlantı Noktalarını tüm pinleri çıkışa dahil edecek şekilde sabitlemek için kullandık
05h.

CLRW

Bu, W yazmacını temizler dışında CLRF komutuna benzer olabilir. Sözdizimi oldukça basittir:

CLRW

RLF ve RRF

Bu yönler, bir sicilde tek bir yuva bir kayıtta sola (RLF) veya sağa (RRF) bir bit taşır. Örneğin, 00000001'e ihtiyacımız olsaydı ve RLF kullandıysak, bu durumda 00000010'a sahip olabilirdik. Bu noktada 10000000 olması ve RLF komutunu uygulaması durumunda neler oluyor? Şüphesiz, 1 taşıma bayrağında konumlandırılacaktır. RLF talimatını bir kez daha uygulamamız durumunda, 1 başlangıçta yeniden ortaya çıkacaktır. Benzer durum, RRF talimatı için tam tersi şekilde gerçekleşir. Aşağıdaki noktadaki durum, bunu bir yazmacın 8 bitini ve taşıma bayrağını görebildiğimiz RLF komutu için göstermektedir:

C 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
1 00000000 RLF
RLF 0 00000001

Örnek Program

Şimdi derleyip kullanabileceğiniz bir örnek kod göreceğiz. PortA bit 0'dan başlayıp PortB bit 8'e giden bir sıralama ışığı oluşturacak ve
sonra geri dönüyor.
LED'leri Port pinlerinin her birine bağlayın. Birazına sahip olacağız
bu eğitimde belirtilen prosedürler.

TIME EQU 9FH Gecikme döngüsü için değişken.
PORTB EQU 06H Bağlantı Noktası B adresi.
TRISB EQU 86H Port B Tristate adresi.
PORTA EQU 05H Port A adresi.
TRISA EQU 85H Port A Üç durumlu adres.
STATUS EQU 03H Sayfa seçme kaydı.
COUNT1 EQU 0CH Döngü kaydı.
COUNT2 EQU 0DH Döngü kaydı.

BSF DURUMU, 5 1. sayfaya git
MOVLW 00H ve kurulum
MOVWF TRISB hem Port A hem de B
MOVLW 00H çıkışa,
MOVWF TRISA daha sonra
BCF DURUMU, 5 sayfa 0.
MOVLW 00H Clear Port A.
MOVWF KAPI

Ana programın başlangıcı

RUNMOVLW
01H İlk bit'i ayarlayınMOVWF
Liman B.CALL üzerindeki PORTB
GECİKME Bir süre bekleyin
GECİKME
B Bağlantı Noktası üzerindeki biti sola hareket ettirin, ardından duraklatın.
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1CALL
GECİKME
GECİKME
PORTB, 1 Bu, biti taşıma bayrağına taşır
Şimdi Port A'ya gidin ve biti sola hareket ettirin.
PORTA, 1 Bu, biti sıfır bayrağından PortACALL'a taşır.
DELAYCALL GECİKMESİ
KAPI, 1 ÇAĞRI
GECİKME
GECİKME
KAPI, 1 ÇAĞRI
GECİKME
GECİKME
KAPI, 1 ÇAĞRI
GECİKME
GECİKME
Bit'i ARRF Bağlantı Noktasına geri taşıyın
KAPI, 1 ÇAĞRI
GECİKME
DELAYRRF
KAPI, 1 ÇAĞRI
GECİKME
DELAYRRF
KAPI, 1 ÇAĞRI
GECİKME
DELAYRRF
PORTA, 1 Bu, biti sıfır bayrağına taşır Şimdi biti hareket ettirin
BRRF Bağlantı Noktasına geri dön
PORTB, 1CALL
GECİKME
DELAYRRF
PORTB, 1CALL
GECİKME
DELAYRRF
PORTB, 1CALL
GECİKME
DELAYRRF
PORTB, 1CALL
GECİKME GECİKMESİ
PORTB, 1CALL
GECİKME
DELAYRRF
PORTB, 1CALL
GECİKME
DELAYRRF
PORTB, 1CALL
GECİKME
GECİKME Şimdi başladığımız yere geri döndük, GOTO
RUN hadi tekrar gidelim.

Eğitim setinde bir veri tablosundan yararlanmanıza izin veren harika bir seçenek vardır.

Bir veri tablosu, tümünün birkaç düşünceye dayalı olarak incelendiği bir veri alıntıları listesidir.
Örneğin, bir giriş pininin 1 saniyede yükseldiği örneklerin miktarını sayan bir PIC kullanan bir devreniz olabilir. Bundan sonra numarayı 7 segmentli ekranda sergileyebilirsiniz.

Zamanlama başlar başlamaz, PIC, pimin yükseldiği durumların sayısını saymaya başlar. 1 saniye sonra tabloyu ziyaret eder ve verilere bakar, ekranda pimin yükseldiği durumların miktarını sembolize eden sayıyı göstermesi gerekir. PIC tahminini gerçekleştirene kadar rakamın ne olabileceğini belirleyemeyeceğimiz için bu faydalı olabilir.

Bir tablo kullanarak, PIC'nin hangi figürü göstereceğini belirlemesine izin verebiliyoruz. Bu noktada, size veri tablosunun nasıl çalıştığını göstermeye devam etmeden önce, PIC'in program çalışırken bulunduğu yerin yolunu koruduğunu söylemem gerekebilir.

BASIC'de belirli programlama yapanlar için kolaylaştırır. Aksi takdirde endişelenmeyin, teori hakkında bilgi edinmeye devam etmek isteyebilirsiniz. Aşağıda sunulana benzer bir BASIC programı olduğunu hayal edin:

10 YIL K = 0
11 K = K + 1
12 IF K> 10 SONRA 20 BAŞKA GİT 11
20 YAZDIR K
21 SON

Program 10. satırdan başlar. K, 0'a programlanır verilmez, sonraki satır 11'e ilerler. 1'den K'ye kadar olanı dahil ettikten sonra, ondan sonra satır 12'ye geçeriz.

Bu noktada K'nin 10'dan büyük olup olmadığını merak ediyor olabiliriz. Öyleyse, sonra 20. satıra gideriz ya da 11. satıra geri döneriz.

Satır 20 K'yi belgeler ve satır 21 programı sonlandırır. BASIC, etiketlere yetki verilmediğinden programcının sorunların nerede olduğuna dair bir kayıt tutmasına yardımcı olmak için satır istatistiklerini kullanır. PIC, hedefler arasında kaçmak için etiketler kullanır - yoksa gerçekten olabilir mi?

Etiketleri, sorunların nerede olduğunun farkında olmamızın yanı sıra PIC'i nerede arama yapacağımızı basit bir şekilde bilgilendirebilmemizi sağlamak için kullanıyoruz.

PIC, Program Sayacı adı verilen bir iç satır sayacından yararlanır. Program Sayacı (PC olarak kısaltılır) mevcut komutun bulunduğu hafıza hedefinin izi.

PIC'yi seçili bir etiketi ziyaret etmesi için her bilgilendirdiğimizde, bellek alanını anlar ve bu nedenle, bu bellek hedefini görene kadar bilgisayarı büyütür. Bu, yukarıdaki BASIC programına baktığımız yöntemle tamamen aynıdır. Aşağıda, her talimatın yanında, bellek alanları veya PC'nin öğeleri ile birlikte bir kod bölümü bulunmaktadır:

PC Talimatı0000 movlw 03
0001 movwf 0C
0002 Döngü decfsc 0C
0003 goto Döngü
0004 sonu

Yukarıdaki gösterimde, PC'yi 0000 olarak sabitledik. Bunun üzerine movlw 03 komutumuz var. PIC bu veriyi uyguladığında, sonraki komutun taranması için PC'yi arttırır. Bu noktada PIC, movwf 0C'yi görüntüler. PC bir kez daha artırılır.

Şimdi PIC decfsc 0C üzerinde çalışıyor. 0C'nin ayrıntılarının 0 olmaması durumunda, bu durumda PC 1 artırılır ve aşağıdaki talimat, goto Loop, PC'yi söz konusu Döngünün bulunduğu 0003 konumuna geri dönmesi için bilgilendirir. 0C'nin detaylarının 0 olması durumunda, PC'ye 2 artırması tavsiye edilir, sadece sonraki talimatı atlayın.

Veri Tablolarını Anlamak

Bu, PC'yi programın bittiği 0004 konumuna yerleştirir. Hedefler montajcı tarafından belirlenir ve genellikle PC'nin neler başardığını düşünmemiz gerekir. Ta ki veri tablolarını kullanırken yaptığımız gibi onu kontrol altına alma ihtiyacını bulana kadar. Bir veri tablosunun nasıl çalıştığını açıklamanın en uygun yolu, bir resimle başlamaktır.

PC eşdeğeri 02
movlw 03
çağrı masası
:
tablo addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
dönüş

İlk talimat, etiket PC'sini Program Sayacının (02h) adresi ile tahsis etmektir. 03h değerini w yazmacına koyduktan hemen sonra olacağız. Bundan sonra masayla iletişim kurarız. Alt rutin tablosundaki en ön satır, W yazmacının (03h) ayrıntılarını program sayacına kadar artırır.

Bu, program sayacını 3 artıracak veya farklı bir şekilde ifade edecek şekilde tetikler, program sayacını 3 satır aşağıya doğru hareket ettirir. Sayaç 3 satır aşağı gelirken, PIC komut geri dönüşünü tanır. Bu komut, onu takip eden değeri W yazmacına gönderir ve ardından alt programdan geri döner. RETLW temelde Dönüş'ü, Literal'i W'yi ifade eder.

Dönüş kelimesinden sonra virgül koydum. Bir alt programın içinde olduğumuz için, yüzeyine bir Dönüş talimatına ihtiyacımız var. Bu nedenle talimattaki RET. RETLW komutundan sonra bir sayıdır ve bu tam olarak W yazmacına yazılan şeydir.

Bu örnekte, şekil 3'tür. W yazmacına herhangi bir miktar atayabiliriz, bu rakam tablo alt yordamındaki Program Sayacı ile birleştirildiği sürece, bir retlw komutu keşfedeceğiz. Yukarıdaki örnekte bu, 1'den 7'ye kadar herhangi bir sayıya sahip olabileceğimiz anlamına gelir. Alt rutini geçmemiz durumunda, programın ek bir bölümünü gerçekleştirmeyi bitirebiliriz. Bu nedenle, veri tablosunu tam olarak PIC programının sonuna yerleştirmek genellikle akıllıca bir harekettir, bu nedenle bu durumda aşma yaparsak, yine de programın sonucuna varacağız.

Kesmeler konusu belki de en uzun ve en zor olanı olabilir.

Kesintileri detaylandırmak için karmaşık olmayan bir yöntem bulamazsınız, ancak bu bölümün sonuna doğru biraz şansla kesintileri kendi programlarınıza uygulayabilirsiniz.
Bölümü 2 aşamaya ayırdık. Bu, konuyu bölümlere ayırmak ve ayrıca size kolay anlaşılması için kullanışlı bir plit up sağlamak içindir.

Kesinti tam olarak nedir? Elbette, terimden de anlaşılacağı gibi, bir kesme, bir mikroişlemciyi / mikro denetleyiciyi yaptığı her şeyden farklı bir şeyin gerçekleşmesini engelleyen bir teknik veya sinyaldir.

Size günlük bir örnek vermeme izin verin. Kendi evinizde dinlendiğinizi, başka biriyle sohbet ettiğinizi düşünün. Birdenbire telefon çalar.

Konuşmayı bırakırsınız ve arayanla konuşmak için telefonu alırsınız. Telefonla etkileşim kurduğunuzda, telefon çalmadan önce o kişiyle konuşmaya geri dönmeye karar verirsiniz. Birisiyle sohbet ederken ana rutini düşünmek mümkündür, telefonun çalması konuşmanızı kesintiye uğratır ve rutindeki kesinti telefonda konuşma yöntemidir.

Telefon görüşmesi sona erdiğinde, birincil sohbet rutininize geri dönersiniz. Bu örnek tam olarak bir işlemcinin harekete geçmesi için nasıl kesinti yaptığını gösterir.

Birincil program çalışıyor, bir devrede belirli bir işlevi yerine getiriyor, ancak bir kesinti meydana geldiğinde birincil program dururken farklı bir rutin gerçekleştirilir. rutin sona erdiğinde, işlemci daha önce olduğu gibi birincil rutine geri döner.

Kesintileri Anlamak

PIC, 4 kesme kaynağına sahiptir. Birkaç gruba ayrılabilirler. Bunlardan ikisi, PIC için dışarıdan kullanılabilen kesinti kaynaklarıdır, diğer ikisi ise iç süreçlerdir. Burada iki dış türü açıklığa kavuşturmama izin verin. Diğer ikisi, zamanlayıcılara ve verileri depolamaya vardığımızda farklı eğitimlerde açıklanacak.

PIC'in pin çıkışını kontrol ederseniz, pin 6'nın RB0 / INT olduğunu fark edeceksiniz. Bu noktada, RB0, açıkça Port B bit 0'dır. INT, bunun bir dış kesme pini olarak yapılandırılabileceğini de gösterir. Ayrıca, 4 ila 7 numaralı Bağlantı Noktası pinleri (10 ila 13 numaralı pinler) da kesintiler için kullanılabilir. INT veya başka bir Port B pinini kullanmadan önce, iki görevi yerine getirmeliyiz. En başta PIC'yi kesintilerden yararlanacağımız konusunda bilgilendirmeliyiz.

Daha sonra, bir G / Ç pini yerine bir kesme olarak hangi bağlantı noktası B pinini kullanacağımızı belirlemeliyiz. PIC içinde INTCON olarak bilinen ve 0Bh adresinde bulunan bir kayıt defteri bulabilirsiniz. Bu kayıtta etkinleştirilebilen veya devre dışı bırakılabilen 8 bit keşfedeceksiniz. INTCON'un Bit 7'si GIE olarak bilinir. Bu, Global Interrngupt Enable'dır. Bunu 1'e sabitlemek, PIC'ye bir kesinti uygulayacağımızı bildirir.

INTCON'un 4. biti INTE, INTerrupt Enable olarak bilinir. Bu biti 1'e koymak, PIC'ye RB0'ın bir kesme pini olacağını iletir. RBIE adı verilen 3. biti yapılandırma, PIc'ye Port B bitleri 4 ila 7'yi kullanacağımızı bildirir. Bu noktada PIC, pinin ne zaman yüksek veya düşük olabileceğini anlar, gerçekleştirdiği şeyi durdurması ve bir kesinti ile devam etmesi gerekir. rutin. Bu noktada, PIC'e kesintinin muhtemelen yükselen kenarda (0V ila + 5V) veya sinyalin düşen kenarda (+ 5V ila 0V) olup olmayacağını bildirmeliyiz.

Basitçe ifade etmek gerekirse, sinyal düşükten yükseğe veya yüksekten düşüğe her hareket ettiğinde PIC'in kesintiye uğramasını ister miyiz? Suçluluk ile, bu yükselen kenara yerleştirilmek üzere kurulabilir.

Kenar 'tetikleme', 81h adresinde OPTION yazmacı adı verilen ek bir kayıtta programlanmıştır. Hevesli olduğumuz kısım, genellikle INTEDG olarak anılan bit 6'dır.

Bunu 1 olarak ayarlamak, PIC'yi montaj kenarında (varsayılan durum) kesintiye uğratmak üzere tetikler ve 0 olarak ayarlamak, PIC'yi kayan kenarda kesintiye uğratmak üzere uyarır. PIC'in yükselen kenarda etkinleşmesini istiyorsanız, bu kısma kesinlikle bir şey yapmanız gerekmez.

Bu noktada, ne yazık ki, Seçenek kaydı Sıra 1'dedir, yani sıra 0'dan sıra 1'e, biti Seçenek yazmacındaki biti ayarladıktan sonra sıra 0'a dönmekten zevk alıyoruz. Buradaki anahtar her biti başarmaktır. Banka 1, tek bir vuruşta kayıt yapar, örneğin bağlantı noktası pimlerini kurarak, daha sonra işiniz bittiyse Banka 0'a döner.

Güzel, sonuç olarak PIC'ye hangi pinin muhtemelen kesme olacağını ve nerede tetikleneceğini, kesinti her meydana geldiğinde programda ve PIC'de neler olduğunu bildirdik? Birkaç şey gerçekleşir. İlk olarak, bir 'bayrak' planlanır.

Bu, PIC'nin dahili işlemcisine bir kesintinin gerçekleştiğini bildirir. Daha sonra, program sayacı (önceki eğitimde bahsettiğim) PIC içindeki belirli bir adrese ipucu veriyor. Tüm bunları tek tek hızlı bir şekilde kontrol edelim. Kesme Bayrağı INTCON kaydımızda, bit 1, INTF olarak adlandırılan kesme bayrağıdır. Bu noktada, herhangi bir kesinti ortaya çıktığında, bu bayrak muhtemelen 1'e sabitlenecektir.

Bir kesinti olmadığında, bayrak 0'a yerleştirilir. Üstelik bu hemen hemen her şeyi başarır. Bu noktada 'ne anlamı var?' Diye düşünüyor olabilirsiniz. Elbette, bu bayrak 1 olarak planlanmış olsa bile, PIC başka bir kesmeye tepki veremez ve tepki vermeyecektir. Bu nedenle, bir kesintiye neden olduğumuzu ifade edelim. Bayrak muhtemelen 1'e sabitlenecek ve PIC, kesinti için çalışma rutinimize gidebilir.

Bu bayrak 1'e sabitlenmediğinde ve PIC'in kesmeyi yanıtlamaya devam etmesine izin verildiğinde, pimi sürekli olarak darbeli hale getirmek PIC'nin kesinti rutinimizin başına dönmesini ve hiçbir şekilde onu tamamlamamasını sağlayabilir. Telefonla ilgili resmime dönersek, telefonu kaldırmaya benzer ve tartışmaya başladıktan hemen sonra başka biri sizinle konuşmak istediğinden tekrar çalmaya başlar.

Bir diyaloğu tamamlamanız ve ardından sonraki kişiyle konuşmak için telefonu tekrar tutmanız önerilir. Bu bayrakla ilgili küçük bir sorun bulabilirsiniz. PIC bu bayrağı hızlı bir şekilde 1'e ayarlasa da tekrar 0'a ayarlamaz! Bu aktivite programcı tarafından - yani siz - gerçekleştirilmelidir. Bu, zahmetsizce gerçekleştirilebilir, çünkü ben kesinlikle varsayıyorum ve PIC kesme rutini gerçekleştirdikten sonra başarılması gerekiyor.

Bellek Konumu PIC'yi ilk çalıştırdığınızda veya bir sıfırlama olması durumunda, Program Sayacı, program belleğinin başlangıcında hemen olabilen 0000h adresini işaret eder. Ancak, bir kesinti olması durumunda Program Sayacı 0004h adresini gösterecektir.

Bu nedenle, kesintileri olacak programımızı oluştururken, öncelikle PIC'yi 0004h adresine atlaması için bilgilendirmeli ve programın geri kalanından ayrı olarak 0004h adresinde başlayan kesme rutinini korumalıyız.

Bunu gerçekleştirmek zahmetsiz olabilir. Başlangıçta, ORG olarak bilinen bir komutla programımıza başlıyoruz. Bu komut, Origin veya start'ı belirtir. Bir adresle ona bağlı kalıyoruz. PIC 0000h adresinde başladığından ORG 0000h yazıyoruz. Bundan sonra 0004h adresini atlamalıyız. Bunu, birincil programımıza ipucu veren bir etiketle birlikte bir GOTO talimatı koyarak başarıyoruz.

Bundan sonra bu GOTO komutuna bir ORG daha, bu anda 0004h adresiyle bağlı kalıyoruz. Bu komuttan sonra kesme rutinimizi ekleyeceğiz. Bu noktada, muhtemelen kesme rutinimizi ikinci ORG komutunu takiben doğrudan yazabiliriz veya kesme rutinine işaret eden bir GOTO ifadesini konumlandırabiliriz.

Bu gerçekten sizin açınızdan seçenek ile ilgilidir. Teklif ettiği PIC'yi bilgilendirmek için kesme rutininin sonuna geldiğimizde RTFIE komutunu rutinin sonuna doğru konumlandırmalıyız. Bu komut, kesme yordamından dönüşü belirtir. PIC bunu fark ederken, Program Sayacı, PIC'nin kesinti meydana gelmeden önceki son konumunu gösterir. Yukarıdakileri görüntülemek için aşağıda kısa bir kod bölümü oluşturduk:

Kesintileri kullanırken bilmeniz gereken birkaç husus vardır. İlk olarak, birincil programınızda ve kesme rutininde aynı kaydı kullanıyor olsanız, yazmaç ayrıntılarının kesme gerçekleştiğinde büyük olasılıkla değişeceğini aklınızdan çıkarmayın.

Örneğin, veriyi Port A birincil programına iletmek için w yazmacını kullanalım, bu nedenle verileri bir hedeften diğerine kaydırmak için kesme rutinindeki w yazmacını ek olarak kullanabilirsiniz.

Dikkatli olmamanız durumunda, w yazmacı, kesme rutinindeyken aldığı son değeri içerecektir, bu nedenle kesmeden döndüğünüzde bu bilgi, daha önce sahip olduğunuz değerden ziyade Port A'ya gönderilecektir. kesinti meydana geldi.

Bunun etrafındaki araç, kesme rutininde tekrar kullanmadan önce w yazmacının ayrıntılarını anlık olarak kaydetmektir. İkincisi, bir kesintinin ne zaman meydana geldiği ile bir sonrakinin ortaya çıkabileceği zaman arasında bir gecikme bulabileceğiniz gerçeğidir. Anladığınız halde, PIC, muhtemelen bir kristal veya bir direnç-kondansatör kombinasyonu olabilen bir dış saate sahiptir.

Bu saatin frekansı ne olursa olsun, PIC onu 4'e böler ve ardından bunu kendi iç zamanlaması için kullanır. Örneğin, PIC'inize bağlı bir 4MHz kristaliniz olması durumunda, bu durumda PIC, talimatları 1MHz'de gerçekleştirecektir. Bu iç zamanlama bir Talimat Döngüsü olarak bilinir. Bu noktada, veri sayfası kesintiler arasında 3 ila 4 talimat turunu etkinleştirmeniz gerektiğini iddia ediyor (şüphesiz küçültülmüş baskıda).

Benim 4 turu etkinleştirmek istiyorum. Gecikmenin arkasındaki neden, PIC'nin kesme adresine, bayrağa atlamak ve kesme rutininden uzaklaşmak için zamana ihtiyaç duymasıdır. Bu nedenle, PIC için bir kesmeyi etkinleştirmek için alternatif bir devre ile çalışıyorsanız bunu aklınızda bulundurun.

Bu noktada, bir kesme olarak Port B'nin 4 ila 7 bitlerini kullanırsanız bir nokta var. Kesme olarak işlev görmesi için Port B'de belirli pinler seçemezsiniz.

Bu nedenle, bu pimlere izin verirseniz, bunların tümü elde edilebilir olabilir. Bu nedenle, örneğin, 4 ve 5 numaralı bitlere sahip olamazsınız - 6 ve 7 numaralı bitler aynı anda güçlendirilecektir. Bir kesmeyi temsil etmek için dört bit elde etmenin amacı tam olarak nedir? Şüphesiz, PIC'e bağlı bir devreniz olabilir, dört hattan herhangi birinin yükselmesi durumunda, bu durumda bu, PIC'in anında etkilemesini gerektiren bir sorun olabilir.

Bunun bir örneği, dört sensörün Port B pinleri 4 ila 7'ye bağlandığı bir ev güvenlik alarmı olabilir. Herhangi bir spesifik sensör, PIC'den bir alarmı tetiklemesini isteyebilir ve alarm sinyalleme rutini, kesme rutinidir. Bu, bağlantı noktalarının sürekli olarak kontrol edilmesini sağlar ve PIC'nin farklı konularla devam etmesine izin verir. Bir sonraki eğitimde, bir kesmeyi yönetmek için bir program oluşturacağız.

Son eğitimde birçok temel konuyu ele aldık, bu nedenle ilk programımızı oluşturmamızın zamanının geldiğini hissediyorum.

Yazacağımız program, bir anahtarı açtığımız durumların sayısını sayacak ve ardından sayıyı sergileyecektir.

Program, ikili biçimde 4 LED üzerinde görüntülenebilen 0'dan 9'a kadar sayacaktır ve giriş veya kesinti muhtemelen RB0'da olacaktır.

Yapmamız gereken bir numaralı şey, bir kesinti meydana geldiğinde Program Sayacının işaret ettiği adresin üzerinden atlaması için PIC'yi bilgilendirmektir.

Onaltılık sayıları sergilemek için benzersiz bir yöntem kullandığımızı göreceksiniz. Ben olmadan önce, h'nin onaltılı olarak gösterdiği F9h'yi uygulayın. Bunu bundan sonra kullanacağımız yapı olan 0xF9 olarak yazabiliriz.

Şimdi PIC'e kesintileri kullanacağımızı söylememiz gerekiyor ve RB0 pin 6'yı kesme pini olarak kullanıyoruz:

bsf INTCON, 7GIE - Global kesinti etkinleştirme (1 = etkinleştir)
bsf INTCON, 4INTE - RB0 kesinti etkinleştirme (1 = etkinleştir)
Her ihtimale karşı kesme bayrağını temizleyeceğim (hiçbir şeye asla güvenmem!)
bcf INTCON, 1INTF - Her ihtimale karşı bayrak bitini temizle

Şu anda 2 limanımızı kurmalıyız. Şimdi RB0'ı bir kesme pini olarak kullandığımız için, bunun bir girdi olarak oluşturulması gerektiğini unutmayın:

Anahtar sayısını saklamak için COUNT adlı bir değişken kullanacağız. Sadece Port A'daki değeri artırabilirdik, ancak kesme rutinimizi yazarken neden bir değişken kullandığımı göreceksiniz.

Bu nedenle, ana programımız oluşturulmuştur ve bu noktada PIC'yi bir kesinti meydana geldiğinde nasıl ilerleyeceğini bildirmeliyiz. Bu örnekte, kesmemiz muhtemelen anahtar olacaktır. PIC'in istediğimiz şey, anahtar her kapatıldığında ayarlanabilir COUNT'a birdir.

Yine de, anahtarın 0'dan 9'a kaç kez kapandığını göstermek istiyoruz. Yukarıda, her kesinti olduğunda Port A'daki değeri basitçe artırabileceğimizi belirttim. Bununla birlikte, Port A'da 5 bit var, eğer portu basitçe arttırırsak, en yüksek sayı olan 31'e sahip olacağız. Neden 31'e kadar hareket etmemeyi seçtiğimi birkaç açıklama var.

Başlangıçta, en fazla 0'dan 15'e (onaltılık olarak 0'dan F'ye) gidebilen 7 segmentli bir ekran kullanacağız. Daha sonra, size son birkaç derste karşılaştığınız aritmetik komutlardan birkaçını da göstermek istiyorum.

Bu nedenle, kesinti rutinimize devam edeceğiz. COUNT’un içeriğini PORTA’ya kaydırmak için uyguladığımızdan, şu anda ilk yapmamız gereken, w register'ımızın ayrıntılarını kısaca saklamaktır. Kaydetmezsek, bu durumda aritmetiğimizden dolayı tamamen farklı bir sayı verebiliriz. Bu nedenle önce şunu başaralım:

Bu noktada COUNT değerinin 9 veya daha fazla olup olmadığını anlıyoruz. Şimdi başarmamız gereken şey, COUNT 9'dan fazlaysa, onu 0'a geri yerleştirmek ya da Port A'ya teslim edebilmemiz için ana programa geri dönmek. Anladığınız için BTFSS komutu sonraki
taşıma işaretinin planlanması durumunda talimat, yani COUNT = 10:

Şimdi yapılacak tek şey, programımızın hemen başında gerçekleştirebileceğimiz sabitlerimize değer belirlemenin yanı sıra toplu olarak girmek.

Düğmeyi her etkinleştirdiğinizde, LED'ler ikili olarak 0000'dan 1010'a ve sonra tekrar 0000'a sayacaktır.

Aşağıdaki şekil, yukarıda açıklanan kodla uyumlu devre şemasını göstermektedir. İlginç bir şekilde, zamanlama kapasitörünün tasarıma dahil edildiğini göreceksiniz. Bu, bu süre zarfında yanınızda hiç yanınızda bulunmadığında kapasitörün dahil edilmesinden kaçınma özgürlüğünü elde ettiğiniz güzel küçük hile.

Burada kapasite, osilatör pimi ve toprak üzerindeki kaçak kapasitans yoluyla devreye girer.
Elbette, bir kapasitörden kaçınmanın çok akıllıca bir yolu gibi görünmeyebilir, çünkü başıboş değer verilen farklı koşullara göre değişebilir.

Devrede görülebilecek diğer bir bölüm, anahtar üzerindeki ihbar ağıdır. Bu, mekanik anahtarlama sırasında paraziti önler ve anahtarlamanın tek bir geçiş veya birden fazla geçiş olması durumunda PIC'in karışmasını önler.




Önceki: Programlanabilir Çift Yönlü Motor Zamanlayıcı Devresi Sonraki: Buck-Boost Devreleri Nasıl Çalışır?