Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

MPLAB'da HI-TECH Register problemi

Başlatan FEHMİ_ASM, 03 Ocak 2011, 20:50:34

FEHMİ_ASM

Arkadaşlar MPLAB(8.50) 'de PICC kodları ile yazdığım programlarda tanımladığım değişkenleri göremiyorum yani WATCH penceresinde yoklar. İçeriklerini görebileceğim farklı bir yer mi var acaba? [NOT: Derleme hatasız.]

eseneren

View - File register dan adresine gore bakabilirsin...
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

sigmoid

Watch penceresine registerları tektek kendiniz eklemeniz lazım. Debug esnasında watchı kullanmak daha kullanışlı oluyro.

FEHMİ_ASM

Arkadaşlar bazı projelerimde tanımlanan değişkenleri WATCH'den görebiliyorum ancak bazılarında halen yoklar. Neden farklılık olduğunu da anlayabilmiş değilim. Zaten C'ye yeni başladım. Register değerini görememenin sebebi acaba program optimizasyonundan kaynaklanıyor olabilir mi? Bir fikir olması açısından size içerisinde bir değişken tanımladığım örnek bir program gönderiyorum. Ayrıca ilgilenen arkadaşlara teşekkür ediyorum.         
#include <htc.h>
#include "delay.h"   // Gecikme kütüphanesi
#include "delay.c"  //    "
#include "lcd.h"   // LCD kütüphanesi tanımlanıyor
#include "lcd.c"    //    "

int i=4 ;

void main(void)      // Ana fonksiyon alanı
{   
   TRISB=0x00;      // LCD'ye bağlı portlar çıkış yapılıyor
   TRISC=0x00;
   PORTB=0x00;
   PORTC=0x00;
   
   lcd_init();      // LCD ilk ayarları yapılıyor
   
   lcd_yaz("   FEHMI SAHIN");   // İlk satıra isim yazılıyor
   lcd_gotoxy(2,1);         // İkinci satıra geçiliyor
    i=i+1 ;
   lcd_yaz(" PIC PROGRAMLAMA");      // Rakamlar yazılıyor
   for(;;);               // Sonsuz döngüye giriliyor
}                     

sigmoid

bu değişken ömürleri ile alakalı bir şey. Eğer bir fonksiyon içinde bir değişken tanımladıysanız onu normalde göremiyorsunuz. Debug yaparken ilgili değişkenin içine girildiği anda watch kısmına o değişken eklenebiliyor yoksa gözükmüyor. Bunu MPLABın bir eksisi olarak görüyorum.

FEHMİ_ASM

Sayın Abdullaho, MPLAB C18 'de de benzeri bir durum var mı acaba, onu yükleyeyim diyorum, belki de hi-tech'in compiler'inden daha kalitelidir, daha fazla hakimiyet sağlar.Zaten büyük programlarımı en az 18F seri ile yazmayı düşünüyorum.  Bir de osc frekansını nasıl bir komutla değiştirebilirim?

FEHMİ_ASM

Ayrıca biraz önce farkettim ki simülasyonu adım modundan çalıştırırken i=i+1 komut satırını görmüyor yani atlıyor. Bir MPLAB kurulum hatası mı var diyorum ancak çok dikkatlice kurmuştum. Acaba include dosyalarından birini yukarıda göstermedim mi veya mantıksal açıdan hatalı bir parametre mi girdim?

iyildirim

Buna benzer bir sorunu C30 derleyicisinde bende yaşamıştım. Bazı satırlar hiç yokmuşçasına derleme yapıyordu. Araştırınca nedeninin derleyici optimizasyonları olduğunu anladım. Optimizasyonları kapatınca doğru derlemeye başladı.

FEHMİ_ASM

Peki bu fonksiyon nereden kapanıyor? Onu da yazılımla kapatmayız sanırım

mufitsozen

#9
Alıntı yapılan: FEHMİ_ASM - 07 Ocak 2011, 17:56:09
Ayrıca biraz önce farkettim ki simülasyonu adım modundan çalıştırırken i=i+1 komut satırını görmüyor yani atlıyor. Bir MPLAB kurulum hatası mı var diyorum ancak çok dikkatlice kurmuştum. Acaba include dosyalarından birini yukarıda göstermedim mi veya mantıksal açıdan hatalı bir parametre mi girdim?

int i=4; dedikten sonra i=i+1; demissiniz. yani compiler optimizasyon acik ise int i=5; yazarsa bunun da ayni sey oldugunu sizin yerinize dusunmus. Bu bir hata değildir. Compilerin sizden daha akilli oldugunu gosterir:-)

bu satiri kaldirmasin derseniz ya optimizsayonlari kapatacaksiniz (bu da derleme safhasindaki bir degisikle yapilir fonksiyon degildir. yani run-timeda degistiremezsiniz!) yada i degiskenini volatile diye tanimliyacaksiniz.

Temel gomulu sistemlerde C programlama bilginizi derinlestirmeniz lazim. Bu butun gomulu sistemlerde aynidir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

FEHMİ_ASM

Peki bu optimizasyon denilen icadı nasıl kapatacağım ve kapatırsam simülasyonumun kaybedeceği bir özellik olur mu?

mufitsozen

Alıntı yapılan: FEHMİ_ASM - 07 Ocak 2011, 19:22:51
Peki bu optimizasyon denilen icadı nasıl kapatacağım ve kapatırsam simülasyonumun kaybedeceği bir özellik olur mu?

Bu optimizasyon denilen icadi programlar daha hizli kossun ve hafizada daha az yer alsin diye icat etmisler, cok da ugrasmislar. Genel olarak sizin el ile yapabileceginizden cok daha iyi (hem hizli hem az yer kaplayan) programlar ortaya cikar, or: sizin programda i diye bir degisken kullanmak yerine i gecen yerlerde 5 kullanmanin ayni sey oldugunu anlamis ve ona yer ayirmamis! O yuzden i degiskeni statik olmamisina ragmen watch edilemiyor.

ben MPLAB ile CCS_C kullaniyorum. programlarin bir debug birde normal versiyonlarini yapiyorum. Debug versiyonunda optimizasonlari kapatiyorum vs.

Optimizasyonlar compiler ozelligi oldugu icin, ideye eklenmis compilerda MPLAB uzerinden yapilmasi lazim.
ben MPLAB->Project->Build Options->Project seciyorum

Acilan penceredeki "CCS C Compiler" 'tirnagini' seciyorum, Categoriesde "Optimization" seciyorum. "Optimizsayon Level"i en dusuge getiriyorum. Alltaki text penceresinde otomatik olarak compiler secenekleride degisiyor. Eger isterseniz CCS C kullanim kilavuzundan dogru secenekleri buraya siz elden yazabilirsiniz. Boylece projenizde compiler calistirilirken o flag'lerde otomatik gonderilir.

Umarim anlasilir olmustur, Turkce bilgisayar terimleri cogunlukla uyduruk oldugundan anlatim biraz karisik oluyor.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

FEHMİ_ASM

Sayın mufitsozeni. Öncelikle bana vaktinizi ayırdığınız için gerçekten teşekkür ederim. "volatile" tanımını ekleyince register değerini WATCH penceresinden istediğim şekilde görebildim. Bu tanım kod satırında nasıl yazılacak (örn:---- int volatile a; ----  int volatile char= k; ----)  Ayrıca lcd her güncellenip program ana satıra tekrar dönünce değişkenin ilk değeri geri yükleniyor, neden? Ben bu tanımı fonksiyon içinde yapmıyorum ki

mufitsozen

volatile int a;
yada
volatile in16 a;
yada
volatile unsigned 1nt8 b;



volatile komutu ile tanimlanan degiskenin bizim derlemeye yaptigimiz modul disinda (donanim yada kesmede) degisebilecegini soylemis oluyoruz. Boylece compiler o degiskeni optimize ederken kaale almiyor.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

FEHMİ_ASM

Bilgileriniz için teşekkür ederim.