STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

fahri-

Gelecek kartlara 2x16 LCD bağladığımızda 3.3V ile 5V beslenen LCD yi sürebilirmiyiz. Yoksa data girişlerine pull up direnç mi takılması gerekli. Veya başka bir yol?

z

LCD, 3.3v sinyalleri kabul etmiyorsa,  Rehhber sayda 148 den OTYPER registerinden outputlar openadrain olarak secilebiliyor. Hard sayfa 48'de de 5v tolaransli bacaklar belli. Bu durumda en kotu ihtimalle birer pull up direncle sorun cozulur gorunuyor. (Denemis degilim)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Alıntı yapılan: bunalmis - 05 Kasım 2011, 14:46:19
Neyse gel tatliya baglayalim. Bitirelim bu konuyu. Ozur de beklemiyorum.

Verdigim ASM program kisaliginda sonuc uretecek seviyede C bilmiyorum. Fakat bu asm kodlar, en azindan cok eski zamanlardaki  C-ASM tartismalarina yeterli cevap olmustur.

Kodlari bu haliyle Keil haricindeki diger derleyicilerde derlemeye kalkarsak sorun cikartabilir.  Fakat sorunu cikartacak kisim, asm kodlar değil, __asm ve _CPP olan C tanimlayicilari olabilir. Belli basli platformlarda sorunsuz derlenebilmesi icin bir header dosyaya, derleyici IAR ise su eki kullan, Keil ise su eki kullan seklinde #ifdef ile tanimlamalar yapiliyor. Bu gune kadar hic bir zaman, tasinabilir kod yazimi amaci gutmedigimden verdigim koda da bu tur tanimlamalar eklemedim fakat istersen ugrasirim zor bir sey değil cunku.

Yeni tartismalar baslatmamasi icin hemen belirtmeliyim ki verdigim kodlari, hizli kossun diye değil sirf kisa olmasini istedigin icin bu sekilde yazdim.

Bunalmış,
Senin iyiliğin için söylüyorum bunları: Herşeyin bir bedeli vardır. Eğer birşeyler kazanmak istiyorsan bişeyler kaybetmelisin. İşlemci zamanını kaybetmiyeceğim diye 2 cycle hesabı yaparsan kendi zamanını, ömrünü yersin. İleri de çok pişman olursun.

Asm - C tartışmasına gelince, aradan onca zaman geçmiş ve hala aynı şeyi söylüyormuşsun gibi davranıyorsun ama kendin değişmişsin kendinin haberi yok. C'ci olmuş çıkmışsın işte, herşey ortada.

Asm, C'den hız bakımında çok daha iyidir bu tartışmasız bunu herzaman söyledim ve ben eski bir asm programcısıyım. Fakat asm çalışırken hızlıyken, yazılması çok uzun zamanlar alan, karmaşık işleri yapmak çok zor olan bir programlama dilidir. 

C ise, asm'ye çok yakın kod yazılabilecek tek programlama dilidir ve asm'ye göre büyük avantajları vardır.  Şimdi sana bunları anlatmayayım zaten biliyorsundur. Benim haklı olduğumu da biliyorsun da mesele "tamam, haklısın diyememek".

Hala asm konusunda ısrarlıysan bana bir arm cortex m3 asm ile ethernet üzerinden stm32'ye program atılabilecek bir code yaz bakalım, kaç ayda yazacaksın.
Knowledge and Experience are Power

CLR

Alıntı yapılan: fahri- - 05 Kasım 2011, 19:23:26
Gelecek kartlara 2x16 LCD bağladığımızda 3.3V ile 5V beslenen LCD yi sürebilirmiyiz. Yoksa data girişlerine pull up direnç mi takılması gerekli. Veya başka bir yol?

Genelde LCD TTL uyumlusu ise sürülür ve %90 öyle oluyor. STM32 serisinde portlar Pull-up ve pull-down yapılabiliyor içinde dahili 100k dirençleri var.   
Knowledge and Experience are Power

mcan

2x16 lcd sürmek için gereken bir dosyayı keile taşımayı düşünüyorum.Aklıma takılan soru şu Portd nin bir kısmını lcd için bir kaç pinini ise interrupt rutininde okuyacağım sensor için kullanıcam, acaba program yazarken bu gibi durumlarda kodu nasıl yazıyorsunuz önerebileceğiniz bir yol varmı?Lcd driverinin içinde her port ile işlem yapacağı zaman tüm kesmeleri pasif-aktif mi yapmalıyım ki çok hantal ve dandik bir yöntem olarak algılıyorum? Bit banding yöntemi atomiktir diye yazıyor bazı pinler(enable,rw,rs) için bu güzel gibi ancak data pinleri için kullanışsız gibi duruyor....

Problem şu ben lcd ile haberleşirken kesme gelmesi durumunda kesmeden döndükden sonra lcd haberleşmesinin çakılması ihtimali, yada yanlış data yazma ihtimali...

CLR

Alıntı yapılan: mcan - 05 Kasım 2011, 22:59:20
2x16 lcd sürmek için gereken bir dosyayı keile taşımayı düşünüyorum.Aklıma takılan soru şu Portd nin bir kısmını lcd için bir kaç pinini ise interrupt rutininde okuyacağım sensor için kullanıcam, acaba program yazarken bu gibi durumlarda kodu nasıl yazıyorsunuz önerebileceğiniz bir yol varmı?Lcd driverinin içinde her port ile işlem yapacağı zaman tüm kesmeleri pasif-aktif mi yapmalıyım ki çok hantal ve dandik bir yöntem olarak algılıyorum? Bit banding yöntemi atomiktir diye yazıyor bazı pinler(enable,rw,rs) için bu güzel gibi ancak data pinleri için kullanışsız gibi duruyor....

Problem şu ben lcd ile haberleşirken kesme gelmesi durumunda kesmeden döndükden sonra lcd haberleşmesinin çakılması ihtimali, yada yanlış data yazma ihtimali...

Merhaba,

Bunalmış'a anlatıyoruzda anlamıyor. Allah'tan anlayanlar çıkıyor. Aslında benim kullandığım mantık biraz faklı ama aşağıdaki ile rahatça kullanabilirsin.

union GpiodOdrRegUni{
    vu32 Reg32;
    struct{
         vu32 lcdrw:1;
         vu32 lcdrs:1;
         vu32 lcddata:4;
          .
          .
         vu32 Key:1;
    }Bits;
};

union GpiodOdrRegUni *GPIOODRREG = (union GpiodOdrRegUni *)GPIOC_ODR_ADR; 
union GpiodOdrRegUni *GPIOIDRREG = (union GpiodOdrRegUni *)GPIOC_IDR_ADR; 

main içinde 

// output için
GPIOODRREG->Bits.lcddata=0x2;
GPIOODRREG->Bits.lcdrs=1;
GPIOODRREG->Reg32=(u32)0x1234;

input için
if(GPIOIDRREG->Bits.Key == 0)
{

}



Lcd ve int. bişey olmaz, interrupt kapatırsan asıl bişeyler olabilir. Eğer hantal görüyorsan lcd haberleşmesini 3 wire ile spi üzerinden sürebilirsin(burada amaç datayı spı hattına attıktan sonra işlemci boş kalır ve port avantajın tabii ki). 
Knowledge and Experience are Power

fahri-

LPCXpresso LPC1114 kiti 3.3V çıkışlarla ile direk 2x16 LCD sürüldü. Bu kitle de sürülür sanıyorum.

z

#442
Alıntı yapılan: mcan - 05 Kasım 2011, 22:59:20
2x16 lcd sürmek için gereken bir dosyayı keile taşımayı düşünüyorum.Aklıma takılan soru şu Portd nin bir kısmını lcd için bir kaç pinini ise interrupt rutininde okuyacağım sensor için kullanıcam, acaba program yazarken bu gibi durumlarda kodu nasıl yazıyorsunuz önerebileceğiniz bir yol varmı?Lcd driverinin içinde her port ile işlem yapacağı zaman tüm kesmeleri pasif-aktif mi yapmalıyım ki çok hantal ve dandik bir yöntem olarak algılıyorum? Bit banding yöntemi atomiktir diye yazıyor bazı pinler(enable,rw,rs) için bu güzel gibi ancak data pinleri için kullanışsız gibi duruyor....

Problem şu ben lcd ile haberleşirken kesme gelmesi durumunda kesmeden döndükden sonra lcd haberleşmesinin çakılması ihtimali, yada yanlış data yazma ihtimali...

@mcan

Bitbanding uzerine onca konusmadan sonra, birden fazla bite ayni zamanda mudahale gerektiren (data pinleri gibi) uygulamalarda bitbandingine basvurmayi nasil aklindan gecirebilirsin anlamiyorum.  Bit 1/8 byte anlamina geliyor değilmi. Data bus manuplasyonu icin coklu bit manuplasyonu yada byte banding istiyorsun.

Alıntı yapılan: eemkutay - 06 Kasım 2011, 08:50:17
Merhaba,

Bunalmış'a anlatıyoruzda anlamıyor. Allah'tan anlayanlar çıkıyor. Aslında benim kullandığım mantık biraz faklı ama aşağıdaki ile rahatça kullanabilirsin...

@eemkutay

Gene olayi bir yerlere cekmeye basladin.  Bitbanding metodunu ne zaman, nerede ayni anda birden fazla bit degisimi icin ovdum? Sen de bit banding ile coklu bit manulasyonunu anlamamissin?

Istersen STM firmasina hata yaptiklarini, bitbanding donanimini cipe eklemeleleri gerektigini ve nedenlerini izah et, adamlar bosu bosuna yongada yer kaplayan bu modulu
koymasinlar. En azindan guc tuketimine ve cip maliyetine faydasi olsun.

Alıntı Yap
Lcd ve int. bişey olmaz, interrupt kapatırsan asıl bişeyler olabilir...... 

Bunu nasil izah edeceksin? 

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mcan

#443
Alıntı yapılan: bunalmis - 06 Kasım 2011, 14:47:41

@mcan
Bitbanding uzerine onca konusmadan sonra, birden fazla bite ayni zamanda mudahale gerektiren (data pinleri gibi) uygulamalarda bitbandingine basvurmayi nasil aklindan gecirebilirsin anlamiyorum.  Bit 1/8 byte anlamina geliyor değilmi. Data bus manuplasyonu icin coklu bit manuplasyonu yada
Aman yanlış anlaşılmasın bitbandinge başvurmak istemiyorum ,fakat bu konuda(birden çok bite aynı anda erişim) bitbanding ne kadar alakasızsa lcd driver dosyasının port pinlerini kulllanan her kesimine de interruptları açıp kapamak aynı şekilde alakasız görünüyor...Ancak şu var eğer ki gelen kesmeye vermem gereken cevap pinleri manuple etme hızımdan daha önemli ise hiç interrup aç kapa yapmadan bit bit her bitiçin bitband kullanılmaz mı? Giriş çıkıp portları için atomik başka komutlar var ancak söz konusu sram alanı ise başka komut göremedim.

Mesela
Alıntı Yapchar lcd_read_byte() {
      char low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}
Bu pic c kodunu arm işlemci için keilde tekrar yazıcam fakat aynı porttan interrup rutininde birde sensor haberleşmem var ,şimdi birbirlerini etkilemesinler diye lcd fonksiyonlarının içine sürekli interrupt açıp-kapamam çok hantal gibi görünüyor?Mesela örnekdeki kodda 6 yere aç kapa işlemi yazmam lazım yada sadece başa ya da sona yazsam bu seferde kesme uzun bir süre kapalı kalacak.

@Eemkutay structure yöntemi güzel fakat ,sonuçda maskeleme kullanmı yor mu? Eğer kullanıyorsa maskele atomik erişim olmayacağı için maskeleme esnasında gelen interrupt içerisinde aynı portta -adresde bit maskeleme yapıp interruptan geri döndüğümüzde main içindeki maskeleme sonucu yanlış olmayacak mıdır?Böylece interrupt içinde haberleştiğim sensör ile haberleşmemde aksamalar olabilir. Haberleşip interruptan çıkmadan işimi bitirirsem tamam sorun yok ancak diğer türlü problem var.

Donanımsal yada yazılımsal Debugger ile adım adım işlem yaparken interrup tetikleyebilirmiyiz? Eğer böyle bişey varsa yukarıda anlattığım durumu ispatlayabilir beraber inceleyebiliriz.

CLR

@mcan,
Profesyonel anlamda 20-30 ticari projelerim var ve otomotiv, endüstriyel, biomedikal vs. alanlarda ve sorunsuz çalışan projeler. Sense bana dandik lcd sorusu soruyorsun ve öyle değildir vs. diyorsun. Bildiğin gibi yap.

@bunalmış
Cortex m3 interrupt işte. Özelliklerini biliyorsan izaha gerek yok. Sen farklı kullanıyorsan öyle kullan.

Knowledge and Experience are Power

z

Alıntı yapılan: eemkutay - 06 Kasım 2011, 22:42:21
@mcan,
Profesyonel anlamda 20-30 ticari projelerim var ve otomotiv, endüstriyel, biomedikal vs. alanlarda ve sorunsuz çalışan projeler. Sense bana dandik lcd sorusu soruyorsun ve öyle değildir vs. diyorsun. Bildiğin gibi yap.

@bunalmış
Cortex m3 interrupt işte. Özelliklerini biliyorsan izaha gerek yok. Sen farklı kullanıyorsan öyle kullan.

Forum da, nedenlerini aciklayamayacagin, soylediklerinin arkasinda duramayacagim boyundan buyuk sozler etmezsen sevinirim.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

Bunalmis hocam Interrupt gelince işlemci içeriklerini saklıyor diyor aşağıdaki linkte ama M3-M4 için geçerli mi bilmiyorum
interrupttan dönünce yüklenmesi gereken değerler korunuyor olması lazım bu durumda,
o zaman enable disable yapmaya gerek kalmaması lazım, yanlış mı anladım yoksa?
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0211a/index.html

eğer otomatik olmuyorsa da her interrupt için hafızada bir yer ayırsak girerken değerleri burada saklasak çıkarken geri yüklesek
enable disable derdinden kurtulmuş oluruz diye düşünüyorum

bir de exceptionlar için bir app note buldum ileride lazım olacak kalsın =)
http://www.keil.com/appnotes/files/apnt209.pdf

z

@Ersinerce,

Sorun context saving islemi değil.

Interrupt rutini ile ana program ayni donanimin registerine erisiyorsa, ana program da bu donanimin registeri uzerinde yazilimsal olarak bit manuplasyonu yapiyorsa
bu durumda ana program, donanim registerine erismeden once interruptlari yasaklamali, isi bitince de interruptlara izin vermelidir.
Aksi takdirde hata olusabilir.

Ornegin ana program portun 0. bitine 1 yazmak istedi. Portu okudugunda portun 0 oldugunu ogrendi. (Prta dogrudan 1 yazamaz yazarsa tum ust bitler silinir)
Bu esnada da int geldi. porttan okudugu deger registerde ve donanim bunu sakladi.
Int rutinine gecildi.
Int rutini de portun 1. bitini 1 yapmak istesin.
Portu okudugunda 0 gorur. 1. bitini set eder 2 eder ve bunu porta yazar.
Interrupt rutininden ciktik ana programa donduk.
Ana program porttan okudugu degeri biliyor neydi 0.
Bunun 0. bitini 1 yapti ve porta yazdi. Su anda portta 1 yazili.

Halbuki portta 3 olmaliydi.

Eger int yasaklamasi yapilsaydi, ana program porta 1 yazacakti, interrupta izin verildiginde int gelecek ve 1. biti set edecekti
bu da portun 3 degerini almasi anlamina gelecekti.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

Anladım hocam, o zaman kesme ile kullanılacak ortak yerlerde, bit işlemleri için Bitband yapısını kullanmak daha mantıklı

z

#449
@ErsinErce,

Nasil dersen oyle yap. Ister bitbanding ile isini gor hic interruptlari engelleyecegim diye ugrasma,
ister interrupt dis/enb yaparak bitleri yazilimsal maskeleyerek kaydirarak oku yada degistir.

Bitbanding, hedef biti atomik olarak okuyabilmeyi, set yada reset edebilmeyi saglayan donanimsal bir ozellik.

Interruptlar dahi bu islemi bozamiyor cunku bu ise yarayan komut kesilemez tipte bir komut.
Bu komutun okuma islemi icin opcode'u LDR, yazma islemi icin opcode'u da STR ve her ikisi de tek cycle da isliyor.
Bu komutlarla okunan  deger 0 yada 1 olabiliyor. Yazilirken de 0 yada 1 yazilabiliyor.

Kullanim amaci tek bir bite ulasmak.

Icimiz disimiz bitbanding oldu bence bu konuyu kapatalim artik.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com