MSP430 Debug Problemim

Başlatan bit01, 12 Kasım 2016, 18:43:00

bit01

Merhaba

@Erhan YILMAZ 'ın modül halindeki eğitim setinden çalışıyorum. CCS 6.2.0 ve M430G2553 kullanıyorum.

Modül 2'de buton kullanımı ile ilgili olan uygulamada yaşadığım birkaç sorun ve aklıma takılan bir kaç nokta var.

Eğitimde yer alan kod şu şekilde;

#include <msp430.h>
unsigned short wSayac; // Sayaç değişkeni
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Watchdog timeri durdur.
P1DIR |= BIT0; // Port1.0 çıkış.
P2DIR &= ~BIT0; // Port2.0 giriş.
P2REN |= BIT0; // Port2.0 direnci aktif
P2OUT |= BIT0; // Port2.0 girişi Pull-Up
while(1){ // Sonsuz döngü
if(!(P2IN & BIT0)){ // Butona basıldı mı?
for(wSayac=0;wSayac<1000;wSayac++) // Buton arkını önlemek için bekle
while(!(P2IN & BIT0)); // Butonun bırakılmasını bekle
P1OUT ^= BIT0; // Port1.0 bitini tersle
}
}
}


Soru(n)larım:

1)Debug yapmadan, programı derleyip sadece msp üzerinden çalıştırmak için kodu msp'ye nasıl atabilirim? derleyince otomatik kod msp'ye yükleniyor mu?

2)Debug yaparken butona bir kez basıyorum ama kod if bloğundan hiç çıkmıyor. Hep blok içinde kalıp step into dedikçe ledi yakıp söndürüyor. Normalde if'in dışına çıkıp butonu kontrol etmesi gerekmiyor mu? Yani benim beklediğim butona basıldıysa toggle yapacak bitirip yine if'in başına dönecek, basılmadıysa if'in başında bekleyecek.

Debug'dan çıkartıp kartı kendi başına çalıştırınca sorun yok doğru şekilde çalışıyor.Ama debug da çalışırken if bloğunun içinden çıkmıyor neden?

3)while satırını çıkartınca, butona basılMAdığı zaman led tam parlaklıkta, butona basılı tutunca yarı parlaklıkta çalışıyor. O kısmın mantığını anlayamadım neden parlaklık yarıya düşüyor?

Erhan YILMAZ

1-) Bir kez debug yapıp çalıştırınca program atılmış oluyor mcu içerisine. Tam emin değilim ama ccs ide üzere direk debug seçeneği de olabilir. Onun haricinde direk olarak program atmak için harici programlayıcıları vs. var TI'nin. O iş biraz ticari oluyor yani.

2-) Muhtemelen debug yaparken bir şeyleri yanlış yapıyorsun. Butona basarsan if bloğunun içine girer ve bırakana kadar while'in içinde bekler. Butonu bırakınca da LED'in durumunu tersler çalışmasına devam eder. Program amaç olarak butona basıp bırakınca LED'in durumunu tersler. Kendi başına doğru çalışıp debug yaparken çalışmıyorsa sorunu kendini aramalısın.

3-) O kısmı çıkartırsan program butonun bırakılmasını beklemez basılı tuttuğun sürece LED'in durumunu tersler. BU işlem çok hızı olduğu için led sürekli bir yanıp bir söner. Yani %50 PWM uygulanmış gibi çalışır yarım ışık verir. Bu dediğin arabanın motorunu söktüm araba çalışmıyor artık, neden çalışmıyor gibi bir duruma karşılık geliyor. Kodun içinde bir kısmı çıkartıp mantıklı çalışmasını bekleyemezsin.

bit01

#2
Tamamdır sorunları çözdüm iar bana daha kullanışlı geliyordu onunla kodu daha detaylı inceleyebildim.

2. sorumu şu şekilde çözdüm: c yapısı gereği for'dan sonra süslü parantez açıp kapatmadığımız için hemen altındaki satırı yani while satırını da işletiyor. for dönüsü de 1000'e kadar saydığı ve ben de debug işlemini adım adım yaptığım için 1000 kez while satırına inip çıkması gerekiyor. böyle olunca da sanki programda hata varmış, hep while'a inip çıkıyormuş gibi algılamıştım. O kısımı anladım.

3. kısımda aslında while çıktığında neden düzgün çalışmadığını değil de neden parlaklığın yarıya düştüğünü merak etmiştim. O da pwm etkisindenmiş.

cevaplar için teşekkürler @Erhan YILMAZ

Erhan YILMAZ

Rica ederim. Aslında orada benimde hatam var. For döngüsünün ardından süslü parantezden ziyade noktalı virgül eklemem gerekiyordu. Fakat programın çalışması fazla etkilenmediğinden hatanın farkına varamamışım. İşiniz görüldüyse sorun yok. İyi çalışmalar.

bit01

@Erhan YILMAZ  bir de &,| işlemlerinde bir şeyi merak ediyorum.

Mesela P1DIR|=0x00 dediğimizde bu işlem nasıl gerçekleşiyor daha doğrusu ilk anda p1dir'in içinde ne var

0000 0000 olarak mı geliyor ki bu durum & işleminde istenmeyen bazı durumlara yol açabilir sanırın yoksa boş ya da rastgele olarak mı geliyor?

Erhan YILMAZ

P1DIR'ın içinde ne olduğu bizi ilgilendirmez. &|^ operatörleri ile P1DIR yada istediğimiz değişkenin içindeki istediğimiz biti reset,set,toggle edebiliriz. Diğer bitlerin değerini değiştirmeden. Bu konuyu detaylı anlattım modüllerde detayını oradan öğrenebilirsin.