Renesas için Derleyici

Başlatan YARGICH, 15 Ocak 2006, 18:27:23

aYe

Selam,

@YARGICH

Saniyorum ki sorununuz derleyiciden ziyade m16c'yi programlamak veya çalıştırmak  ile ilgili kısımlarından birinde.

Bunu anlamanın en kolay yolu ise elinizdeki m30620 için derleyip oluşturduğum ve yükleyip denemesini yaptığım bir mot(motorola hex file) dosyası ile derleme aşamalarına girmeden deneme yapmanız.

http://picproje.com/upload/Mevcutdosyalar/m30620knight.mot

İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Selam Hocam, Upload yeniden düzenlenmiş harhalde. sizin doyada silinmiş benim avatarda. O yüzden tekrar yükleyebilirseniz çok memnun olurum. Bende benim kartı düzenleyip akşam tekrar deneyeyim.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

aYe

Hmm evet haklısın bir sürü mesaj'i editlemek yada silmek gerekecek, en kolayı silmek gibi gözüküyor.
ilgili mot dosyasını iş yerinde olduğumda msn'den yollarım.

İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Burdan TATLISUKURNAZI'na çok Teşekkür Ediyorum. Benim gıcık gıcık sorularıma o kadar işinin arasında yılmadan, sıkılmadan cevap verdiği için kendisine tekrar tekrar teşekkür ediyorum.

Daha önce çalıştıramamamızın sebebi bendeki M30620 veya onun adaptor kartından kaynaklanıyor olabilir. Tam olarak emin değil. Yalnız bazı tuhaflıklarıda var, mesela 0xFFFFF adresine kadar programlayamıyo, 0xFFDFF adresine kadar programlayabiliyo. Yeni bir M30624 chip ile takrar bir kart düzenleyerek denedim ve tatlisukurnazi hocamın daha önce gönderdiği PicProje.ewp proje dosyasını denedim ve düzeldi. Bu chip ile 0xFFFFF adresine kadar programlayabiliyorum. Bir şey daha var. önceki chipde eski programı silmeden tekrar yükleyebiliyordum. Yalnız bu chip de silmeden yenisini yükleyemiyorum. Yani birkaç terslikleri vardı ama sorun M30620 modellerinden kaynaklanmıyo, bendeki M30620 den kaynaklanıyodur.  Neyse ilk Flip-Flop yazılımını Renesas M30624 üzerinde çalıştırmayı başardık. Bundan sonra gelsin Renesas'lı ürünler :)
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

YARGICH

Selam,

Benim IAR ile ilgili bir kaç sorum var;

- Bu IAR'ın Renesas için Built-in Function'ları yok mu? Varsa bunları nerden bulabilirim. Dünya kadar acayip acayip döküman indirdim ama bulamadım.
- IAR da Case Sensitive diye bişey var mı? aslında istediğim, bu değişkenleri veya önceden tanımlanmış SFR'lerin harflerini büyük küçük yazmamdan dolayı hata veriyo. Bunu giderebilirmiyiz.
- Grafik Lcd için kendime bi h dosayası oluşturacağımda  mesela P3'e Lcd_Data diye bir etiket atayabilirmiyim. yani atmam lazımda nasıl. ben bu şekilde yaptım
 
#define LCD_Data   = P3;

ama herhalde olmadı. çünkü LCD_Data'ya veri atarken "expected an expression" yanlış çevirmediysem "bir ifade olması gerekirdi" diyor. ne demekse ??? P3 yerine 0x03E5 diye P3'ün memory deki adresini de versem düzelmiyor.
- Birde programlama yaptığım UART'ı genel amaçlı olarak kullanabiliyorumdur herhalde. U1BRG diye UART1'ın Baudrate'ini belirleyen register 1 Byte'lık. Ben buna ne yazacağımda istediğim Baudrate'e ayarlayacağım.

Ya ben bu M30624'ün tam bi datasheet'ini bulamadım yada bunlar yazmayı unuttu :D

Kolay Gelsin !!!
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

Erol YILMAZ

Alıntı yapılan: "YARGICH"
 
#define LCD_Data   = P3;

yerine...
 
#define LCD_Data  P3

daha dogru olmaz mı

YARGICH

@ Erol

Senin dediğin gibi yaptığım zamanda bu iki hatayı verdi
"expression has no effect"
"expected an expression"

Bende Header dosyasına bakarak böyle bir tanımlama yaptım;
__no_init volatile union
{
  unsigned char LCD;
  struct
  {
    unsigned char RS           : 1;  
    unsigned char RW           : 1;  
    unsigned char E            : 1;  
    unsigned char CS1          : 1;  
    unsigned char CS2          : 1;  
  } LCD_bit;
} @ 0x3E8;


Şimdi bir hata vermiyor. Birazdan deneyeceğim de bunun başka bir yolu varsa bimekte fayda var. Daha önce sorduklarımın hala geçerlilik süresi devam etmektedir :D
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

YARGICH

Tamamdır, denedim şuan sorun yok. Grafik LCD yide çalıştırdık. Yalnız sanki çok hızlı veri gönderdiğinden dolayı LCD nin tamamında veri çıkmıyo. ilginç !!! Gerçi meşgul olup olmadığına bakıyo ama. Neyse hallederiz.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

YARGICH

Bu IAR derleyicisinin Renesas için gerekli olan built-in-function larını hala bulamadım :(
Mesela M16C'nin FLG diye özel bir registeri var. Bu register SFR diye geçmesine rağmen SFR listesinden yok ve bu FLG registeri aslında CPU nun içerisinde yer alıyor ve içerisinde Z,C gibi birçok Flag barındırıyor ancak tanımlanan bir adresi yok. Ben bu registere nasıl veri yazacağımı bilmiyorum. Niye ben bu registere veri yazmak istiyorum? Çünkü, bu register 16 bitlik bir register, ve bu registerin 6. bitinde interrupt eneble biti var ayrıca 12, 13 ve 14. bitlerinde IPL diye 3 bitlik bir tanımlama var. Burayada interrupt seviyesinden küçük olan bir değer girmem gerekiyor. örneğin interrupt seviyesini 7 atadıysam burayada 6 yazmam gerekiyor. Neyse şimdilik değerler önemli değil. önemli olan nasıl yazacağım. Şöyle bir şey farkettim, ben enable interrupt yapmak için FLG registerinin 6. bitini 1 yapmak istiyorum ama MakeAPP programının oluşturduğu ma_int.c dosyasında;
__enable_interrupt();

diye birşey gördüm. Dedim herhalde CPU içerisindeki özel registerlere bu şekilde ulaşılıyor veya özel tanımlanan fonksiyonlar var fakat bende kullandığımda tanımlanmadığını belirten bir hata mesajı çıkıyor.

İstediğim, varsa bu gömülü özel fonksiyonları ve bir interrupt'ın M16C'de nasıl oluşturulduğunu öğrenmek. Örneğin UART1 interrupt'ını nasıl oluşturacağımı öğrenmek istiyorum. Ben şuan UART1 den  38400 Baud'da veri gönderebiliyorum ama interrupt ile alamıyorum. :(
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

aYe

Bir de kodun başına şunu ekleyip deneyin;

#include <intrinsics.h>

İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

YARGICH

Teşekkürler, sizde olmayınca burası çok sessiz ve yanlız oluyo :D
Bende diyorum yahuu ben bunu daha önce ekledim ama nasıl!!! işte dikkatsizlik. Şimdi oldu artık PC'ye veri alıp gönderebiliyoz.
Ben bu renesas'ın datasheetlerine ve header dosyalarına alışmaya başladım. Ama hakikatten bir sürü özel amaçlı registerleri var. birkaç datasheet ve kullanmadığım birkaç header dosyası sürekli açık kalıyo ve bazen de Renesas'ın eğitimleri açık kalyo onlardanda yardım alıyorum. Buna rağmen genede size ihtiyacım oluyo :D interrupt vectorlerini ayarlamışım, öncelik seviyelerini ayarlamışım, alt rutuni yazmışım, UART ayarlarını yapmışım ama aktif edemiyorum :) bütün ek dosyalara baktım bi ona bakmamıştım. Dedim onda ne işi olabilir ki :D sizde olmasanız benim işim uzayıp gidecek. 2 gündür aradığım şeyi 2 dk da hallettiniz.
Bu aleti tam anlamıyla kullanmak zaman alacak. Bir UART haberleşmesinde bile bir sürü ayrıcalık tanıyo, Hat çarpışmaları, hat boş ise göndermesi, dahili CTS/RTS, Dahili 32 Byte RX ve TX buffer hatta bu 32 Byte arttırılıp azaltılabilir...vs...vs...

Ben bir şey daha sormak istiyorum. "zaten hiç susmuyorsun" dediğinizi duyar gibi oluyorum :D
Data = Komut | 0x40;

bu komut CCS de kullandığım komut ve LCD ekrana sutun bilgisi hazırlıyor. Yalnız bunu IAR da kullandığımda bi işe yaramadı. yani tuhaf tuhaf çalıştı ve sutun bilgileri yanlış gitmeye başladı.
Bende bunu;
Data = Komut || 0x40;

bu şekilde değiştirdim düzeldi. Yalnız satır belirlediğim kısımlardaki CCS ile aynı  :roll:  "|" bununla "||" bunun anlamı CCS de de, IAR da da aynı anlamlar taşımasına rağmen farklı sonuçlar doğuruyo.
Bu sorunda anlamadan çözülen sorunlar arasında aklımda kaldı.

Teşekkürler, Kolay Gelsin.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

Erol YILMAZ

Data = Komut | 0x40;

Bitsel or işlemi

Data = Komut || 0x40;

Mantıksal or işlemi

Bu iki işleminde aynı sonucu üretmesi %90 zamanda mümkün değil.
H.h bir sayıyı, 0 olmayan bir sayıyla Mantıksal OR işlemine sokarsan
sonucun her zaman 1 olması kaçınılmaz.

IAR C Derleyicisi for M16C nin simulasyon sonuçları da aşağıdaki gibi.
Data2 değişkenine dikkat !



Ayrıca üretilen LST dosyasına göre C derleyicinin iyi optimize olduğunu belirtmek te mümkün. Çünkü Data2 değişkenine OR işlemi ile hiç uğraşmadan "1" cevabını yapıştırmış.
    14            Data2 = Komut2 || 0x40;
   \   00001D   C701....             MOV.B   #0x1, Data2


Bu da programın komplesi...

     6          int main( void )
   \                     main:
      7          {
      8            Data1 = 0x15;
   \   000000   74CF....             MOV.B   #0x15, Data1
   \            15      
      9            Komut1 = 0x64;
   \   000005   74CF....             MOV.B   #0x64, Komut1
   \            64      
     10            Data1 = Komut1 | 0x40;
   \   00000A   74C040               MOV.B   #0x40, R0L
   \   00000D   1B....               OR.B    Komut1, R0L
   \   000010   03....               MOV.B   R0L, Data1
     11          
     12            Data2 = 0x15;
   \   000013   74CF....             MOV.B   #0x15, Data2
   \            15      
     13            Komut2 = 0x64;
   \   000018   74CF....             MOV.B   #0x64, Komut2
   \            64      
     14            Data2 = Komut2 || 0x40;
   \   00001D   C701....             MOV.B   #0x1, Data2
     15          
     16            return 0;
   \   000021   D900                 MOV.W   #0x0, R0
   \   000023   F3                   RTS


Saygılarımla,

YARGICH

@Erol

Aslında sormak istediğim CCS de de IAR da da aynı anlamı içermesine bu komutlar neden farklı sonuçlar ürettiği idi. Ben genelde Bitsel or işlemini kullanıyorum ama Mantıksal OR şimdi, sol taraftaki değer 0 dan farklı ise sağ taraftakine bakmadan direkt sonucu 1 vermesi dimi. Eğer sol taraf 0'sa sağ tarafa bakıyor orası da 0'sa sonuç 0, 0'dan büyükse sonuç gene bir çıkıyo. Yani içerisindeki değerlere tam bakmadan sadece bir OR kapısı uygluyor dimi? Tamam anlaşılmıştır.

Ama sonuç ilginç  :!: yani ben diyorum ki
Lcd_Komut = sutun || 0x40;

ben bunu dedikten sonra, sutun bilgisini ne verirsem vereyim Lcd_Komut değişkeni sürekli 1 olmuyor mu? Aslında kullanmak istediğim Bitsel OR işlemi. Yani bunu bırakıp sutun değişkeninin 6. bitini Set etsemde işime yarayacak ama bunun nasıl çalıştığınıda merak etmeye başladım. Bir yerlerde yanlışlık mı yaptım acaba.

Yardımlarınız için Teşekkürler,
İyi Çalışmalar
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.

Erol YILMAZ

Bitsel   ve Mantıksal VEYA (or)  operatorlerinin hatalı kullanımı klasik C dili hatalarından biridir.

Tavsiyem, bunun gibi temel işlemlerde şüpheye düştüğünüz anda, C hakkında referans bir kitaba başvurun. Microsoft C veya başka birşey olması önemli değil.

CCS C derleyicisinin çok sayıda özel fonksiyonu olduğu için oralarda hata olması muhtemel ama temel işlemlerde hiçbir problemini görmedim.
Bence yazdığınız fonksiyonları gözden geçirin.

CCS ve IAR ın bu tip işlemlerde  farklı davranması mümkün değil.

Bu arada IAR dan giderek hoşlanmaya başladım.
PIC18 veya Mitsu  hepsi için ortam aynı,

Derleyici sadece derleyici olarak çalışıyor. Fonksiyon jeneratoru olarak değil. Bir de ismi DERTLEYICI olanlar var :D

Saygılarımla...

YARGICH

Bende bu IAR dan hoşlanmaya başladım, dediğiniz gibi ortam aynı. Şimdi CCS de yazıp PIC için kullandıklarımı IAR'a geçiriyorum. O yazdıklarımı hem Mitsubishi için hemde PIC için kullanacağımı bildiğimden dolayı yaptığım şeyleri tekrar yapmaktan rahatsızlık duymuyorum.

Aslında kod'da bir terslik olabilir belki ama CCS de çok uzun zamandır kullanıyorum. Eski ve yeni versiyonlarında. CCS'in hata yaptığını bende düşünmüyorum. Zaten olması gereken CCS de yazdığım gibi. Yani bitsel OR olması gerekiyor. Ama dediğim gibi ilginç. Bende bir simülasyonda bakayım. Yalnız ben bendeki Debug kısmını bozdum :D Yani eskiden o an da işleyen kodu yazdığım alanda da yeşil olarak görüyordum şimdi sadece makina dili ile yazılmış alan yeşil olarak ilerliyor. Galiba ayarlarını bozdum :D

Teşekkürler, İyi çalışmalar.
Uçurtmalar, rüzgarın kuvvetiyle değil, rüzgara karşı koydukları direnç ile yükselirler.