if içinde veya kullanımı

Başlatan konjuge, 27 Nisan 2011, 00:56:22

konjuge

arkadaşlar çok basit bir program yazmaya çalışıyorum ama bir türlü beceremedim elimde msp430 launchpad kit var. iki farklı düğme için if koşulu çalıştırmak yazmaya çalıştığım program şu;
#include "msp430G2211.h"

void main(void)
{
 WDTCTL = WDTPW + WDTHOLD;  // Stop WDT

 P1DIR  |= 0X77;             // P1.3, P1.7 giris
 P1SEL |= BIT2;             // P1.2 to TA0.1

 CCR0 = 1000-1;             // PWM Period
 CCTL1 = OUTMOD_7;          // CCR1 reset/set
 CCR1 = 250;                // CCR1 PWM duty cycle
 TACTL = TASSEL_2 + MC_1;   // SMCLK, up mode
 BCSCTL1= CALBC1_1MHZ; //DCOCLK 1MHZ Seçiliyor...
  DCOCTL = CALDCO_1MHZ;
 

  while(1)
  {
     if ((P1IN & 0x80)|| P1IN & 0x08) P1OUT   &= ~0x01;       // if P1.4 set, set P1.0
     else P1OUT |= 0x01;                    // else reset
   
    
 

}
}


yani P1.3  veya P1.7 deki butonlardan birine basıldığında bir led'i yakmak istiyorum.. beceremedim :D

iyildirim

msp' leri pek bilmem.
Sanırım şu haliyle led sürekli yanıyor yada pin HIGH'da.

Söndürmek için AND maskelemesini 0xfe ile yapın..

konjuge

Alıntı yapılan: iyildirim - 27 Nisan 2011, 02:13:18
msp' leri pek bilmem.
Sanırım şu haliyle led sürekli yanıyor yada pin HIGH'da.

Söndürmek için AND maskelemesini 0xfe ile yapın..

bu işlerde oldukça acemiyim o yüzden ne demek istediğinizi anlayamadım  :(

iyildirim

Bu tip işlemler için maskeleme işlemlerini, bit bazında AND, OR, XOR gibi operatörleri öğrenmelisin.

Bir değişkenin diğer bitlerini etkilemeden sadece istediğimiz bitlerini  1 yapmak için bit bazında OR  kullanılır.  Tersi için  resetlemek sıfırlamak içinde AND kullanılır.

İkili sistemde yazarsak

0b101010100  'ı  0b101010101  yapmak istersek , yani sadece sıfırıncı biti 1 yapmak için

0b101010100  |  0b00000001   (P1OUT |= 0x01;)  ile OR işlemine tabi tutulur. Sonuç ta 0b101010101 olur


tersine için de ;
0b101010101 ı 0b101010100 yapmak istersek, yani biti sıfırlamak istersek

0b101010101 &  0b11111110  (P1OUT &= 0xfe;) ile AND işlemine tabi tutulur. Sonuçda 0b101010100 olur.


Eğer değişken veya port 8 bit değilde 16 bit ise AND maskelemesi de 0xFFFE ile yapılmalı.


konjuge

ayrıntılı açıklama için teşekkür ederim deneyip sonuçları buraya yazıcam

konjuge

arkadaşlar yazmak istediğim programı yazdım son haline geldi. program tam olarak LMD18200 entegresini sürme kapasitesine sahip buyrun;
#include  <io430g2231.h>
#include "in430.h"

// Motor 

#define Motor_yon P1OUT_bit.P1OUT_5

#define fren P1OUT_bit.P1OUT_6


// anahtarlar

#define ileri P1IN_bit.P1IN_3

#define geri P1IN_bit.P1IN_4



int main( void )

{

WDTCTL = WDTPW + WDTHOLD; //  watchdog timer durdur
  P1DIR = 0xE7;           // girisler cikislar.
                  
  P1SEL = BIT0;                            // P1.0 PWM çıkışı
  CCR0 = 999;                               // PWM T/2
  CCTL1 = OUTMOD_6;                         
  CCR1 = 500;                                // CCR1 PWM duty cycle
  TACTL = TASSEL_1 + MC_3;                  // ACLK, up-down mode



// motorun dönüs yönünü belirleyen degiskenler

Motor_yon =1;
fren = 0;



while (1){

if(ileri==0 && geri ==1 )   // anahtar 01

{Motor_yon = 0; fren = 0;} // geri

else if(ileri==1 && geri ==0) // anahtar 10

{Motor_yon = 1; fren = 0;} // ileri

else if(ileri==0 && geri ==0)// anahtar 00

{fren = 1;}// fren

else if(ileri==1 && geri ==1)
{ fren = 1;} // fren

}



}


şu an kitte çalışıyor ama yinede bir hata görürseniz söyleyin düzelteyim.

atioky_216

bende su operatorleri anlayamamıstım hemen deneyeyim