- Gerekli malzemeler:
- Kesintiler nedir ve nerede kullanılır?
- Devre Şeması ve Açıklaması:
- PIC Mikrodenetleyicide Kesintilerin Simülasyonu:
- Kod Açıklaması:
- PIC16F877A Kesmelerinin Çalışması:
Bu eğitimde , PIC Mikroişlemcide bir Harici Kesmenin nasıl kullanılacağını ve onlara neden / nerede ihtiyaç duyacağımızı öğreneceğiz. Bu, PIC Mikrodenetleyicilerini sıfırdan öğrenmeye başladığımız PIC Eğitimleri dizisinin bir parçasıdır; bu nedenle bu eğitim, MPLABX kullanarak bir PIC MCU'nun nasıl programlanacağını ve bir LCD ile PIC arasındaki arayüzün nasıl oluşturulacağını bildiğinizi varsayar. Aksi takdirde, lütfen ilgili bağlantılara geri dönün ve onları okuyun, çünkü burada ele alınan bilgilerin çoğunu atlayacağım.
Gerekli malzemeler:
- PIC16F877A Performans Kurulu
- 16x2 LCD Ekran
- Butona basınız
- Kabloların Bağlanması
- Ekmek Tahtası
- PicKit 3
Kesintiler nedir ve nerede kullanılır?
PIC mikro denetleyici kesintilerinin nasıl programlanacağına başlamadan önce, Kesmenin gerçekte ne olduğunu ve bunları nerede kullanmamız gerektiğini anlayalım. Ayrıca, Mikrodenetleyicide birçok kesinti türü vardır ve PIC16F877A'da yaklaşık 15 tane vardır. Şimdilik hepsini kafamızda karıştırmayalım.
Yani! Mikrodenetleyicilerde kesinti nedir?
Hepimizin bildiği gibi mikro denetleyiciler, girişe bağlı olarak gerekli çıktıları tetikleyen önceden tanımlanmış (programlanmış) bir dizi etkinleştirmeyi gerçekleştirmek için kullanılır. Ancak, Mikrodenetleyiciniz bir kod parçasını çalıştırmakla meşgulken, kodunuzun diğer parçasının hemen ilgilenilmesi gereken bir acil durum olabilir. Hemen ilgilenilmesi gereken bu diğer kod parçası bir kesme olarak ele alınmalıdır.
Örneğin: Cep telefonunuzda en sevdiğiniz oyunu oynadığınızı ve telefonunuzun içindeki denetleyicinin (varsayım) oyunun keyfini çıkarmanız için gereken tüm grafikleri atmakla meşgul olduğunu düşünelim. Ama birden kız arkadaşın numaranı arar. Şimdi, olabilecek en kötü şey, bir oyun oynamakla meşgul olduğunuz için mobil kontrol cihazınızın kız arkadaşlarınızın aramasını ihmal etmesidir. Bu kabusun olmasını önlemek için kesinti denen bir şey kullanıyoruz.
Bu kesintiler her zaman bazı belirli eylemlerin gerçekleşmesi için aktif bir liste olacak ve meydana geldiklerinde bir kod parçası çalıştırıp normal işleve geri dönecekler. Bu kod parçasına kesme hizmeti rutini (ISR) denir. Kesmenin zorunlu olduğu pratik bir proje "PIC Mikrodenetleyiciyi kullanan Dijital Hız Göstergesi ve Kilometre Sayacı Devresi" dir.
Mikrodenetleyicilerde iki ana tür kesinti vardır. Harici Kesinti ve Dahili Kesmedir. Dahili Kesmeler, örneğin Zamanlayıcı Kesintileri, ADC Kesintileri vb. Gibi bir görevi gerçekleştirmek için Mikron Kontrolör içerisinde meydana gelir. Bu kesintiler, sırasıyla Zamanlayıcı işlemini veya ADC işlemini tamamlamak için yazılım tarafından tetiklenir.
Harici kesme, kullanıcı tarafından tetiklenebilen kesmedir. Bu programda, bir kesmeyi tetiklemek için bir basma düğmesi kullanarak bir Harici kesmenin nasıl kullanılacağını öğreneceğiz. 0'dan 1000'e kadar artan sayıları görüntülemek için bir LCD kullanacağız ve bir kesinti tetiklendiğinde, bunu Interrupt Service Routine ISR'den bildirmeli ve ardından sayıları artırmaya devam etmeliyiz.
Devre Şeması ve Açıklaması:
PIC16F877 kesintilerini kullanmak için devre şeması yukarıdaki resimde verilmiştir. LCD eğitiminde yaptığımız gibi, LCD'yi PIC'ye bağlamanız yeterlidir.
Şimdi kesme pinini bağlamak için, Harici kesme için PIC'nin hangi pininin kullanıldığını öğrenmek için veri sayfasına bakmalıyız. Bizim durumumuzda i n 16F877A 33 rd pimi RBO / INT harici interrupt için kullanılır. Bu pin dışında başka bir pin kullanamazsınız. Bu devre şeması için Pin bağlantısı aşağıdaki tabloda gösterilmektedir.
S.No: |
PIN numarası |
Pin Adı |
Bağlı |
1 |
21 |
RD2 |
LCD RS |
2 |
22 |
RD3 |
E / LCD |
3 |
27 |
RD4 |
D4 / LCD |
4 |
28 |
RD5 |
D5 / LCD |
5 |
29 |
RD6 |
D6 / LCD |
6 |
30 |
RD7 |
D7 / LCD |
7 |
33 |
RBO / INT |
Butona basınız |
PORT B'de dahili kaldırma dirençlerini etkinleştirdik, bu nedenle RB0 pinini bir Push düğmesi ile toprağa doğrudan bağlayabiliriz. Böylece bu pin DÜŞÜK olduğunda bir kesinti tetiklenecektir.
Bağlantılar, aşağıda gösterildiği gibi bir Ekmek tahtası üzerinde yapılabilir.
Eğiticilerimizi takip ediyorsanız, burada kullandığım bu Perf Board'a aşina olmuş olmalısınız. Değilse, bunun hakkında fazla düşünmenize gerek yoktur, sadece devre şemasını takip edin ve işlerin yürümesini sağlayın.
PIC Mikrodenetleyicide Kesintilerin Simülasyonu:
Bu proje için Simülasyon Proteus kullanılarak yapılmıştır.
Projeyi simüle ettiğinizde, LCD ekranda artan bir sayı dizisi görmelisiniz. Bu, ana döngünün içinde gerçekleşir ve basma düğmesine her basıldığında LCD, ISR'ye girdiğini göstermelidir. Değişikliklerinizi kodda yapabilir ve burada test etmeyi deneyebilirsiniz.
Kod Açıklaması:
Bu proje için tam kod bu eğitimin sonunda bulunabilir. Ancak program, daha iyi anlamanız için önemli parçalara bölünmüş ve aşağıda açıklanmıştır.
Tüm programlar gibi, programımızda kullandığımız pinler için pin konfigürasyonunu tanımlayarak koda başlamalıyız. Ayrıca burada RB0 / INT'yi bir giriş veya çıkış pini olarak değil, harici bir kesme pini olarak kullandığımızı tanımlamamız gerekir. Kodun aşağıdaki satırı 7 yaparak PORTB iç pull-up direnç sağlayan inci 0 olarak ısırdı.
OPTION_REG = 0b00000000;
Ardından Global / Peripheral kesintileri etkinleştiririz ve RB0'ı harici kesme pini olarak kullandığımızı beyan ederiz.
GIE = 1; // Global Kesmeyi Etkinleştir PEIE = 1; // Çevresel Kesintiyi etkinleştirin INTE = 1; // RB0'ı harici Kesme pini olarak etkinleştir
RB0 pini bir harici kesme pini olarak tanımlandığında, her azaldığında harici kesme bayrağı INTF 1 olacak ve Interrupt Service Routine (ISR) çağrılacağından void interrupt işlevinin içindeki kod çalıştırılacaktır.
void interrupt ISR_example () {if (INTF == 1) // Harici Kesinti algılandı {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Girilen ISR"); INTF = 0; // bittikten sonra kesme bayrağını sil __delay_ms (2000); Lcd_Clear (); }}
Gördüğünüz gibi interrupt işlevini ISR_example olarak adlandırdım. İsteğinize göre adlandırabilirsiniz. Interrupt fonksiyonunun içinde INTF bayrağının yüksek olup olmadığını kontrol edip gerekli eylemleri gerçekleştireceğiz. Rutini bitirdikten sonra kesme bayrağını temizlemek çok önemlidir. Ancak o zaman program void ana işlevine geri dönecektir. Bu temizleme, hattı kullanan bir yazılım tarafından yapılmalıdır.
INTF = 0; // bittikten sonra kesme bayrağını sil
Ana işlevin içinde, her 500 ms için bir sayı artırıp bunu LCD ekranda görüntülüyoruz. RB0 pininin durumunu kontrol etmek için belirli bir hattımız yok. Kesme her zaman etkin kalacaktır ve basma düğmesine her basıldığında, boşluk ana bölümünden atlayacak ve ISR'deki hatları yürütecektir.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Ana Döngünün İçinde"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Sayı:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); sayı ++;
PIC16F877A Kesmelerinin Çalışması:
Kesmenin nasıl çalıştığını anladıktan sonra , bunu donanımda deneyebilir ve etrafında oynayabilirsiniz. Burada verilen bu program, bir kesinti algılandığında sadece LCD ekranın görüntüsünü değiştirdiği çok temel bir harici kesinti örneğidir.
Projenin tam çalışması aşağıdaki videoda bulunabilir. Umarım kesintileri ve bunların nerede / nasıl kullanılacağını anladınız. Herhangi bir şüpheniz varsa bana forumlardan veya yorum bölümünden ulaşabilirsiniz.