Mikrodenetleyicinin farklı bağlantı noktasındaki tek tek pimler bir kayıtçıyla eşlenebilir ve kayıt değeri değiştirilirken değerleri değiştirilebilir mi?


12

S: Bir mikro denetleyicinin farklı bağlantı noktasındaki tek tek pimler bir kayıtçıyla eşlenebilir ve kayıt değeri değiştirilirken değerleri değiştirilebilir mi?

Senaryo: Mikro denetleyicinin her bağlantı noktasından (8 bit) bazı pimler kullandım. Şimdi 8 bit veriyoluna ihtiyaç duyan bir cihazı arayüzlemek istiyorum (DQU'dan D0'a D7 diyelim), yani denetleyiciden 8 pime ihtiyacım var, böylece onları bire bir şekilde bağlayabiliyorum

portx0  -> D0 // x is the name of port followed by bit location on that port
portx1  -> D1
...
portx7  -> D7

ama bu cihazla bağlanabileceğim 8 pinli bir portum yok, bunun yerine portx'ten bazı portlar, porty'den bazıları ve portz'dan bazı pinler var. Yeni bağlantı senaryosu aşağıdaki gibidir (sırasıyla mikro denetleyiciden cihaza bağlantı)

portx0  -> D0
portx1  -> D1
portx2  -> D2
porty4  -> D3
porty5  -> D4
porty6  -> D5
porty7  -> D6
portz1  -> D7

Bu durumda bir değer göndermek istersem

unsigned char dataReg = 0xFA;

denetleyiciden cihazıma gönderilecek değer üzerinde biraz akıllı işlemler yapmalı ve her pimi kayıttaki değere göre ayrı ayrı ayarlamalıyım. Örneğin

portx0 = ((dataReg & 0x01) >> 0 );  // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );

Şimdi, ana soruya gelince, farklı portlardaki her bir bit üzerindeki bu bireysel hesaplamaları önlemek için, bir mikro denetleyicinin farklı portunun bireysel pinleri bir kayıtçıya eşlenebilir ve kayıt değeri değiştirilirken değerleri değiştirilebilir mi?


1
Bir süre önce de aynı fikrim vardı. PIC'lerle bu mümkün değildir: microchip.com/forums/tm.aspx?high=&m=696277 - Herhangi bir mikro ile mümkün olduğunu düşünmüyorum, ancak cihazınızı listelemek yardımcı olacaktır.

Yanıtlar:


6

Görünüşe göre, soru, bellenimde 8 bit değere sahip olmak ve bunu bağlantı noktası pinlerinden rastgele bir koleksiyondan okumak ve yazmak istemektedir.

Bunu yapmanın doğrudan bir donanım yolu yoktur. Biri 8 bit değerini okumak ve diğeri yazmak için iki rutin yazmanız gerekir. Diğerleri sendikaların kullanılmasından söz ettiler, ama bu kötü bir fikir. Sendikalar ile, her bitle ayrı ayrı uğraşmanız gerekir ve kod mikroun bit sırasına bağlıdır. 8 bitin tamamı tamamen bağımsız olarak dağılmışsa, bu zaten gitmenin yolu olabilir. Eğer öyleyse, her bit için özel kod yapmaktan başka yapabileceğiniz çok az şey var.

Bunu yapmanın en iyi yolu, özellikle bitleri fiziksel bağlantı noktalarındaki birkaç bitişik parça halinde gruplayabiliyorsanız, maskeleme, kaydırma ve ORing kullanmaktır. Örneğin, dahili baytın düşük üç biti bir portun <6-4> bitleri üzerindeyse, bu bit değerini son konuma getirmek için bu port değerini 4 ve AND ile 7 değiştirin. Bitleri diğer bağlantı noktalarından kaydırın ve maskeleyin (veya maskeleyin ve kaydırın) ve sonuçları ORing yaparak son 8 bit baytı birleştirin.

Bu tür düşük seviyeli bit twiddling'i montajcıda C'den yapmak daha kolaydır. Muhtemelen bayt okuma ve yazma rutinlerini tek bir montaj modülüne koyarım ve arayüzü C'den çağrılabilir hale getiririm.


6
Benim cevabım seninkiyle neredeyse aynı olurdu, sadece montajı hiç kullanmam. Bit manipülasyonları C'de önemsizdir. Derleyici için belirli C çağrı kuralını ve bağlayıcıyı nasıl çalıştıracağını öğrenmek için daha fazla bir baş ağrısı olacağını düşünüyorum. Gerçekten derleyiciye ve işleri ne kadar zor hale getirdiğine bağlıdır. :-)
akohlsmith

@Andrew: Cidden mi? Arama kuralları açıkça montaj kodu ile arayüz ihtiyacı olabilir gördüğüm herhangi bir derleyici kılavuzunda dile getirilmiştir. Bit manipülasyonu, C dilinde yazmak için "önemsiz" olabilir, ancak bu, derleyicilerin korkunç kod üretebileceği bir alandır. Hız veya kod alanı önemli değilse, daha rahat olduğunuz her şeyi kullanın. Düşük seviye bit döndürme için montajcı ile daha rahatım, bu yüzden bunu kullanırım. Bu düşük seviyeli hıza bağlı bir rutin ise, montajcıda yapmalısınız. Gerçekten kolay olmalı.
Olin Lathrop

1
Söylediğim şey, biraz manipülasyon kadar önemsiz bir şey için bununla uğraşmak zorunda kalmanın, bunun için çok iyi bir neden olmadıkça yapacağım bir şey olmadığıdır. Paralel veriyolunun özelliklerini bilmiyoruz, ancak çoğu otobüs, tüm veri yolu pinlerinin "yakın atomik" güncellemelerine olan ihtiyacı ortadan kaldıran flaş sinyallerine sahiptir, bu nedenle montaja bırakmak muhtemelen gereksiz bir optimizasyon ve gereksiz bir karmaşıklıktır (olsa bile) straightforwardish).
22:13

@Andrew: Ne yaptığınızı bilmiyorsanız, sadece etrafta dolaşmak veya karmaşık. Bence asıl sorun, bazı insanların montajcıdan korkması ve iyi bilmemesi. Bu bir hatadır. Araç kutunuzda hazır bir araç olması gerekir. Eğer iyi bilmiyorsanız veya bundan rahatsızsanız, işlerin nasıl başka bir şekilde yapılması gerektiğini her zaman haklı çıkaracaksınız. Bazı şeyleri montajcıda ve HLL'yi eşit derecede iyi biliyorsanız daha kolaydır . Çoğu insan bunu yapmaz, ama bu onlarla ilgili bir problemdir, montajcı kullanmakla değil.
Olin Lathrop

2
Birkaç mikrodenetleyici / mikroişlemci üzerinde montaj dilini çok iyi biliyorum. Bunun hazır bir araç olması gerektiğine katılmıyorum; genellikle çok düşük seviyeli başlatma, zamanlama veya boyut açısından kritik kod veya daha yaygın bir durumda, zaten bir darboğaz olarak belirlediğiniz bir alanın optimizasyonu için az ve sadece gerektiğinde kullanılmalıdır. Meclise atlayan yazarların, daha az açık kod yazdığı veya bir algoritmanın yanlış uygulandığını tanımadığı projelerin olduğunu düşünüyorum. Özellikle bunun sen olduğunu söylemiyorum, daha genel bir durumda.
akohlsmith

4

Genel olarak bu mümkün değildir. Bildiğim kadarıyla, PIC'lerle mümkün değil.

Bunu yapabilen tek bir mikrodenetleyici var, Cypress PSoC . Çip üzerinde son derece yapılandırılabilir bir sistemdir. Yapmanıza izin verdiği birçok şey, tam olarak kendi sicilinizi (1-8 bit) tanımlamak ve istediğiniz herhangi bir pime, hatta dahili devrelere bağlamaktır.

PSoC Kablolama

Örneğin, burada bir 6-bit kontrol kaydı oluşturdum. Bitlerin 5'i doğrudan pinlere giderken, 6. bit, 7. pinten gelen girişle XOR'a kullanıyorum.

PSoC Pimleri

Çip üzerinde, bu pinleri mevcut GPIO pinlerinden herhangi birine atamayı seçebilirim. (Bu gri olanlardan biri görüntü)


1
LPC800 de işlevler pimlere serbestçe atanabileceğinden bunu yapabilmelidir.
starblue

-1

Aşağıdakileri deneyebilirsiniz. (Kullanılacak olan) 2 portun ilgili pinlerine eşlenen kendi yapınızı yazın Şimdi bu kayıttaki değeri güncellemek, bu 2 portun pinlerini ayarlayacak / sıfırlayacaktır. Sadece deneyin ve işe yaradıysa bize bildirin !!

Bunun işe yarayacağından eminim.


2
C'de bir yapıyı bir bellek konumuna eşleyebilir ve yapınızın bitlerini (bit alanları) bit ofsetleriyle eşleyebilirsiniz, ancak derleyicinin 'inbetween' bitleriyle uğraşmasını önlemenin bir yolu yoktur ve şimdi 'genel' yapıyı tek bir tamsayı değeri görüntülemenin yolu. Bu işe yaramaz.
Wouter van Ooijen

-1

Soruyu doğru anladıysam, C'de yeterince kolay:

Genel tip bildirimi, herhangi bir kayıt için tekrar kullanılabilir:

typedef union    // Generic 8-bit register Type
{
  uint8 reg; // Whole register
  struct
  {
    unsigned  bit7     : 1;  // Bit 7 
    unsigned  bit6     : 1;  // Bit 6 
    unsigned  bit5     : 1;  // Bit 5 
    unsigned  bit4     : 1;  // Bit 4 
    unsigned  bit3     : 1;  // Bit 3 
    unsigned  bit2     : 1;  // Bit 2 
    unsigned  bit1     : 1;  // Bit 1 
    unsigned  bit0     : 1;  // Bit 0 
  } bit;
} typ_GENERIC_REG8;

Bu nedenle, ele almak istediğimiz bir bağlantı noktasını tanımlamak için:

#define MCU_GPO_PORTx   (*(volatile typ_GENERIC_REG8 *)(0x12345678)) // Number is address

Ve bu bağlantı noktasındaki bir iğneyi doğrudan çevirmek için:

#define MCU_PORTx_PINn  (MCU_GPO_PORTx.bit.bit0)

Kodda:

MCU_PORTx_PINn = 1; // Set pin high

Tüm kayıt:

MCU_GPO_PORTx.reg = 0xF; // All pins high

Yapılar, birlikler, typedefs ve enums üzerinde okumaya değer - tüm bunlar hayatı gömülü ve genel olarak çok daha güzel hale getirir!


OP, farklı portlardan birkaç biti 'bir bayt' halinde birleştirmek istiyor. Bunun nasıl yapacağını anlamıyorum? Olin Lathrop neden mümkün olmadığını açıklıyor .

Bu aslında sorunu ele almaz ve derleyicinizin "smrt" değerine bağlı olarak, hata ayıklamak için yepyeni bir sorun kümesi oluşturabilir.
22:13
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.