Atmel Studio 7'de global değişken tanımlama sorunu

Başlatan batuhann, 26 Mayıs 2021, 08:34:36

batuhann

Herkese selamlar, aşağıdaki kod bloğunda bir sorun yaşıyorum. Atmel studio'da global değişken tanımlayıp ilk değerini atamama rağmen kod bloğu çalışmıyor. Bunun sebebi ne olabilir? Yardımlarınız için şimdiden teşekkürler.

#include <avr/io.h>
#define F_CPU 16000000UI


volatile unsigned short int X = 1;

int main(){
    while(1){
        if(X == 1){
           //buradaki kod bloğunu çalıştır
        }
    }
}

sifirzero

Atmelden anlamiyorum ama if blogu gorevini yapiyor. If blogun icindeki komut nedir.if blogu boşta duruyor
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

Kodlari yazar iken mesaj panosunda kod bloklarini kullanirmisin

printf("Merhaba sifirzero");
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

batuhann

Hocam, kodu temsili olarak o şekilde yazdım. Normalde if bloğu içerisinde porta bağlı olan bir ledi yakma işlemini gerçekleştiriyorum. Örnek olarak aşağıdaki kod bloğunu düşünebilirsiniz. Buradaki X değişkenini global olarak main bloğu dışında tanımlayıp ilk değerini 1 olarak atamama rağmen mikrodenetleyiciye bu programı yüklediğimde led yanmıyor yani X değişkenine 1 değeri atanmıyor. Ancak main bloğu içerisinde bu değişkeni tanımlarsam kod düzgün şekilde çalışıyor fakat benim yapmak istediğim şey global değişken tanımlamak. PIC mikrodenetleyicileri veya STM mikrodenetleyicilerde böyle bir sorun ile karşılaşmadım fakat Atmel'de niyeyse böyle bir sorun ile karşılaştım

if(X == 1){
   PORTD = 0b00000001;
}

makdeniz

Alıntı yapılan: batuhann - 26 Mayıs 2021, 08:34:36volatile unsigned short int X = 1;

volatile unsigned short X = 1;  olarak denermisiniz ?


Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

Tagli

Çok ilginç bir durum. Acaba derleyici veya linker ayarlarında bir eksik olabilir mi? Normalde böyle bir değerin .data bölümüne kaydedilmesi ve işlemci çalıştığında main'e atlamadan değer atanmasının yapılması lazım. Belki bu start-up kodunu devre dışı bırakan bir ayar falan vardır. Bu değişkenin if bloğuna gelmeden debug yaparak değerini görmen mümkün mü?
Gökçe Tağlıoğlu

fay_elektronik

Burda gördüğüm bir sürü eksik var bi kere volatile yazmama gerek yok çünkü kesme yok unsigned short yazman yerine short yazman yeterli sadece 0-1 alabilir onun için negatif sayılara geçemez delay fonksiyonunu çağır o eksik global değişken tanımında mesala uint8_t i=3; yazman yeterli

Tagli

@fay_elektronik , söylediklerin doğru ancak derleyicinin sıra dışı davranışının sebebini açıklamıyor.

@makdeniz , "unsigned short int" ile "unsigned short" aynı tür, aralarında bir fark yok.
Gökçe Tağlıoğlu

batuhann

Herkese selamlar, değerli cevaplarınız için çok teşekkür ederim. Belirli bir süre deneme ve araştırma yaptıktan sonra sorunun atmel studio 7.0 IDE'sinde benim kullandığım mikrodenetleyicinin (atmega2560) derleme ve program yükleme ayarlarıyla ilgili bir sorun olduğunu keşfettim. Belki daha önceden kullananlarınız vardır. Atmel studio'da tools sekmesi altında external tools ile programlamak istediğiniz MCU'ya yönelik bazı ayarlamalar yapmanız gerekiyor(commands,arguments) ve bu ayarlamalar farklı MCU' ya göre değişiklik gösterebiliyor. Şuanda belirttiğim kod MCU'ya ilgili ayarlamalar yapıldıktan sonra tekrar derlenip atıldığında düzgün şekilde çalıştı. Ancak bu seferde kafama bu ayarlama kısmı takıldı. PIC veya STM tarzı MCU'ları programlarken böyle bir ayar yapmıyordum fakat Atmel MCU'larda durum farklı sanırım ya da benim kullandığım programlayıcıya has bir sorun(usbasp programlayıcı kullanıyorum)

Tagli

Değiştirdiğin ayarların hangileri olduğunu söylersen belki yorum yapmamız mümkün olur. Benim bilgisayarımda Atmel Studio yüklü değil, o yüzden kendim girip bakma imkanım yok. Ekran görüntüsü de ekleyebilirsin.
Gökçe Tağlıoğlu

batuhann

Merhabalar, bahsettiğim external tools sekmesini aşağıdaki resimde görebilirsiniz.

Burada Title kısmına farklı programlama ayarları yaptığınızda hangisini kullanmak istediğini rahat bir şekilde hatırlayabilmek adına bir isim veriyorsunuz. Ben USBasp kullandığım için bu şekilde yazdım.

programlama ve debug kısımları için esas önemli nokta buradaki command ve arguments kısımlarına yazılacak parametreler.

Araştırdığım kadarıyla burada command kısmına avrdude.exe dosyasının uzantısını vermemiz gerekiyor.

ve esas sinir bozucu olan kısım. Arguments sekmesi, buraya programlama ile ilgili bazı ayarlamaları belirten parametrelerin girilmesi gerekiyor, aynı şekilde programlanacak MCU'ya ait bilgilerin girilmesi gerekli (benim durumumda atmega 2560 olduğu için "m2560" gibi bir parametre girilmesi gerekiyor)

Sanırım USBasp programlayıcısına has bir özellik olsa gerek, kullanılacak MCU'ya ait parametrelerin sürekli olarak değiştirilmesi gerekiyor. PICkit3 veya STlink tarzı programlayıcılarda bu tarz bir sorunla karşılaşmadım. Bu konu ile ilgili basit bir yöntem biliyorsanız tavsiyelerinize açığım.



Tagli

Benim anladığım kadarıyla IDE o programlayıcıyı doğrudan desteklemiyor. AVRDUDE isimli harici programı kullanarak programlayıcıya erişiyor. Bunlar da onunla ilgili ayarlar.

Ancak buradaki bir ayarın derleme işlemine etki etmemesi lazım. Ben olsam derleyici ayarlarından şüphelenirdim.

Neyse, sorun çözülmüş sonuçta...
Gökçe Tağlıoğlu

Kabil ATICI

atmel (microchip) programlayıcı kullanıldığı zaman, sorun çıkmadan kullanılmaktadır. örneğin, AVR MKII gibi... Galiba şu anda yeni programlayıcılar var.

Buradaki  işlemci kütüphane dosyası, özellikle sigorta ayarları için gerekiyor. Çünkü bazı işlemcilerde farklılık gösterebiliyor. Normalde bu parametreler orjinal programlayıcılarda derleme veya kod yazma esnasında  işlemci seçim dosyasından kullanılmakta.

Bu arada microchip'in orjinal olmayan programlayıcıları ile ilgili sorunları forumda az paylaşmadılar.
ambar7