Picproje Elektronik Sitesi

DERLEYİCİLER => Hi-Tech => Konuyu başlatan: camby - 03 Eylül 2011, 23:39:59

Başlık: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: camby - 03 Eylül 2011, 23:39:59
ASM'den C'ye geçmeye çalışıyorum. ( Yazmış ve bundan sonra yazacak olduğum ASM rutinlerimin hepsini makro haline getirmeye üşendiğim için atıldım bu işe diyebilirim )
Tabi ilk iş olarak yazdığım kodların , assembly karşılıklarına bakıyorum , Ancak bazı takıldığım yerler var.

Hi-Tech 9.82 , Ortam MPLAB , pic : 16f877a

Gecikme rutini için fx kodu yazmış :

while (1) // Sonsuz döngüye giriliyor
{
RB0=1; // Led yanacak
__delay_ms(250);
__delay_ms(250); // Yarım saniye beklenecek
RB0=0; // Led sönecek
__delay_ms(250);
__delay_ms(250); // Yarım saniye beklenecek
}



Gayet basit ve kullanımı kolay, ben ne yazıyordum assembly ile önceden :


ANA bsf PORTB,0
CALL BEKLE ; 500ms
bcf PORTB,0
CALL BEKLE ; 500ms
GOTO ANA



C'deki koduma Disassembly Listing diyorum hemen  :


19:                RB0=1; // Led yanacak
  07C5    1283     BCF STATUS, 0x5
  07C6    1303     BCF STATUS, 0x6
  07C8    1406     BSF PORTB, 0
20:                __delay_ms(250);
13 komutluk gecikme döngüsü....
21:                __delay_ms(250); // Yarım saniye beklenecek
13 komutluk gecikme döngüsü....
22:                RB0=0; // Led sönecek
  07E2    1283     BCF STATUS, 0x5
  07E3    1303     BCF STATUS, 0x6
  07E5    1006     BCF PORTB, 0
23:                __delay_ms(250);
  13 komutluk gecikme döngüsü....
24:                __delay_ms(250); // Yarım saniye beklenecek
13 komutluk gecikme döngüsü....
25:                }
26:                }


Gecikme rutini klasik , ancak PORTB'deki bir bit değiştirilmeye çalışıldığında her seferinde o register'ın bulunduğu BANK'a gidiliyor.

Zaten bank 0 ' dayız neden tekrardan bank0 komutu yazılıyor anlamış değilim aynı banktaki her register için bu yazılacaksa eğer , kesme içindeki değerli mikrosaniyelerimiz bu şekilde harcanmasın ? Burda programcının mı eksikliği var yoksa yapayzekanın mı ?


2. Nokta ise :

Disassembly Listing içinde görünmeyen kodlar var , bunları da Program Memory kısmından görüyorum :

Line    Address   Label                Disassembly             

     1    0000            BCF PCLATH, 0x4                       
     2    0001            BCF PCLATH, 0x3                       
     3    0002            GOTO 0x7bd                             
                                                           
  1982    07BD            CLRF STATUS                           
  1983    07BE            BCF PCLATH, 0x4                       
  1984    07BF            BCF PCLATH, 0x3   
                   
  1985    07C0            GOTO main                             
  1986    07C1    main    BSF STATUS, 0x5                       
  1987    07C2            CLRF PORTB       ; burası TRISB                     
  1988    07C3            BCF STATUS, 0x5                       
  1989    07C4            CLRF PORTB                             
  1990    07C5            BCF STATUS, 0x5                       
  1991    07C6            BCF STATUS, 0x6                       
  1992    07C7            MOVLW 0x7                             
  1993    07C8            BSF PORTB, 0
...............


Program kodlarını 0x005 adresinden itibaren yazıyorduk , Burada ise 0x000 adresinden başlanmış ( nasıl oluyor bu adresler içinde asm kodu ? < 0x000 : 0x004 > ) ve direk Page0'ın sonuna gidilmiş . Yani programın son satırı o page'in son adresine yerleşmiş ( 0x7FF) . Bunun nedeni nedir anlamış değilim , elbet bi nedeni vardır diyorum geçiyorum .

TRISB'ye işlem yapmak için tek bit değiştirme ile bsf STATUS,5 gidilmişken altında yine PORTB'ye program bank0'da olduğu halde 2 adet kod yazdıktan sonra değer yazmış.. Programın her yerinde PORTB'ye hantal bir şekilde gidiliyorken TRISB'ye bu kadar klass : ) gidilmesine de şaşırdım doğrusu.

C'de yeniyim ancak led yakıp söndürdüm o da isiste , o yüzden sorduklarım gereksiz/anlamsız ve ben bunu daha farketmemiş olabilirim , yada bunlar başka bir başlıkta tartışılmış da olabilir eğer öle ise affola.
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: Kadir Can(16F84) - 03 Eylül 2011, 23:52:44
İlk soruda işini garantiye alıyor.
BANK konusunda ben de zorlanmıştım.
BANK bir olursa TRIS, sıfır olursa PORT diye hatırlıyorum.
Şimdi sen bir yaparsan ve sıfıra çevirmezsen led yanmaz.Sadece giriş çıkış ile oyalanırsın.
Bunu önlemek için garantiye alıyor.
Optimizasyonlar kapalıysa açmayı denemelisin.
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: fatihinanc - 04 Eylül 2011, 00:01:18
Alıntı yapılan: gerbay - 03 Eylül 2011, 23:50:20
hocam senin "gecikme" rutinlerinin başka bankta olabilme ihtimaline karşı tekrardan status registerından bank seçiyor..

optimizasyon ayarları ne durumda, kapalı mı?

Eskiden bende de acayip bir şekilde vardı bu alışkanlık. PIC16 kullanırken (hi-tech) çıkışları gözlemliyordum.
@camby hocamın bashettiği sorunla önceden karşılaşmıştım. Normalde optimizasyon kapalı ya da low durumda oluyor.
bunu orta seviylere çektiğimde bu sefer böyle durumlarla karşılaşmadığımı hatırlıyorum.
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: LukeSkywalker - 04 Eylül 2011, 00:03:32
Optimizasyonu nereden ayarlıyoruz MPLAB'da?
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: camby - 04 Eylül 2011, 00:04:14
Alıntı yapılan: gerbay - 03 Eylül 2011, 23:50:20
hocam senin "gecikme" rutinlerinin başka bankta olabilme ihtimaline karşı tekrardan status registerından bank seçiyor..

optimizasyon ayarları ne durumda, kapalı mı?
@Gerbay
Gecikme rutininin nereye koyulacağını da zaten derleyici kendisi seçiyor , bilinmemesi gibi bir durum olmaması gerekir.


Alıntı yapılan: Kadir Can(16F84) - 03 Eylül 2011, 23:52:44
İlk soruda işini garantiye alıyor
.....
Bunu önlemek için garantiye alıyor.
Optimizasyonlar kapalıysa açmayı denemelisin.
@Kadir Can
Değindiğim konuyu tam olarak anlamadın sanırım , istenilen register'a ulaşılmak için o register'ın bulunduğu bank'a gitmek gerekiyor , bu konuda sıkıntı yok. Ben trisx ile giriş çıkışı belirleyip , portx ile işimi yapıyorum , gerisine de karışmıyorum , C'ye geçmemin amacı bu zaten arka plan ile uğraşmamak. Şimdi arka plandaki işlemleri zaten derleyici kendisi yapıyor , o zaman neyi garantiye alıyor..

@Gerbay,Kadir Can,fatihinanc

Optimizasyonu sizden duydum şimdi. Rica etsem Hi-Tech'in optimizasyonun basit genel tanımını ve nasıl aktif edildiğini söyleyebilir misiniz ?

@fatihinanc

Bu alışkanlıktan kurtulmak için de C'ye başladım diyebilirim : )
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: fatihinanc - 04 Eylül 2011, 00:10:22
Hocam MPLAB IDE ise;
Project -> Build Options -> Project
[IMG]http://img4.imageshack.us/img4/4971/optw.png[/img] (http://imageshack.us/photo/my-images/4/optw.png/)
PIC ten sonra MSP430 ile IAR a geçtim. Onda derleyici ve mikrodenetleyici mimarisinin daha sağlam olmasından dolayı kodlar baya optimize çıkıyor hocam ;)
Selamlar...
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: Kadir Can(16F84) - 04 Eylül 2011, 00:13:11
Aslında demek istediğini anladım.
Şimdi sen trisx dediğinde bank bire geçilir.portx dediğinde de bank sıfıra geçilir.Yani derleyici değil, yine sen ayarlıyorsun.
Optimizasyon dediğimiz olay, kodu en iyi hale getirmektir.Yani en kısa ve hızlı koda ulaşılmaya çalışılır.Optimizasyonların kapalı olması durumunda derleyici uzun ve yavaş bir kod sunacaktır.Yani kod üzerinde kendini yormaz.Hangi bankta kalmışım, bank geçişi gerekli mi diye bakmaz.Optimizasyonları açtıkça kendini daha iyi bir kod oluşturmak için zorlar.Bank geçişleri için kontrol uygular.
https://www.picproje.org/index.php/topic,31195.msg232787.html#msg232787 (https://www.picproje.org/index.php/topic,31195.msg232787.html#msg232787)
Bu mesaja bakarsan, optimizasyonlar kapalı iken kodda değişiklik yok.Optimizasyonları biraz açınca toplamanın birazını kendi yaptı ve hazır kodu çevirdi.Optimizasyonları tamamen açınca işlemin tamamını yaptı ve tertemiz bir kod oluşturdu.
Başlık: Ynt: ASM'den C'ye geçmeye çalışırken takıldığım! noktalar
Gönderen: camby - 04 Eylül 2011, 00:54:35
Örnekte anladım şimdi Optimizasyon konusunu.

Mplab için max 9 heralde optimizasyon , azalttım , arttırdım ve speed tikini işaretledim birşey değişmedi , değişecek birşeyler bulurum yakında. Teşekkürler.