msp430 buton sorunu

Başlatan metaltrrocker, 03 Ocak 2013, 15:53:35

metaltrrocker

merhaba arkadaşlar msp430 ile yeni tanıştım bir iki uygulama yapmaya karar verdim hazır gelen led yakma uygulamasını yaptım.bunu çeşitli zamanlamalarda çeşitledim.hatta portlardan birini kullanarak 440hz ses bile çıkarttım(la notasına karşılık geliyor).Ancak p1.3 portuna bağlı olan s2 butonunu kullanmak istediğimde bir türlü başaramadım.bilmediğim şeyler var.C programada başlangıç ve orta arası bilgilerim var ancak MCU olarak ilk deneyimlerim o yüzden affınıza sığınarak bu başlığı konuyu açıyorum kodlar aşağıda rasgele deneme yanılmalar da yaptım ama butonu kontrol edemedim.Amacım basit olarak butona basınca iki ledin sırayla yanıp sönmesi.şimdiden yardımlarınız için teşekkür ederim.
#include <msp430g2553.h>
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD; //Watchdog timer durduruluyor...
 
  P1DIR = 0xF7;  //P1.7 Giriş, diğerleri çıkış...
  
   
 
  BCSCTL1= CALBC1_8MHZ; //DCOCLK 8MHZ Seçiliyor...
  DCOCTL = CALDCO_8MHZ;
 
  while(1)
  {
    if ((P1IN & 0x08)==0)
	{
          P1OUT = 0x40;
	__delay_cycles(1000000);
          P1OUT = 0x01;
	__delay_cycles(1000000);
        }
  }

}

fgokcegoz

Eğer P1.7 giriş ise aşağıdaki kod,

if ((P1IN & 0x08)==0)

şu şekilde olmalıdır.

if ((P1IN & 0x80)==0)
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

metaltrrocker

hocam kodlarda yanlış yazmışım açıklamayı giriş portu P1.3 olacak.
hatayı hala bulamadım.

burak ozturk

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD; 
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL =  CALDCO_1MHZ;
  __delay_cycles(100000);
  
  P1DIR = BIT0;
  
  while(1)
  {
     if(P1IN & BIT3)
        P1OUT |= BIT0;
     else 
        P1OUT &= ~BIT0;
  }


hocam acıkogetim çalıştıgım için kodları düzenlemedim ama bu kodlar en azından yak son yapıyor buna göre uydurursunuz zaten.
happy coding.

metaltrrocker

hocam bu da çalışmadı

mesaj birleştirme:: 03 Ocak 2013, 21:11:57

nerde hata yaptığımı bi bulabilsem ahhh:(

burak ozturk

#5
ccs de mi derliyorsun iar de mi ? yollamadan once iar 6.4 te test ettim butona bastıgın sürece sondurup bıraktıgında p0 'ı yakıyor.

hocam komple proje dosyasını upload ediyorum bir de oyle dene istersen https://skydrive.live.com/redir?resid=264C7302C4480F!512
happy coding.

metaltrrocker

#6
iar ile deniyorum bi deneyeyim senin yüklediklerini.

mesaj birleştirme:: 03 Ocak 2013, 22:35:36

hocam denedim de şöyle bi gariplik var.Normal butona basınca çalışmıyor ancak elim yanlışlıkla p1.3 pinine değdi.böyle olunca çalıştı anlamadım neden böyle olduğunu.bilmediğim birşey mi var.elimi değirdiğim süre boyunca çalışıyor elimi çekince delay süresi kadar bekliyor sonrada sönüyor.

burak ozturk

#7
hocam affınıza sıgınarak soruyorum program yuklendikten sonra kartı söküp takıyorsunuz değil mi ?

mesaj birleştirme:: 04 Ocak 2013, 00:32:40

hocam yaşadıklarınızın aynısını yaşayan birini buldum ;

http://e2e.ti.com/support/microcontrollers/msp43016-bit_ultra-low_power_mcus/f/166/t/161077.aspx

anladıgıma göre butonu soguk lehimmiş ..
happy coding.

metaltrrocker

#8
hocam kartı normalde söküp takmıyordum ama şimdi denedim yine aynısı oluyor reset de atıyorum karta ama nafile bir video çekip koyayım belki bende bir sorun vardır. ne olur ne olmaz diye,

mesaj birleştirme:: 04 Ocak 2013, 01:17:09

video-2013-01-04-01-09-08

mesaj birleştirme:: 04 Ocak 2013, 01:55:57

Hocam bu şekilde oldu ama normalde çalıştırırken bunu kullanmıyorduk?
bunu kullanmadan çalıştıranlar da var ====>>>>> P1REN |= BIT3;
#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD; 
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL =  CALDCO_1MHZ;
  __delay_cycles(100000);
  
  P1DIR = BIT0;
  P1REN |= BIT3;
  while(1)
  {
     if(!(P1IN & BIT3))
        P1OUT |= BIT0;
     else 
        P1OUT &= ~BIT0;
  }
}

burak ozturk

hocam sanırım kartınız rev5, pull up direnci ile alakalı bir durum sanırım , bende iki launchpad var ikiside rev4 .eger rev5 ise sıkıntınız rev4 - 5 farkından kaynaklanıyor
happy coding.

metaltrrocker

Aynen bendeki ikiside rev5v.ikisinde de aynı durum var basta boyle bir sıkıntı olması 2 gunumu yedi resmen:-(
Bu arada bisey daha sormak istiyorum.
Kutudan cıkan kristali lehimlemezsek bi sorun olurmu tam olarak amacı nedir onun?kendi osilatorunden farkı nedir ne avantaj saglar bize?

burak ozturk

hocam lehimlemezseniz sorun olmaz ancak kendi osilatoru rc osilator, güzel çalışıyor sıkıntı yok malesef hassas zaman olayrından kullanamıyorsunuz zaten osilator ayarlarından sonra delay vermemizin amacıda osilatorun oturmasını beklemek . harici kristalin amacı (LFXT1) hem kararlı çalıştırmak, hem düşük güç modunda çalıştırmak, hemde hassas zaman uygulamalarında kullanabilmektir. tek dezavantajı var yüksek hızlı kristal kullanamıyorsunuz, hatırladıgım kadarıyla elinizdekinden (32.768 hz) den  yüksek hızda çalışmaması lazım. msp430 örnek programlarına bakarsanız sürekli olarak lpm bitleriyle oynandıgını sürekli düşük güç modunda çalıştırılmaya çalışıldıgını görürsünüz . msp430 clock kaynaklarını fatihinanc hocam cizgi tagem egitimlerinde detaylı olarak anlatmıştı. http://www.cizgi-tagem.org/seminar/about.aspx?id=29 buradan konu konu takıldıgınızda izleyebilirsiniz.
happy coding.

metaltrrocker

Evet dun basladımm cizgi-tagemdeki egitimleri izlemeye faydalılar bu konuda ama benim pic gecmisim olmadıgumı icin pek cok sey havada kalıyor.mesela kesme nedir ne amacla kullanılır?devreyi kodlarla kurduk birde gercj hayata gecirmek var.bu kısımlarda bildigim seyler yemiyor ogrenirkende sıkıntılar yasıyorum.basit bir pull up-down sorunsalı 2 gunumu yedi ornek olarak.

burak ozturk

hocam genel manasıyla kesme işlemcinin yaptıgı işi bırakıp kesme başlıgındaki programı işletip geri donmesidir.

hocam bir programınız oldugunu ve programınızın işlerken sürekli port okumak zorunda oldugunuzu düşünün, ikidebir aynı rutine gelmek yerine port kesmesinin kullanmak sizin için büyük bir rahatlık olacaktır . örnek vermek gerekirse ;

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD; //WATCHDOG DURDURMA RUTINI
  BCSCTL1 = CALBC1_1MHZ;//
  DCOCTL =  CALDCO_1MHZ;//
  __delay_cycles(100000);//OSC OTURSUN BEKLEMESI
  
 P1DIR = BIT6;//P1 BIT 6 CIKIS
 P1IE = BIT3;//P1 BIT 3 HARICI KESMERSI AKTIF
 P1IES = BIT3;//DÜSEN KENARDA KESME OLUSACAK
 P1IFG = 0X00;//P1 0N HICBIR KENARINDA KESME OLUSMAMIS
 
 __bis_SR_register(LPM4_bits + GIE);//LPM MODU 1MICROAMP CEKER AYRICA TUM KESMELER AKTIF
 
}

#pragma vector=PORT1_VECTOR//PORT 1 KESMESI HARICI KESME ADRESI
__interrupt void p1_isr(void)
{
   P1OUT ^= BIT6;//HER KESMEYE GELDIGINDE BIT6 YI TERSLE
   P1IFG = 0X00;//BAYRAGI SIFIRLAR
}


örnekte p1.3 tuşuna bastıgınızda programınız #pragma vector=PORT1_VECTOR altında çalışıp kesme bayragını sıfırladıktan sonra tekrar kaldıgı yere döner .bayragı sıfırlamaz iseniz programınız tekrar kesmeye girmeyecektir.


ya da bir programınız oldugunu düşünün, program içinde zamanlamaya dayalı işler yapmak istiyorsunuz ve aynı zamanda programım işlesin istiyorsunuz. sizin için sürekli olarak birisi arkada sayac işletmeli ; örnegin ;

#include "io430.h"

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;//wdt stop
  BCSCTL1 = CALBC1_1MHZ;//osc 1mhz
  DCOCTL = CALDCO_1MHZ;//osc 1 mhz
  __delay_cycles(10000);//osc oturtma rutini
  
  P1DIR = BIT0;//bit0 ÇIKIS
  P1OUT = 0X00;//P1 ÇIKISI0
  
  TA1CTL = TASSEL_1 + MC_1;//TASSEL BITI SAAT KAYNAGINI SECER 1 ACLK DIR, MC DE TMR CALISMA MODUNU SECER
  //MC_1 UP MODU GOSTERIR, DATASHHET DERKI AYAR YAPARKEN MC_0 YAP YANI TMRI KAPAT
  TA1CCTL0 = CCIE; //TMR INTERRUPT I ACIK
  TA1CCR0 = 32768-1;//32767 YE KADAR SAYACAK.

  __bis_SR_register(LPM3_bits + GIE);
 
}


#pragma vector=TIMER1_A0_VECTOR//INTERRUPT VECTOR TMR_A0 KARSILIGI
__interrupt void ta1_isr(void)
{
   P1OUT ^=BIT0;//BIT TERSLE
}


bu örnekte 32768 lik kristal yardımı ile p1.0 1 saniye yakılıp bir saniye söndürülüyor.

TA1CTL = TASSEL_1 + MC_1;//TASSEL BITI SAAT KAYNAGINI SECER 1 ACLK DIR, MC DE TMR CALISMA MODUNU SECER
  //MC_1 UP MODU GOSTERIR, DATASHHET DERKI AYAR YAPARKEN MC_0 YAP YANI TMRI KAPAT
  TA1CCTL0 = CCIE; //TMR INTERRUPT I ACIK
  TA1CCR0 = 32768-1;//32767 YE KADAR SAYACAK.


sayıcımız 32768 hz lik kristalle 32768 'e kadar saydıgı için 1 sn'lik periyodlar elde etmiş oluyoruz .

eğer bunu lfxt1 ile degil de dco yani dahili kristalimiz ile yapmaya kalsaydık ;

TA1CTL = TASSEL_2 + MC_1;//
  TA1CCTL0 = CCIE; //
  TA1CCR0 = 1000000-1;

 __bis_SR_register(GIE);


gibi birşey yapmamız gerekecekti ancak 1000000 degeri 16bit sınırına sığmadıgından bunu yapamayız.illa yapmak için kafa yormak zorunda isek bunun içinde kesme içerisinde sayac artrıtarak örnegin 100 kesmede bir sayac arttırarak bunu sağlıyacaktık.
happy coding.

metaltrrocker

Hocam tesekkur ederim etmeyi unuttum gercekten bu ise daldıgım icin:-)
Peki daha basit bi ornek kod varmı kodlar kafamı baya karıstırdı uzun oldukları icin:-)