CC430F TI mimari alıştırma turları

Başlatan Eren Eraslan, 02 Ağustos 2013, 15:00:12

Eren Eraslan

ccs alıştırma turlarının bir yenisi de ti mimarisi ve yazılımı için gelsin. Bu başlık altında daha önce bilmediğim ve internetten araştırıpda öğrenemediğim şeyleri sormak istiyorum. texas işlemcileriyle haşir neşir olan arkadaşlara çok basit ama bana şimdilik kompleks gelen sorulara cevaplarınız için şimdiden teşekkür ederim

şimdi ilk soruma gelicek olursak bitwise işlemlerinde oldukça kötüyüm ccs sağolsun , ama bir mühendis adayının bu konuda eksiksiz bilgiye sahip olması gerek sonuçta. TI CCS derleyicinde maşallah herşey bit işlemleriyle dolu aslında keyifli gibi ama anlayana :)
if (BIT4 & P1IN)
      P1OUT |= 0x01;                        // if P1.4 set, set P1.0
    else
      P1OUT &= ~0x01;                       // else reset


burda sanırım butona basılıp basılmadığını kontrol ediyor. o if içindeki koşul nasıl bir mantıkla kıyaslanıyor tam anlamadım bit4 dediği şey 1 mi 0 mı  p1out |=0 0x01; nasıl oluyor cidden anlamadım
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

burak ozturk

https://www.picproje.org/index.php/topic,44436.0.html

eren hocam dediginiz gibi P1.4 e buton kontrolu yapılmış ,basılı ise P1.1 den çıkış verilmiş.
happy coding.

MrDarK

Bende senin gibi bu ara Ti'ye sardım yakında MSP kitim geliyor oradada benzer algoritmalar olacaktır.

Ben anladığımı söyleyeyim o fonksiyondan ;

Link : http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/java/ch06/bitwiseOperators.pdf

Bu linkten bitwise işlemlerini inceleyebilirsin.

(BIT4 & P1IN) // Bit 4 ya 0 yada 1 değeri alabilir , burada P1IN yazarak direk p1portunu okuyor. bunu pic ve css kodu olarak düşünecek olursak
sonuc 0 veya bir değeri verir.


(input(pin_b3) & input(port_b))  sonuc 0 veya 1 değeri verir

P1OUT |= 0x01;    // P1 pinlerinin diğer pinlerine müdahale etmeden sadece 0x01 ile veya işlemine tabi tutar bu durumda p1.0 1 olacaktır.

bizim ccs'de output_high(pin_b0) kodunun asıl kullanılmış şeklidir. (ayrıca üniversal kullanım halidir)

P1OUT &= ~0x01;   // Bu koddanda anlaşıldığı üzere ~0x01 demek => 1111 1110 demektir. Bunu P1 portu ile çarpma işlemine tabi tutuyor haliyle sadece bu çarpım sonucundan P1.0 pini etkilenir çünkü sadece onun biti 0'dır. Çarpmada 1 ile herhangi bir bitin çarpımı bitin o anki kendi değeridir zaten.

Sanırım bu açıklamalar yeterli giriş için :)
Picproje Eğitim Gönüllüleri ~ MrDarK

Gökhan BEKEN

#3
Alıntı yapılan: ereneraslan7 - 02 Ağustos 2013, 15:00:12

if (BIT4 & P1IN)
      P1OUT |= 0x01;                        // if P1.4 set, set P1.0
    else
      P1OUT &= ~0x01;                       // else reset

ve işlemi yapılıyor sonuç true ise yani 0 dan farklı bir sayı ise P1.4 set ediliyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

Eren Eraslan

Alıntı yapılan: burak ozturk - 07 Ocak 2013, 20:28:21



/*-------------------------------------------------------------------------
 *   Standard Bits
 *-------------------------------------------------------------------------*/

#define BIT0                (0x0001)
#define BIT1                (0x0002)
#define BIT2                (0x0004)
#define BIT3                (0x0008)
#define BIT4                (0x0010)
#define BIT5                (0x0020)
#define BIT6                (0x0040)
#define BIT7                (0x0080)
#define BIT8                (0x0100)
#define BIT9                (0x0200)
#define BITA                (0x0400)
#define BITB                (0x0800)
#define BITC                (0x1000)
#define BITD                (0x2000)
#define BITE                (0x4000)
#define BITF                (0x8000)


bu sebeple aslında

P1OUT |= BIT0;
P1OUT &= ~BIT0;

komutları ile P1OUT 'u 1 ile OR layıp , 1 in değili ile AND lemiş bulunuyoruz .

hocam bu define ların ne gibi katkısı var peki? and leyip or larken hep bu önceden tanımlanmış bitlere göremi yapmamız gerekiyor

if (0b00010000 & P1IN)


şeklinde kullanabilirmiyiz
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

burak ozturk

kullanırsınız hocam sıkıntı olmaz defineleri yazım kolaylığı için iar kütüphanesinde tanımlamış, bir süre sonrada alışkanlık yapıyor direk bit0 , bit1 diye yazmaya başlıyorsunuz ancak iyi mi kötü mü pek bilemedim çünkü code composer studio ile yazmaya kalksanız orda bu tür tanımlamalar yok.
happy coding.

Eren Eraslan

peki bu iki satır ne anlama geliyor?

  __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4 w/interrupt
  __no_operation();                         // For debugger
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

burak ozturk

hocam siz sanırım code composer studio kullanıyorsunuz bit tanimlamalari sadece iar de gecerli diye biliyorum muhtemel elinizdeki ornekler iar de yazılmış



  __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4 w/interrupt
  __no_operation();                         // For debugger


hocam msp işlemcileri enerji tasarruflarıyla unlü oldugu üzere, kullanmadıgınız donanımları kapatarak işlemciyi tasarruf moduna alıyorsunuz

Alıntı Yap
LPM0 - The CPU is disabled.

LPM1 - The loop control for the fast clock (MCLK) is also disabled.

LPM2 - The fast clock (MCLK) is also disabled.

LPM3 - The DCO oscillator and its DC generator are also disabled.

LPM4 - The crystal oscillator is also disabled.



GIE ise tum interrupt ları açmanızı saglıyor.

  __no_operation();     için ise herhangi bir fikrim yok daha önce karşılaşmadım :)
happy coding.

berat23

P1IN register'ı p1 portu giriş register'ı oluyor. hangi bit okunacaksa o bit maskeleniyor,oradaki and işlemi bu sebepten. hangi derleyiciyi kullanırsanız kullanın bu yazım geçerli. önemli olan bu P1IN gibi adeslerin tanımlı olması.

__no_operation();  ise bildiğimiz nop komutu,yani "no operation" ,kabaca bekleme,boş cycle geçirme komutu.

aslında konuya girme amacım bir yanlışı düzeltmekti. bu mimari kelimesi çok yanlış kullanılıyor. işlemci için mimari demek aslında nasıl çalıştığıdır,yani komut setidir. c ile mcu programlarken cpu mimarisi ile pek alakanız olmuyor. böyle heryerde mimari demek doğru değil. işlemcinin komutları fetch-execute etmesi,pipeline,aritmetik açıdan veriyolu,komut seti gibi konular mimariye giriyor,mcu peripheral'ları değil. bu hata size has değil,bakıyorsunuz internette adam mcu dersi veriyor,16bit mimari diyor,sonra adc,timer anlatıyor. genel bir yanlışı söylemek istedim.

http://en.wikipedia.org/wiki/Microarchitecture

Eren Eraslan

peki bu clock olayı nasıldır ? 3 farklı clock mevcut ben hangisini kullanıcam dışarıdan kaç mhz lik kristal destekliyor?
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan

burak ozturk

#10
fatih inanç hocanın blogundan alıntı ;

Alıntı Yap

Bu yazımızda MSP430′un Clock modülünden bahsedeceğiz. MSP430 düşük-güç bir mikrodenetleyici olduğu için buna uygun çeşitli saat birimlerini barındırmakta. Bu birim eğer uygum amaca göre kullanılırsa elde edilebilecek güç tasarrufu hiç de küçümsenecek cinsten değil.Mesela osilatör olarak dahili VLO (Very Low Power Oscillator) kullanılırsa, bu birimini harcadığı akım yaklaışık 0.8uA dir. Bu, fazla hız gerektirmeyen uygulamalarda taşınabilir cihazlar için saatlerce pil ömrü demektir.


MSP430′da genel olarak üç, bazı modellerde ise dört adet osilatör seçeneği bulunuyor. Bu üç osilatörden ikisi dahili, biri harici olarak çalışmaktadır. Bunlar;

DCOCLK(Digitally Controlled Clock) : Her modelde bulunan dahili RC osilatördür.
VLOCLK(Very Low Power Clock) : Dahili, düşük frekanslı (12 Khz) RC osilatördür.
LFXT1CLK(Low Frequency/High Frequency External Clock) : Bu modül adından da anlaşılabileceği gibi hem düşük frekanslı osilatörlerle hem de yüksek frekanslı osilatörlerle çalışabilmektedir. 32,768 Khz lik saat kristali kullanılabilir, ayrıca 400Khz den 16 Mhz e kadar harici kristal ile çalışabilmektedir.
XT2CLK(High Frequency Crystal Clock) : Bu modülün LFXT1'den farkı sadece yüksek frekanslı osilatör seçeneklerini desteklemesidir.Her modelde yoktur. Bazı modellerde ekstradan dördüncü osilatör seçeneği olarak yer alır.
MSP430 ile kullanılabilecek çeşitli osilatör seçeneklerini gördük. Şimdi biraz daha özele inip bunların ne şeklilde kullanıldığını inceleyelim. Bu osilatörlerde kullanım amacımıza göre değişebilen üç farklı seçenek bulunmaktadır.

MCLK(Master Clock) : CPU biriminin kullandığı işaret kaynağıdır. Bu birimde 1, 2, 4 ve 8 e bölebileceğimiz LFXT1CLK, XT2CLK, DCOCLK ve VLOCLK ana osilatör olarak kullanılabilir.
ACLK(Auxiliary Clock) : Diğer çevrebirimlerin kullandığı işaret kaynağıdır. Yazılımla 1, 2, 4 ve 8 e bölünebilir. LFXT1CLK veya VLOCLK seçilebilir.
SMCLK(Sub Main Clock) : Bazı çevrebirimlerin kullandığı işaret kaynağıdır. Yine yazlımla 1, 2, 4 ve 8 e bölünebilen LFXT1CLK, VLOCLK ve XT2CLK kaynakları seçilebilir.


http://www.youtube.com/playlist?list=PLfcIZXsDLA18YNXnFTyq7KrocjPpUJeh3

Alıntı Yap


bu arada çizgi tagem msp430 dersleri
happy coding.

Eren Eraslan

herkese kolay gelsin , texas işlemcileriyle baya haşir neşir oldum i2c kodlarıyla cebelleşiyorum , kafamın karıştığı birkaç nokta var kodlar üzerinde göstermek yardımlarınızı almak istiyorum


alttaki kodda anlayamadığım "while (UCB0CTL1 & UCTXSTP);   " komut satırı ..  UCB0CTL1 registerıyla UCTXSTP bytı or luyor yani ikiside 1 olursa while ın içine giriyor ..bu kod eğer stop condition gönderilirse while ın içine gir demek değil mi ?  bir register ile UCTXSTP byte ı nasıl kıyaslıyor anlayamıyorum . kaldi ki i2c başlaması için start gönderilmesi gerekmiyor mu ? bu koda göre start gönderilmesi için stop gönderilmesi gerekiyor ama stop gönderen bir durum yok ?


  while (1)
  {
    TXByteCtr = 1;                          // Load TX byte counter

    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
   
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/ interrupts
    __no_operation();                       // Remain in LPM0 until all data
                                            // is TX'd
                                              
    TXData++;                               // Increment data byte
  }
}
insanın içine işleyen şarkılar ;  https://soundcloud.com/reeraslan