Delphi Can

Orjinalini görmek için tıklayınız: TIVA TM4C123G ile LED YAK SÖNDÜR
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
BOŞ PROJE Oluşturma isimli makalemizin hemen devamı olan bu konumuzda LED YAK SÖNDÜR TIVA örneğimizi ele alacağız. Bu anlatacağımız konular bundan sonraki hemen hemen tüm TIVA elektronik kodlama işlemlerinde temel olacaktır. Yani ARM programlama başlıyor.  Smile

TIVA yı aşağıda resmi görülen ALTLIK ile birlikte kodlama yapıp dış dünya ile konnektörlerindeki vidalar ile bağlantılarını saatçi tornavidasını kullanarak yapacağız. Bu altlıkta DIŞ dünyaya çıkartılmış 35 Adet AKTİF PIN vardır. isimleri ALTLIK taki plaket üzerinde F1, F2 gibi yazılarla PORT ve PIN isimleri belirtilmiş ayrıca GND ile de TIVA'nın EKSİ uçları çeşitli konnektörlerden dış dünyaya çıkartılmıştır. Kısaca bizim ELEKTRONİK (ROBOTİK) KODLAMA alt yapımızda bu KART'ımızı (kod adı USCO-01) kullanacağız.

[attachment=864]

ARM KEIL proje yöneticisinden, hello.c dosyasını SOL taraftaki pencereden çift tıklayarak EDITOR penceresinde açalım. ilk 1-24 satırlar proje ile alakalı bilgilendirme ve yasal yayın hakları bilgilendirmeleri vardır. Bu HELLO "Merhaba Dünya" projesi TIVA kartımızdaki MAVİ LED'i 1 sn süre ile YAKIP, 1 sn süre ile SÖNDÜRME işlemini yapar. Aynı zaman da her RESET düğmesine basıldığında da, USB kablosu üzerinden MCU'dan PC'ye doğru "Helloi World" yazısını gönderir ve hemen arkasından MAVİ LED'i birer saniye aralıklarla yakıp söndürür.

Arkadaşlar ARM programlama da hangi proje olursa olsun size tavsiyem okuma yorumlama işlemine İLK satırlardan devam eden satırlara doğru okumaya veya anlamaya çalışmayın. PROJE yöneticisindeki (Sol Pencere) sekmelerden {}Function sekmesini açarak projeye DAHİL olan DOSYA lardaki methodları (procedure veya fonksiyon) açarak ilk çalıştırılacak olan main (void) metodundan itibaren okumaya - anlamaya başlayınız.

[attachment=863]

Karşımıza gelen ilk komuttan itibaren kodlamayı anlamaya çalışalım.

// MCU içinde REAL sayılarla ondalıklı (virgüllü) işlemler yapmaya izin ver.
ROM_FPULazyStackingEnable();  

// Ana kristal kullanılarak PLL ile 200 MHz üret. Sonra bu 200 MHz'i 4' böl. MCU'yu 50 MHz de çalıştır.
ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

// TIVA kartının üzerinde bulanan kullanıcı LED'lerini GİRİŞ/ÇIKIŞ işlemleri için KULLAN. Burada F Portu seçildi.
// F1,F2,F3 USCO-01 altlık kartımızda DIGITAL OUTPUT kategorisinde konnetörü ile birlikte çıkartılmıştır.
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

// F portuna ait 2.PIN'i ÇIKIŞ olarak AKTİF et. GPIO = Generel Pupose Input Output demektir. Genel amaçlı giriş çıkış.
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);

// UART ayarlarını gerçekleştir. Bu adımdan sonra İNCELEMEYE-ANLAMAYA hemen UART metoduna giderek devam ediniz. Çünkü MCU da böyle yapacak. Makale olarak yazdığımız için UART metodunu MAIN metodundan önce yazmamız gerekirdi. Ama hiyerarşiyi bozmamak adına UART metodunu aşağıda yazmaya devam edeceğim.
ConfigureUART();

void ConfigureUART(void) 
{
   // UART (Seri Port işlemleri) kullanılacak PORT'u SEÇ
   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

   // UART0'ı SEÇ (0'dan 7'ye kadar 8 adet var..
   ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

   // UART0 için Receive ve Transmit (RX, TX) PORT VE PIN'leri NE OLSUN?
   ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
   ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
   ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

   // Ana osilatör olan 16 MHz kristali kullan. PUTTY terminal yazılımı ile 115200 Baud ve 8N1 ayarları ile PC ye bağlan.
   UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);

   UARTStdioConfig(0, 115200, 16000000);
}

 // MCU'dan PC'ye "Merhaba Dünya" bilgisini gönder ..
 UARTprintf("Hello, world!\n");

  // Sonsuz döngüyü başlatma komutu ..
  while(1) 
    
  // Sonsuz döngü BLOK başı..
  {
        // MAVİ LED'i yak
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);

        // Bir BIT bekle (50.000.000 / 10 / 3) 
        SysCtlDelay(SysCtlClockGet() / 10 / 3);

        // MAVİ LED'i söndür
        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);

        // Bir BIT bekle (50.000.000 / 10 / 3) 
        SysCtlDelay(SysCtlClockGet() / 10 / 3);
  
  // Sonsuz döngü BLOK sonu..
  }

Böylece LED YAK SÖNDÜR uygulamasını anlamaya yorumlamaya çalıştık.


25 ve 36. satırlar arasında ise projeye dahil (include) edilen kütüphanelerin listesini verelim. Bu liste hemen hemen tüm uygulamalarda standart olarak kullanılır.

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"



Son olarak tüm KODLAMA nın tamamını verelim.

Kod:
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"

//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif

void ConfigureUART(void)
{
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
  ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
  ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
  ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
  UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
  UARTStdioConfig(0, 115200, 16000000);
}

int main(void)
{
  ROM_FPULazyStackingEnable();
  ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
  ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);

  ConfigureUART();

  UARTprintf("Hello, world!\n");

  while(1)
  {
      GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
      SysCtlDelay(SysCtlClockGet() / 10 / 3);
      GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
      SysCtlDelay(SysCtlClockGet() / 10 / 3);
  }
}
Elinize sağlık hocam. Keil ve IAR bana hep karmaşık geldiği için uzak durmuşumdur. Biliyorsunuzdur Texas ın kendi Code Compiller Studio su (CCS) var. Bir iki tane projede CCS arayüzü daha sıcak geldiği için geliştirmeye IAR yerine CCS yi tercih etmiştim.

Sizilerin şu konudaki düşünce ve tecrübenizi merak ediyorum. Üniversal geliştirme ortamlarımı (iar, keil..vb) kullanılmalı, yoksa mcu üreticilerin kendi geliştirme ortamınımı (Texas için ccs, microchip için mplab... vb) kullanmayı tavsiye edersiniz.
(08-12-2019, Saat: 16:14)frmman Adlı Kullanıcıdan Alıntı: [ -> ]Elinize sağlık hocam. Keil ve IAR bana hep karmaşık geldiği için uzak durmuşumdur. Biliyorsunuzdur Texas ın kendi Code Compiller Studio su (CCS) var. Bir iki tane projede CCS arayüzü daha sıcak geldiği için geliştirmeye IAR yerine CCS yi tercih etmiştim.

Sizilerin şu konudaki düşünce ve tecrübenizi merak ediyorum. Üniversal geliştirme ortamlarımı  (iar, keil..vb)  kullanılmalı, yoksa mcu üreticilerin kendi geliştirme ortamınımı (Texas için ccs, microchip için mplab... vb) kullanmayı tavsiye edersiniz.

Kesinlikle universal olanı nı tavsiye ederim. Temel mantığımız aslında programlama dil IDE seçiminde de aynı mantık olmalı. Microsoft'un programlama dillerine yaklaşımını bir düşünün. Sadece kendi framework'unu kullanma yönünde dolaylı baskı yapıyor. Ama bizler daha esnek daha etraflıca bir programlama dili olan DELPHI'yi tercih ediyoruz. Aynı mantıkla bir firma sadece kendi ürettiği bir ürüne destek veren bir IDE kullanırsan senin üretkenliğin CREATIVE liğin ne olacak ??? Sadece o firmaya çalışan bir eleman olacaksın. Belki de bize de Delphi'yi tercih ettiğimiz için Embarcadero'nun elemanımısınız diyecekler ama, Delphi için üretilen componentler, multi platform, multi UI vs gibi yüksek teknolojileri kullandıran ve arka planda DLL olmayan bir yapısı var. Aynı mantıkla da diyebilirim ki CCS yerine KEIL kullanmak bana daha mantıklı geliyor. CCS sadece kendi ARM larına destek veriyor ama Alman ürün KEIL ve Japon ürün IAR tüm MCU lara destek veriyor. Özgünlüğün had safhada. Bazen derler ki alışkanlıklardan vazgeçmek zordur. Ben buna pek katılmıyorum. İnsanoğlu nice alışkanlıklara alışıyor, nice türlü türlü alışkanlıklar ediniyor pek çok örnekleri var. Sadece tembelliğimizden bu tarz cümleler kuruyoruz. 

Uzak durduğundan bahsediyorsun, eğer devam edersen diğer forumda Gömülü Sistem'de Delphi ile SCADA bileşenleriyle ARM kodlamaya geçmeyi planlıyoruz. O konular biraz daha heyecan vericidir. İçindeki istek sönmesin. Kolay gelsin kardeşim.
(08-12-2019, Saat: 16:43)guverdik Adlı Kullanıcıdan Alıntı: [ -> ]Uzak durduğundan bahsediyorsun, eğer devam edersen diğer forumda Gömülü Sistem'de Delphi ile SCADA bileşenleriyle ARM kodlamaya geçmeyi planlıyoruz. O konular biraz daha heyecan vericidir. İçindeki istek sönmesin. Kolay gelsin kardeşim.

Cevabınız ve tavsiyeleriniz için teşekkürler hocam. Bahsettiğiniz heyecan küçüklüğümden beri devam ediyor. Editör ve kod geliştirme ortamını sevmeyince uğraşmak gelmiyor insanın içinden. Sizin sayenizde ve teşvikiniz ile keil'e (kendime) bir şans vereyim Smile
Diğer konudaki paylaşımlarınızı merakla bekliyorum.