PIC'de birden çok harici kesinti kullanma


9

Birkaç proje için PIC16F877( veri sayfası ) kullandım . Tek bir harici pim değiştirme kesintisi için PORTB0kesme kullanabilirsiniz . Ama şimdi tek bir devrede 8 bağımsız harici pin değiştirme kesintisini desteklemem gerekiyor.

Veri sayfasında 15 kesinti var diyor PIC16F877, ama sanırım bu zamanlayıcı taşma kesintileri vb dahil olmak üzere sayılır ... bu durumda işe yaramaz.

Veri sayfası INTCONkayıt hakkında söyledikleridir .

resim açıklamasını buraya girin

Bit0, kullanarak 4 bağımsız kesinti yapabilir miyim RBIF? Değişimi temsil eder PB7:PB4. Hangi pimin değiştiğini nasıl belirleyebilirim, kesme rutinindeki port değerini okuyarak mı?

Yukarıdakilere olumlu cevaplar alsam bile, 8 kesintiye mi ihtiyacım var? Tabii ki hala değişim INTEiçin kullanabilirim PORTB0. Peki 4 + 1 = 5ya diğer 3? (Bununla birlikte, 8 kesme olayının tümü aynı 4 + 1 + 3 = 8türdeyse, çirkin gözüküyor, değil mi?)

Mikro denetleyiciden 8 pimi izleyen başka ağır görevler beklenmiyor. (Diğer görevlerden bahsederken, bir dizi ayrı sayaç değişkeni bulundurmalı ve sık sık PC'ye seri olarak yaklaşık 4 bayt iletmelidir)

Herhangi bir öneri bekliyoruz. Mikro denetleyiciyi daha uygun olanı değiştirmekle ilgili olsa bile (ama uh .. bana PICs'den uzaklaşmamı söyleme ).


2
Kesintileri kullanmadan, ana programdaki pimleri izleyebilirsiniz. Ama bu mükemmel değil. Alternatif olarak, Arduino için gidebilirsiniz. PIC olmasa da, oldukça basit, PIC'lere zaten aşina olduğunuzdan kolayca anlayacaksınız.
Anubis

1
RBIE kesmesini kullanırsanız, her seferinde önceki değeri ve değiştirilenleri bulmak için XOR'u arabelleğe alabilirsiniz. Yürütmek oldukça hızlı olmalı.
PeterJ

@ PeterJ bunu tam olarak anlamadım. Hangi değeri tamponluyor?
Codenamed SC

@PeterJ harika! bekliyor ...
Codenamed SC

1
Bir yol, harici sinyalleri bir kesme pimi üzerinde birleştirmek için harici bir 8 girişli kapı (eski günlerde 74LS30 gibi) kullanmaktır. 74 (HC) 30 bir NAND geçidi olduğundan, durgun durumda yüksek tüm girişlere ihtiyacınız olacaktır - bağlantı noktasını okuyarak hangi kesintilerin aktif olduğunu tanımlayabilmeniz için bağlantı noktası pimlerine de bağlanmaları gerekir.
Brian Drummond

Yanıtlar:


3

Bu bir fikri açıklamak için C sahte koddur. Hangi pinlerin değiştiğini anlamak için özel VEYA kullanır ve bir RBIE kesmesi içindeki farklı işleyicilerinizi çağırır. Uygulamanın ne kadar kritik olduğuna bağlı olarak, herhangi bir olayı kaçırmayacağınızdan emin olmak için kesme yürütülürken PIC'nin bağlantı noktası değiştirme gibi durumları nasıl ele aldığını kontrol etmek isteyebilirsiniz.

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}

Anladım, teşekkürler! ama aradığım tam cevap bu değil. Bu şekilde, RB7:RB4yalnızca 4 iğneyi izleyebilirsiniz . Ama 8 iğneyi izlemenin bir yolunu istiyorum. herhangi bir öneri?
Codenamed SC

Yukarıdaki çalışma için RB0 - RB7 kullanamazsınız bir nedeni var sanırım? Aksi takdirde gerçekten bir yol düşünemiyorum, hızlı bir şekilde kodu tetiklemek hayati değilse, bir zamanlayıcı kesme (veya sadece ana döngü) yukarıdaki kod stili kullanabilirsiniz.
PeterJ

Bu PIC için, bunu yapmak için kesmeleri kullanmanız gerekiyorsa, RB4: RB7'deki XOR hilesi ve RB0: RB3 için dört kesinti gitmek için yoldur. Kesmeye ihtiyacınız yoksa, kodunuzdaki tüm bağlantı noktasını
yoklayın veya

and four interrupts for the RB0:RB3? PIC16F877 için herhangi bir kesintiyi desteklemiyor RB1:RB3, ha?
kod adlı SC

Veri sayfasında, tüm limanı kapladığını farz ediyordum. Ama diğer yorumlarınızı saniyede bir kez gördüm, bu yüzden bunu sadece ana döngüde çalıştırmanız daha iyi olur. Kesmeler ile, yürütme sırasında herhangi bir noktada güncellenen değişkenlere ve kesme çalışırken pin değişikliklerinin nasıl ele alınacağına dikkat etmeniz gerekir. Gerçekten, gerçek bir kazanç için onu zorlaştıracak gibi görünüyor. Düşünebildiğim tek istisna, kesinti sırasında uykudan uyanma kullanmak istiyorsanız, bu durumda onları MUX onları donanımlamanız gerekir.
PeterJ

1

Bu bölüm sadece 4 pim değiştirme kesintisine sahiptir ve seçilen kenarlarda ayarlayabileceğiniz birkaç tane daha vardır. Stratejilerden biri, 8 bit değerinde harici olarak bir değişiklik tespit etmek ve ardından uyumsuzluğu kesmek olacaktır. Bu donanımda dağınık olur, ancak tam olarak ne istediğinizi yapar.

Belirtmediğiniz önemli parametreler bir iğne değişikliğine ne kadar hızlı yanıt vermeniz gerektiğidir ve bir iğne değişikliğinin geçerli olması için minimum sürenin ne kadar süreceği. Cevaplara bağlı olarak, bellenimde düzenli bir kesintiye dayanarak anket yapabilirsiniz. 16F877, 5 MHz komut hızında çalışabilir ve bir değişikliğin kontrol edilmesi yalnızca birkaç talimat alır. Diyelim ki kesme işlemini her 50 talimatta bir kurdunuz. Bu, işlemci zamanının iyi bir bölümünü ön plan koduna bırakacaktır. Kesme hızı 100 kHz ve süre 10 µs olacaktır. Tabii ki ön plan kodunun hala değişiklik bayrağını görmesi ve bu konuda bir şeyler yapması gerekiyor, bu nedenle yanıt süresi 10 µs'den fazla olacak, ancak bir değişiklik algılandığında ne yapmanız gerektiği hakkında bir şey söylemediniz. Bunun insan zamanında cevap vermesi gerekiyorsa,


Eksik detaylar için özür dilerim. Beklenen yanıt oranı once per secondyeterli olacağı için. Bir pim değişikliği (yalnızca bir kenar, yükselme deyin) tespit edildiğinde, bir sayaç (değişken) artırılmalıdır. Ana döngüde, sayaç değerlerini izlemeli ve belirli bir değerden daha yüksek olduğunda, dört bayt USARTPC'ye iletilmelidir . Ardından ilgili sayaç değerini sıfırlayın. Bu kadar basit. Yoklama seçeneği iyi gidiyor sanırım?
kod adlı SC

2
Saniyede bir ! Peki kesintiler üzerindeki tüm üzücü ne için? Bu, periyodik olarak yoklama ile kolayca yapılır. O zaman sorun ne?
Olin Lathrop

um ... en iyisi olsa da 8 tane var ve ayrıca cevap tahmin edilemiyor (ancak bu değerin minimum olduğu varsayılabilir). Hey! insanlar hata yapabilirler, doğru .. :(
Codenamed SC

1

INT pininde bir kesmeyi artırmak ve @ 74HC165N gibi 8-Bit Paralel-Giriş / Seri-Çıkış Kaydırma Kaydına @Brian Drummond tarafından belirtildiği gibi 8-girişli kapı NAND kullanabilirsiniz, bu yüzden ihtiyacınız olacak sadece kesme yükseldikten sonra o Shift Kaydındaki verileri okumak ve size gerçek kesme kaynağınız hakkında bilgi verecektir ... bu en hızlı yol olmayabilir, ancak genişletilmesi kolay olabilir ve 5 pinten fazla kullanmaz ve adres kontrol sistemi (MUX, LATCH, ...) eklerseniz, kesme bildirimi için sadece bir çam gerekir ve diğer pimler farklı kaynaklar için farklı zamanda yeniden kullanılabilir;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.