PIC24 işlemcilerinde her bir port için aşağıdaki register’lar tanımlanmış:
PORTx, LATx, TRISx, ODCx, ANSELx, CNPUx, CNPDx, CNENx
Bunlardan, PORT, LAT, TRIS zaten tüm PIC’lerde olan register’lar.. Bunlar hakkında bir şey dememiz gerekmiyor.
UART pinlerinden TX olacak olanın TRIS’ini 0 yapıyorum. (Tam hatırlamıyorum ama ya PIC18 ya da uğraştığım başka bir mcu’da uart pinlerini TX de olsa RX de olsa giriş olarak konfigüre ediyordun, bu öyle değil!)
Bir pin analog giriş olarak kullanılacaksa ilgili TRIS biti 1 olmalı, ANSEL biti de 1 olmalı (bu zaten reset sonrası varsayılan durumdur).
ANSELx.y = 0 yaptığımız zaman x portunun y. bitini digital I/O ya da uart gibi bir peripheral olarak kullanabilir oluruz.
Bu arada, ben kullanmadığım işlemci portlarını donanımı tasarlarken herhangi bir nete bağlamıyorum (en iyi ihtimal bir header konnektöre çıkar bırakırım) ve bu portları ÇIKIŞ yapıp LAT değerine de 0 yazarım.
Peripheral Remapping
Pin sayısı az, çevresel fonksiyonları çok işlemcilerde pinleri fonksiyonlara paylaştırmak için kesinlikle bir çeşit pin-peripheral multiplexing’e ihtiyaç var. Silabs işlemcilerdeki priority crossbar’a benzer iş yapan bir özellik PIC24’lerde de var ve Peripheral Pin Select fonksiyonu olarak adlandırılıyor.
Bu yapı iki kısımdan oluşuyor: Input Mapping, Output Mapping.
Eğer şu PIC24EP işlemcisini bir-iki projede daha kullanacak olursam port konfigürasyonu için kendim bir program hazırlayacağım. (Harmony Configurator diye bir şey zaten var ama bildiğim kadarıyla 24EP desteklemiyor, hem ben kendi kodlama tarzıma ve kullanımıma uygun bir şey yapacağım) Bunu burada paylaşırım. Çip konfigürasyonunu hızlandırmamıza yardımcı olur.
Input Mapping
Bu, peripheral temelli bir kontroldür. Yani her peripheral’in kendisine ait bir register alanı (7 bit) vardır. O alana, peripheral’i hangi pine route edeceğimizi söyleyen değeri yazarız. Bu durumda her bir giriş pini için de bir adres değeri tanımlanmıştır. Bu, datasheet’te tablo olarak verilmiştir.
Böyle olmasının mantığı açık: Bir giriş birden çok kaynağa bağlanabilir. Sonuçta hedefin (peripheral) bir tane olması yeterli.
Bazı remappable pinler sadece giriş olabilirken bazıları hem çıkış hem de giriş olabilirler. İsimlendirmeden bunu ayırt edersiniz. RPIx ya da RPy gibi..
Örnek olarak, ben UART1 RX fonksiyonunu RF0/RPI96 pinine atayacaksam gider tablodan RPI96 adres değerine bakarım: 0x60 gördüm.
Sonra da bu değeri U1RX’in adres tanım register’ına yazarım: RPINR18 = 0x0060
Özetle, giriş mapping’de kullanacağım pinin adres değerini bulurum, bunu kullanacağım fonksiyonun register’ına yazarım…
Output Mapping
Bu, giriş mantığının tam tersi ile çalışır. Yani her bir pinin kendisine ait bir register alanı vardır. O alana, pini hangi fonksiyona route edeceğimizi söyleyen değeri yazarız. Her bir fonksiyonun bir remap değeri vardır. Bu, tablo olarak verilmiştir. Bunun mantığı bence daha da açık: Bir çıkış ancak tek bir fonksiyona atanabilir. Hedefn (pin) bir tane olması gereklidir.
Benim UART1 ‘in TX pinini RF1/RP97’ye atayacağım. Tabloya bakıyorum: U1TX için peripheral değeri = 1
Tamam.. Sonra gidiyorum, RP97’yi ayarlayan register’ı buluyorum: RPOR7
RPOR7bits.RP97R = 1;
Konfigürasyon Kilidi
Bazı register’lara erişimin ancak özel bir kilit açma işlemi sonrası münkün olduğunu bilirsiniz (mesela on-chip EEPROM). Benzer şey bu peripheral mapping’de de var. Yukarıdaki register’lara erişebilmeniz için önce
OSCCONbits.IOLOCK = 0;
yapmak zorundayız. Öte yandan IOLOCK bitine yazabilmek için önce özel bir kilit açma yazması yapmak gerek.
XC16’da bunu yapan iki builtin fonksiyonu var. OSCCONL ve OSCCONH için built-in yazma:
__builtin_write_OSCCONL (OSCCON | 0x40) ; // IOLOCK, OSCCON’daki 6. bit.
İşler bitince kilidi yine devreye almak için:
__builtin_write_OSCCONL (OSCCON & 0xBF);
Bu, IOLOCK bitinin PIC24’lerin hepsinde olmadığını okudum. Emin olmak için kullandığınız çipin datasheet’indeki OSCCON register açıklamasına bakın..
merhaba selim birçok işkemciyle çalıştım , PIC24 ün diger işlemcilerden STM32
ATMEL – MOTOROLA vs… mutlaka bir farkı var , PIC24 harici kesmeleri dış ortamlardan etkilenmiyor , diger işlemcilerin kesmeleri hemen etkileniyor , lambayı yaksanız bile işkemci ya reset atıyor yada dogrudan kesme adresine gidiyor , bu olayı çözemedim sebebi ne olabilir , birçok kaynakta ve webde temiz bir voltaj , küçük kapasite , buffer entegre konulması gerektigi ifade ediliyor, fakat bunlarda işe yaramıyor , PIC24 digerlerinden ayıran bu özelligi araştırıyorum , port yapısımı , jonksiyon bölgelerimi yada yarıiletkenin kristalize yapısımı
kısa olarak dönüşünüzü bekliyorum abc7418@hotmail.com
Cem Bey selamlar,
Öncelikle, çiplerin iç donanımları hakkında benim çok bilgim yok ancak bunların üreticiden üreticiye çok değiştiklerini de zannetmiyorum.
Burada sorun çipin yapısından ziyade üzerinde kullanıldığı board olabilir. Çünkü lamba yanması pek o kadar da emisyon yapacak bir iş değil.
Ben de PIC24 dışında başka pek çok işlemci ile uğraştım. Hatalı reset/kesme durumu ile hiç karşılaşmadım.
Belki PIC24’te ekstradan bir de-glitch filtresi vardır, bu küçük bir fark yaratıyordur (ki pic’e has bir özellik olacağını da hiç sanmıyorum).
Özetle, ben olsam en önce, reset sebebinin bir kere MCLR pini olduğundan emin olurdum (tahminim artık her işlemcide açıldığında son reset durumunu gösteren bir register illa vardır).
Sonrasında osiloskop ile, hatanın olduğu anki besleme ve mclr pin seviyelerini izlerdim (brown out reset olması ihtimali).
Ve de genel bir kural olarak, üreticilerin donanım tasarımı tavsiyelerini iyice inceler, burada bir uygunsuzluk var mı diye bakardım.
Tabii burada şöyle ilginç bir durum da var: Dış bir endüksiyondan tetiklenecek kadar yüksek empedanslı bir kesme kaynağınız varsa zaten oradan yüksek hızla sinyal de alamıyorsunuz demektir. O zaman neden pin kesmesi kullanıyorsunuz ki? Bu durumda ta en baştan tasarım yanlış demektir.
Bunlar çok âfâki yorumlar elbette. Umarım bir fikir verebilmişimdir yine de..
Hoşçakalın.