TEKNİK YAZI

Tiva Not-4: Tiva LaunchPad, Osilatör Ayarları, IO Kullanımı

TIVA launchpad in özellikleri:

Tiva Launchpad daha önceki yazılarımızda da bahsettiğimiz gibi ti ın mikroişlemcileri ile çalışmaya başlamak için sunduğu düşük fiyatlı üzerinde In-Curcuit Debugger ıda bulunan harika bir kitidir. TI ın web sitesi üzerinden direk olarak 12.99 $ a temin edilebilir ve hiçbir kargo ücreti ödemeden direk olarak kapınıza teslim edilir. Tiva LP nin özelliklerine bakacak olursak.

2013-11-11 15_04_48-LP kullanım klavuzu.pdf - Foxit Reader

  • 64 pin 80 Mhz TM4C123GH6PMI Tiva işlemci
  • On Board USB ICDI
  • Micro AB USB PORT
  • Device/ICDI Power Switch
  • BOOSTERPACK XL sensör modülü ile birebir uyumlu pin çıkışları
  • 2 adet buton
  • reset butonu
  • 3 adet led
  • Akım ölçüm test noktası
  • 16 Mhz Kristal
  • 32 Khz RTC kristali
  • 3.3 V regülatör entegresi

 

İlk uygulamamız standart led yak söndür uygulaması olacaktır.

Bu ilk uygulama ile kullanılan kütüphane dosyalarını, osilatör ayarlarını, IO ayarlarını istediğimiz gibi yapmayı öğrenmiş olacağız.

İşlemcinin IO portlarının özelliklerini, tiva işlemcisinin IO portlarının ne gibi avantajları olduğunu burada konu fazla uzayacağı için anlatmıyorum. Çünkü ARM çekirdeğe sahip işlemciler ve çok fazla özellikleri bünyesinde barındırmakta. İncelemek için işlemcinin datasheet ine bakabilirsiniz.

Direk olarak kodumuza bakalım.

/////////////////////////////////////////////////////////////////////////
 
#include <stdint.h>
 
#include <stdbool.h>
 
#include "inc/hw_memmap.h"
 
#include "inc/hw_types.h"
 
#include "driverlib/sysctl.h"
 
#include "driverlib/gpio.h"
 
int main(void)
 
{
 
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
 
SYSCTL_OSC_MAIN);//Sistem osilatör ayaralar1 40 Mhz e ayarlandi.
 
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
 
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
 
while(1)
 
{
 
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 14);
 
SysCtlDelay(6725000);
 
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);
 
SysCtlDelay(6725000);
 
}
 
}
 
///////////////////////////////////////////////////////////////////////

 

Bu kodu yazıp önceki yazılarımızda belirttiğimiz ayarları yapıp yüklerseniz launchpad imizdeki RGB ledlerin tümü yanıp söner. 3 renk birleşmiş olduğundan dolayı beyaz bir ışık olarak görülür.

 

Kodumuzda yazdığımız her bir satırın ne ifade ettiğine bakabiliriz.

Kullandığımız kütüphane dosyaları:

#include <stdint.h> : Variable C99 tanımlamalarını tutar

#include <stdbool.h> Boolean c99 tanımlamalarını içerir

#include “inc/hw_memmap.h” Çevre birimlerinin base adreslerini içerir örneğin GPIO_PORTF_BASE

#include “inc/hw_types.h” ortak tanımlamaları ve makroları barındırır

#include “driverlib/sysctl.h” İşlemcinin sistemini kontrol eden tanımlamaları barındırır örneğin SysCtlClockSet and SysCtlClockGet

#include “driverlib/gpio.h” GPIO API si için direver tanımlamalarını  içerir örneğin: GPIOPinTypePWM and GPIOPinWrite

 

İşlemci Clock Ayarları:

İşlemciye bağlı main osilatör olarak 16 MHz kullanıldığında bu hız PLL aktif edildiğinde 400 MHz e çıkar. Tabi ki PLL direk olarak sistem clock unu beslemez. İşlemcinin datasheetinden clock diyagramı incelendiğinde PLL den sonra clock sinyalinin hangi aşamalardan geçtiği incelenebilir.

2013-11-11 08_50_19-LP workshop.pdf - Foxit Reader

Görüldüğü gibi siyah kalın çizgi yolu sistem clock unu taşımaktadır. Diyagramı fazla karıştırmadan basit olarak işlemci hızının ayarlanmasına bakalım. Kod üzerinden devam edecek olursak, sistem saatini ayarlamak için aşağıdaki kod satırı yeterli olmaktadır.

SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

Bu kod satırında 16 Mhz MAIN kristalin PLL ile birlikte kullanıldığı, SYSDIV tarafından 5 e bölünerek kullanılacağı belirtilmiştir.

Bu kod satırı ile 16 Mhz kristal PLL ile 400 MHz e çıkartılır, önce diyagramdaki gibi 2 ye sonra da SYSDIV tarafından 5 e bölünür ve 400/5/2= 40 MHz e sistem clock u set edilmiş olur. Şimdi bu sistem clockunun ayarlandığı api fonksiyonunun içerisine hangi değerleri set edebileceğimizi görelim.

 

2013-11-11 18_05_46-4- Tiva C serisi özellikleri Launchpad Özellikleri ve IO uygulamaa - Microsoft W

 

Uygulama uygulama ilerledikçe bu şekilde tüm fonksiyonların açıklamasını yapacağız inşaallah. Bu şekilde örneğin sık kullanılan fonksiyonların çıktısını alıp masanızın bir yerine asabilir ve kod yazarken datasheetlere git gel örnek uygulamara bak gel yapmazsınız. Ezberlenecek şeyler değil zira. Hatta tüm site yazarları olarak ezberlemeye tamamen karşı olduğumuzu da belirtmek isterim.

Osilatör ayarlarımızı yaptıktan sonra kullanacağımız IO portunu aktif ederek kullanacağımız pinleri çıkış olarak ayarlıyoruz.

2013-11-11 18_07_29-

 

2013-11-11 18_08_12-4- Tiva C serisi özellikleri Launchpad Özellikleri ve IO uygulamaa - Microsoft W

GPIO pinlerini set ettikten sonra sıra geldi while döngümüzü yazmaya.  Döngümüz basit olarak led i yak, bekle, ledi söndür, bekle ,ledi yak…. şeklinde olacağı için sadece iki çeşit komut kullanacağız. İlki pinlere yazma komutu. Kullanmakta olduğumuz api de belirtilen kodumuzu inceleyelim.

2013-11-11 18_08_53-4- Tiva C serisi özellikleri Launchpad Özellikleri ve IO uygulamaa - Microsoft W

Porta yazılacak değerin direk olarak maskelenerek porta yazılması güzel bir avantaj sağlamaktadır. Örneğin farklı işlemcilerde çalışırken portun ilk 2 pininde sonraki 3 pininde de mesela spi ile veri gönderdiğinizi düşünelim. Burada ledleri kontrol ederken spi iletişiminde bozulmalara neden olabilirsiniz.

SysCtlDelay(6725000); // satırı ile de yarım saniyeye yakın bir gecikme yapmış oluyoruz.

 

Led yak söndür uygulamamıza ek olarak bir de mevcut kodumuzun üstüne öğrendiklerimize binaen bir kaç satır ekleyip butona bastığımızda ledi yakıp söndürmesini isteyelim.

Launchpad in kullanım klavuzundan soldaki butonun yani SW1 in F4 pinine bağlı olduğunu görebiliriz.
2013-11-11 15_59_00-LP kullanım klavuzu.pdf - Foxit Reader2013-11-11 17_26_13-LP kullanım klavuzu.pdf - Foxit Reader

 

Şematik çizimi incelediğimizde ise butona bastığımız zaman işlemciye 0 bilgisinin gideceğini görüyoruz. O halde kodumuzu düzenlersek;

#include <stdint.h>
 
#include <stdbool.h>
 
#include "inc/hw_memmap.h"
 
#include "inc/hw_types.h"
 
#include "driverlib/sysctl.h"
 
#include "driverlib/gpio.h"
 
int x;
 
int main(void)
 
{
 
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|
 
SYSCTL_OSC_MAIN);
 
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
 
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
 
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4);
 
while(1)
 
{
 
x=GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4);
 
if(x!=0)
 
{
 
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 14);
 
SysCtlDelay(6725000);
 
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x00);
 
SysCtlDelay(6725000);
 
}}}
 
///////////////////////////////////////////////////////////////////////

 

Şeklinde kodumuzu tamamlıyoruz. Yani F4 pininden 0 verisi geldiğinde ledlerimizi yanıp sönecek. Kodumuzu sorunsuz derleyip LP e yüklüyoruz. Kodun çalışması için reset butonuna bastığımızda görüyoruz ki kodumuz hatalı çalışıyor. Sadece bastığımızda yanıp sönmesi gereken led sürekli olarak yanıp sönmeye devam ediyor. Acaba neden??? Sorun nerde?? Kodda hata da yok…

Bir sonraki yazımızda….

(Biz de kendi çapımızda heyecan yapmaya çalışıyoruz napalım 🙂 )