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.
İ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.
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.
Optimizasyonu nereden ayarlıyoruz MPLAB'da?
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 : )
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...
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.
Ö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.