< Bu ileti mini sürüm kullanılarak atıldı > |
|
_____________________________
|

1 Mobil
< Bu ileti mini sürüm kullanılarak atıldı > |
|
_____________________________
|
|
Programmer-To-Go özelliği pickit2 programlayıcısı üzerindeki spi flash a hex dosyasını yazmaya, daha sonrada bilgisayara ihtiyaç olmadan sadece programlayıcıyı powerbank vb bir kaynak ile besleyerek, programlayıcı üzerindeki buton ile diğer mcu ları programlamak için kullanılan bir özellik. Varlığından yıllardır haberdarım ama şimdiye kadar aktif olarak hiç kullanmadım, ofis ortamında pc yazılımını kullanmak daha kolay geliyor Pickit2 yazılımında zaten bu özellik var, programlayıcınızda spi flash ve buton bağlantısı varsa extra birşey yapmanıza gerek yok. Siz tam olarak ne yapmak istiyorsunuz, iftar öncesi anlama kabiliyetim biraz azalmış olabilir |
|
_____________________________
|
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 16 Mart 2024; 18:41:23 > < Bu ileti mini sürüm kullanılarak atıldı > |
|
Aynı şeyden bahsediyoruz üstadım. Bende orjinal pickit2 ve pickit3 serileri var içinde yanlış hatırlamıyorsam 2 adet 24c512 eeprom var. Bunlar I2C ile çalışıyor, sizin amacınızı şimdi anladım. I2C yerine SPI arabirimli chip kullanmak istiyorsunuz. 64 byte sınırı sanırım usb-hid transfer limiti ile ilgili. Çünkü Usb-hid üzerinden bir veri paketi max 64 byte olabilir. İftardan sonra sistemler normale dönünce paylaştığınız dosyayı incelemeye çalışırım. |
|
_____________________________
|
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 16 Mart 2024; 18:59:21 > < Bu ileti mini sürüm kullanılarak atıldı > |
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 17 Mart 2024; 18:24:21 > < Bu ileti mini sürüm kullanılarak atıldı > |
|
_____________________________
|
|
Spi desteği olan hangi EE chipi kullanmayı planlıyorsunuz? Genelde Spi flash larda içine veri yazmadan önce ilgili hücrenin 0xFF (bu projede tüm chipin içeriğinin) olması gerekir. Spi flaslarda silme işlemi, allchip, sector ve block bazlı yapılır. I2C lerde direk üzerine veri yazılabiliyor bu durumu göz önünde bulundurun. Seçtiğiniz spi chip üzerine veri yazmayı destekliyorsa yukarıdaki uyarıyı göz ardı edebilirsiniz. Siz konuya çok daha fazla kafa yordunuz ama kodunuzdaki aşağıdaki kısım biraz garip geldi. Adres parçalama işlemine bir mana veremedim. Farklı bir mantığı varsa açıklarsanız iyi olur. unsigned int ext_ee_addr; C18 derleyicide unsigned int 16 bitlik yani 2 byte yer kaplar. Düşük, orta, yüksek byte seçimlerinde 8 bit kaydırmanız gerekmez mi? Aynı zamanda ext_ee_addr tipinin 3 byte veya daha uzun bir değişken olarak tanımlanması gerekmez mi? Ör: unsigned shot long (24bit) veya unsigned long(32bit) gibi. //EE adresinin düşük byte'ını oluştur. Generate low byte of EE addres if(address == 0) { add = (ext_ee_addr << 6) & 0xFF; //<<--- düşük için niye sola 6 bit add = ext_ee_addr & 0xFF; // normalde bu şekilde düşük byte alınır } //EE adresinin orta byte'ını oluştur. Generate middle byte of EE addres if(address == 1) { add = (ext_ee_addr >> 2) & 0xFF; // <<--- orta için niye 2 bit sağa add = (ext_ee_addr>>8) & 0xFF; // normalde bu şekilde yüksek byte alınır. } //EE adresinin yüksek byte'ını oluştur. Generate high byte of EE addres if(address == 2) { add = (ext_ee_addr >> 10) & 0xFF; // <-- yüksek için tekrar sağa 10 bit kaydırıldı // ext_ee_addr 2 byte olduğu için 3. kez sağa kaydırma yapmanın bir anlamı yok } return add; |
|
_____________________________
|
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 18 Mart 2024; 13:39:13 > < Bu ileti mini sürüm kullanılarak atıldı > |
|
Anlaşılan gerçek adresi bulmak için 64 ile çarpma işlemi için böyle bir yapı kurulmuş. Benim önerim 18f2550 de donanımsal çarpma desteği var. Bundan faydalanıp adres = ext_ee_addr * 64; // Eski mesaj yanlış:tek bir clock cycle Düzeltme doğrusu:28 clock cycle (değişken tipi uint16 olduğu için) de bu işlem gerçekleşir. Şeklinde bir kullanım işleri daha kolaylaştırır. Diğer bir öneri ise: Her 64 byte lik paket yazmada ext_ee_addr++; bir artırılıyor. Bunun yerine ext_ee_addr +=64; Şeklinde yaparsanız sonraki gerçek adres zaten elinizin altında olur. Çarpma veya bit maniplasyonu gibi dertlerden kurtulursunuz. Bu sayede yukarıdaki mesajda belirttiğim gibi her seferininde sağa 8 in katları bit kaydırarak adresin byte verilerine erişebilirsiniz. Bit kaydırma yerine pointer kullanımınıda düşünebilirsiniz. Bu proje kullanımında performans konusunda ve kod okunurluğu konusunda bir farkı olmaz ama, genel alışkanlık ve kullanım tercihi olarak şöylede yapabilirsiniz. uint32 adres; uint8 *p8; //pointer tanımlama uint8 adr; p8 = (uint8*)&adres; // pointer adresin lsb byte i işaret ediyor. adr = *p8; // lsb ilk byte p8++; // pointeri bir artır adr = *p8; // 2. byte p8++; // sonraki byte adr = *p8; // 3. byte p8++; // sonraki byte adr = *p8; // 4. byte < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 19 Mart 2024; 9:51:52 > |
|
_____________________________
|
< Bu ileti mini sürüm kullanılarak atıldı > |
|
_____________________________
|
|
Hafıza (RAM) kapasitesi ile ilgili sorun / yetmeme durumu varsa pointer ile aynı hafıza bölgesini ortak kullanabilirsiniz. Bu sayede bit maniplasyonu ve kaydırma gibi işler için local değişken tanımlamanıza bile gerek kalmaz. Yukarıdaki örnekde uint8 adr; tanımlamasını sizin kod uyumunuza benzemesi ve daha rahat anlatmak içindi. Yoksa *p8 zaten ilgili hafıza (ram) adresini bir byte olarak işaret ediyor. Doğrudan *p8 şeklindede kullanılabilir. MPlab ide sini kullanmadığım için deneme yapma imkanım yok ama ramde 2 byte alacak kadar yer vardır herhalde 2048 byte ram çokda az değil |
|
_____________________________
|
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 18 Mart 2024; 22:15:18 > < Bu ileti mini sürüm kullanılarak atıldı > |
|
Pickit3 de U3 ve U4 hafıza chipleri U3=i2c U4=spi modunda çalışıyor. Belki fikir verebilir. Benim emektarlar, Pickit2 daha fazla kullanılmış ![]() |
|
_____________________________
|
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 18 Mart 2024; 23:33:9 > < Bu ileti mini sürüm kullanılarak atıldı > |
Çok birşey kaybetmiş değilsiniz aslında. Alışkanlıkdanmıdır yazılımının kolay ve hızlı kullanılmasındanmıdır pickit2 yi daha çok tercih ediyorum. Diğeri pickit2 nin desteklemediği (device list dosyasını düzenleyerek eklemek bir yöntem ama her zaman için optimum yöntem olmuyor) bazı mcular olduğunda arada bir kullanıyorum. Evet hardware multiplier den bahsediyoruz ama yukarıdaki mesajda hatalı ifade ettim (o mesajı yazarken 32bit arm mimarisi gibi düşündüm bir an için). 1 cycle de çarpma işlemini 8 bitlik işaretsiz sayılarda yapabiliyor. Aşağıdaki tablo çarpma işleminin donanımsal olup olmamasının ROM ve cpu zamanı kullanımı açısından karşılaştırmasını veriyor. Tablo 18f2550 nin pdf inden alındı. Tablonun ilk satırı için unsigned 8 bit işlemlerde 26byte (13 word) daha az ROM kullanıyor ve 69 kat daha hızlı işlemi sonuçlandırıyor. Diğer veri tipleri için tabloya aynı mantıkla bakabilirsiniz. ![]() |
|
_____________________________
|
< Bu mesaj bu kişi tarafından değiştirildi ipli jeton -- 19 Mart 2024; 15:33:28 > < Bu ileti mini sürüm kullanılarak atıldı > |
|
Mcu nun komut setinde sola veya sağa bit kaydırma (Rotate Left ve Rotate Right) komutları var. Fakat bu mcu 8 bitlik olduğu için, buradaki 1 cpu zamanı 8 bitlik değişkenler üzerinde işlem yapıldığında geçerli. Sizin örnekdeki eeprom adresini tuttuğunuz değişken gibi 16 bitlik veya 32 bitlik bir değişkenin bitlerini sağa veya sola kaydırmak istediğinizde bu daha fazla cpu zamanına mal olacaktır çünkü aynı anda sadece 8 bit üzerinde işlem yapma kapasitesine sahip. Bu durumda adres değişkeni içerisindeki byte lara erişmek için pointer kullanmak daha hızlı bir yöntem olacaktır. 8 e veya 16 ya bölme işlemlerinde derleyicinin Rotate komut setlerini kullanması beklenir. (Ondalık / floating point çarpma ve bölme işlemleri farklı bir konu) Birde hız herşey demek değildir, yerine göre bir işlemin 10us de bitmesi ile 80us de bitmesi çokda önemli değildir, fakat aradaki farkları bilmek ve gerekli olduğu zamanlarda doğru yöntemi tercih edebilmek önemli / avantajlı hale gelecektir. ![]() Not: Doğrudan assembler yazmıyorsanız, araya kullandığınız compiler ve onun ayarları, optimizasyon yetenekleri devreye girecektir. Çıkan makine kodu ve performansı değişecektir. Assemblerde yazdığınız kodlar gördüğünüz şekilde işlenecektir. İyi yazdıysanız iyi, kötü yazdıysanız kötü performansda çalışacaktır. Derleyici farkına örnek olaması açısından, geçmişte elimdeki mcunun bir pininden aşağıdaki gibi basit bir kod ile kaç Hz sinyal alabilirim diye test yapmıştım. pseudo code while(1) { pin1 = H; pin1 = L; } Aynı kod aynı mcu, aynı configrasyonda çalıştırıldığında Derleyici 1 : 1.2 Mhz Derleyici 2 : 6.0 Mhz C ile kodlama yapıyorsanız kullandığınız derleyicinin kabiliyetlerine ve optimizasyon seçimlerine göz atmanızda fayda var. |
|
_____________________________
|
|
Mesajınıza daha sonra ilave ettiğiniz kısmı sonradan gördüm. SPI modülünü aktif ettiğinizde zaten onun bağlı olduğu IO larda uygun şekilde konfigüre edilir. TRIS yapmaya gerek yok. TRIS kullanmanın gereksiz cpu zamanı ve romda yer kaplaması haricinde bir zararıda yok :) Edit2: C derleyicilerde bu işlem arka planda yapılır, yukarıdaki açıklama buna göre yapıldı ama assembler kullanıyorsanız pinleri uygun şekilde input veya output olarak ayarlamanız gerekir. Edit: Mesajı sonradan düzenlediğiniz için yukarıdaki cevap askıda kaldı. < Bu mesaj bu kişi tarafından değiştirildi rafet32 -- 19 Mart 2024; 15:45:15 > |
|
_____________________________
|