ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama TUNA AYAN www.tuna-ayan.com tunayan@gmail.com
Clock Ayarı TIMER Modülü ADC Modülü UART Haberleşme Protokolü BAŞLAMADAN ÖNCE Clock Ayarı TIMER Modülü ADC Modülü UART Haberleşme Protokolü
Sistemin çalışma hızını belirleyen kısımdır. CLOCK AYARI Sistemin çalışma hızını belirleyen kısımdır. LM3S811 maksimum 50MHz hızına ulaşabilmektedir. LM3S811 üzerinde 2 adet osilatör vardır. İnternal osc ve Main osc olarak adlandırılır. Main OSC 1-8 MHz hızındadır. Internal OSC ise 12MHz Hızındadır. Boot anında her zaman Main OSC çalışır.
Bütün OSC kaynakları PLL(Phase Locked Loop) destekler. CLOCK AYARI Bütün OSC kaynakları PLL(Phase Locked Loop) destekler. PLL 200MHz hızında sanal clock üreten bir bloktur. Hız belirlendikten sonra Sistem saati , PWM saati ve ADC saati olarak kullanılabilir. Sistemin desteklediği maksimum frekansın üstünde bir frekans ayarlandığı takdirde clock fail oluşur. ADC saati sabit bir bölücüye sahiptir. ADC Modülünü 16.667 MHz ile sürebilmek için PLL kullanılması zorunludur.
Tek girişli yapı kullanıldığı takdirde OSC1 üzerinden clock alınır. CLOCK AYARI PLL Kullanımı: OSC1 ve OSC2 osilatör kaynaklarıdır. Bunlar kristal ya da tek girişli(single ended) saat üreteci olabilirler. Kristal kullanıldığı takdirde OSC1 ve OSC2 bacaklarına kristal bağlanır. Tek girişli yapı kullanıldığı takdirde OSC1 üzerinden clock alınır.
Desteklemediği frekans değerlerinde hatalı sonuçlar üretir. CLOCK AYARI PLL Kullanımı: PLL 200MHz ile çalışabilmek için spesifik ve net frekans değerlerini osilatör kaynaklarından ister. Desteklemediği frekans değerlerinde hatalı sonuçlar üretir.
StellarisWare İle PLL Kullanımı : CLOCK AYARI StellarisWare İle PLL Kullanımı : Öncelikle osilatör kaynağını seçiyoruz. (SYSCTL_OSC_MAIN) 20 Mhz clock üretebilmek için PLL destekleyen bir osilatör kaynağı hızını sisteme göstermemiz gerekir. (SYSCTL_XTAL_6MHZ) PLL seçildikten sonra 200MHz frekans üretecektir. Bunu maksimum frekans aralığına çekiyoruz. 200/10 = 20 MHz SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
Timer(zamanlayıcı) Hakkında: TIMER MODÜLÜ Timer(zamanlayıcı) Hakkında: İşlemci içerisinde zamanlama gerektiren uygulamalarda kullanılır. LM3S811 üzerinde Timer Modülü 3 adet blok halinde ifade edilir.(Timer1 Timer2 Timer3) Her bir blok içerisinde 16-bit iki adet sayaç bulunur.(TimerA TimerB) Başka bir modülü tetiklemek için, capture(yakalama) yapabilmek için ve PWM oluşturmak için kullanılabilir.
16-bit input capture (giriş sinyali yakalama) modu TIMER MODÜLÜ Timer Modları: 32-bit sayıcı modu 16-bit sayıcı modu 16-bit input capture (giriş sinyali yakalama) modu 16-bit PWM modu vardır. Mod Özellikleri: One-shot timer: 1 kerelik çalışan sayaçtır. Sayaç sıfırlandıktan sonra bir dafa devam etmez. Periodic timer: periyodik olarak çalışır. Sıfırlandıktan sonra saymaya devam eder.
Stellaris İle Timer Kullanımı: Algoritma: TIMER MODÜLÜ Stellaris İle Timer Kullanımı: Algoritma: Timer Modülü içerisinde kullanılacak blok aktif hale getirilir. SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); Timer bloğu özellikleri belirlenir. TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |TIMER_CFG_B_PERIODIC); TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR |TIMER_CFG_B_ONE_SHOT); Sayaç değeri belirlenir. TimerLoadSet(TIMER0_BASE, TIMER_B, SysCtlClockGet() / 1000); SysCtlClockGet() = 1 saniyede yaptığı işlem sayısını bize veriyor => bu sayıyı 1000 e bölersek 1ms lik zaman dilimini elde ederiz. İnterrupt varsa aktif edilir ve ayarlanır. Ne zaman tetikleneceği belirlenir. IntEnable(INT_TIMER0B); TimerIntEnable(TIMER0_BASE, TIMER_TIMB_TIMEOUT); Timer açılır TimerEnable(TIMER0_BASE, TIMER_B);
ADC (Analog to Digital Converter) Nedir? ADC MODÜLÜ ADC (Analog to Digital Converter) Nedir? Analog verilerin dijital ortamda referanslarının tanımlanmasını sağlayan modüldür. Voltaj ya da akım değerlerini dijital ortamda ifade edebilmemizi sağlar. Çözünürlüğüne göre hassasiyeti ayarlanabilir. LM3S811 10-bit çözünürlüğe sahiptir.
LM3S811 ADC Modül Özellikleri: 10-bit Çözünürlüğe sahiptir. 0-3V referansı vardır. 0V => 00 0000 0000 3V => 11 1111 1111 => 0x3FF 4 adet analog girişe sahiptir. Tek girişli(single ended) ve çok girişli(differential) hesaplamalar yapılabilir. Saniyede 500k örnek alabilir. Dahili(On-chip) sıcaklık sensörüne sahiptir.
LM3S811 ADC Modül Özellikleri: Timer, PWM, GPIO ve interrupt ile kolayca tetiklenebilir. FIFO(First In First Out) mantığına göre çalışır.
ADC Modül Çözünürlüğü: Adc modül çözünürlüğü: 10-bit Referans Voltaj: 0-3V Örnek 1: Vin: 2.5 volt 2 10 =1024 => 0-1023 3 1023 =2.9 x 10 −3 2.5 2.9 x 10 −3 = 852.5 => 853 => 0x355 Örnek 2: Vin: 3cos(wt) 6 1023 =5.86 x 10 −3 (Bu sefer negatif değerlerde göz önünde bulundurulacaktır)
Tek girişli(Single Ended) mod: ADC MODÜLÜ ADC Modül Modları: Tek girişli(Single Ended) mod: Bu mod seçildiği takdirde tek bir analog giriş değeri okunur ve dijital referansı çıkartılır. Örnek: 0-3volt referansımız var olduğunu düşünelim 1.5volt giriş bize 0x200 sonucu verecektir. (0x3FF değerinin yarısı) Diferansiyel(Differential) mod: Bu modda 2 adet giriş kullanılır ve bu girişlerin farkı dijital ortamda yorumlanır. Örnek: ilk giriş sinyalimiz 2.5volt olsun. İkinci giriş sinyalimiz ise 1.75 volt olsun bu sefer; 2.5 – 1.75 = 0.75 => 0x100 sonucunu verecektir.
ADC Modül Nasıl Çalışır: Sequence(dizi) tabanlı çalışır. Her bir sequencer(dizi elemanı) kendi içinde ayrıca tetiklenebilir, ayarlanabilir ve kendi aralarında öncelik sırasına göre düzenlenebilir. LM3S811 üzerindeki ADC modülde 4 adet sequencer bulunur. Bir birleri ile aralarında step sayıları farkı bulunur.
ADC Modül Nasıl Çalışır: Örnek: Sequencer 1 TIMER ile tetiklenirken sequencer 3 işlemci ile tetiklenecek şekilde ayarlanmıştır. 3 adet analog giriş kullanılmıştır. Chip üzerinde bulunan sıcaklık sensör verisi okumak için ayarlama yapılacaktır.
StellarisWare Algoritması: ADC modül aktif hale getirilir. SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); Kullanılacak örnekleme ayarlanır. SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS); Ayarlamaları yaparken yanlış örnekleme almaması için sequence(dizi) inaktif hale getirilir. ADCSequenceDisable(ADC_BASE, 1); ADCSequenceDisable(ADC_BASE, 3); Kullanılacak olan sequencer üzerinde nasıl tetikleneceği ve öncelik sırası ayarlamaları yapılır. ADCSequenceConfigure(ADC_BASE, 1, ADC_TRIGGER_TIMER, 1); ADCSequenceConfigure(ADC_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
StellarisWare Algoritması: ADC MODÜLÜ StellarisWare Algoritması: Sequencer ayarlandıktan sonra bu sefer kullanılan stepler ayarlanır. Step Ayarları: End Of Sequence(ENDn): Dizide kullanılan son step Temp. Sensor(TSn): Sıcaklık sensörü Interrupt Enable(IEn): İnterrupt açık Differential Sampling(Dn): Diferansiyel örnekleme N sayısı step numarasını ifade eder.
StellarisWare Algoritması: ADC MODÜLÜ StellarisWare Algoritması: Sequencer ayarlandıktan sonra bu sefer kullanılan stepler ayarlanır. ADCSequenceStepConfigure(ADC_BASE, 1, 0, ADC_CTL_CH0); ADCSequenceStepConfigure(ADC_BASE, 1, 1, ADC_CTL_CH1); ADCSequenceStepConfigure(ADC_BASE, 1, 2, ADC_CTL_CH2 | ADC_CTL_IE | ADC_CTL_END); ADCSequenceStepConfigure(ADC_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_END);
StellarisWare Algoritması: ADC MODÜLÜ StellarisWare Algoritması: Eğer kullanılacaksa sequence üzerinde interrupt ayarı yapılır. ADCIntEnable(ADC_BASE, 1); Data FIFO mantığı ile çekilir. ADCSequenceDataGet(ADC_BASE, 1, &sensor1); ADCSequenceDataGet(ADC_BASE, 1, &sensor2); ADCSequenceDataGet(ADC_BASE, 1, &sensor3); ADCSequenceDataGet(ADC_BASE, 3, &sicaklik);
RS-232,RS-422 ya da RS-485 haberleşme standartlarını destekler. UART HABERLEŞME MODÜLÜ UART Nedir: Universal Asynchronous Receiver/Transmitter (UART) bir seri haberleşme protokolüdür. UART byte olarak aldığı dataları bir diğer cihaza asenkron olarak iletir. RS-232,RS-422 ya da RS-485 haberleşme standartlarını destekler. Senkron haberleşme de gerçekleştirebilir. (USART) Temel olarak 4 kablo ile kontrol edilir. Bunlar Gnd, Vcc, TX(transmitter) ve RX(receiver) dir.
Önemli UART Sinyalleri: UART HABERLEŞME MODÜLÜ Önemli UART Sinyalleri: RXD: Haberleşmede verilerin alındığını gösteren sinyaldir.. TXD: Haberleşmede verilerin gönderildiğini gösteren sinyaldir. Cihazların TXD ve RXD bacakları bir birlerine terslenerek bağlanırlar. Çünkü birisi TXD ile gönderirken karşıdaki bunu RXD ile alacaktır. RTS(Ready To Send): Veri almaya hazırım, veri göndermeye başlayabilirsin sinyalidir. CTS(Clear To Send): Veri gönderebilirim sinyalidir. CTS ve RTS bacakları birbirlerine terslenerek bağlanırlar.
Bir seferde 8-bit ya da 9-bit veri transferi yapılabilir. UART HABERLEŞME MODÜLÜ UART Özellikleri: Bir seferde 8-bit ya da 9-bit veri transferi yapılabilir. Gönderim hızı BAUD ayarı ile kontrol edilebilir. ÖRN: 115200 bps(bit per second) saniyede 115200 bit gönderilecek anlamını taşır. Verinin doğruluğunu ve bozulmaya uğrayıp uğramadığını test etmek için parity-bit kullanılır. Örnek: Mesaj: 111 0001 Mesajdaki toplam 1 sayısı bulunur. Eğer çıkan sonuç tekse mesaja 1 eklenir. Çiftse 0 eklenir. Gönderilen data: 1110 0010
İşlemci üzerinde bağlı bulunan pine interrupt bağlanabilir. UART HABERLEŞME MODÜLÜ UART Özellikleri: Hardware Flow Control(Donanım akış kontrolü) ile iki cihaz arasında aynı hız elde edilebilir. Paket kaybı azaltılabilir. Handshaking yöntemi ile cihazlar birbirlerine veri göndereceklerini önceden haber verebilirler. Bununla birlikte daha güvenli bir iletim sağlanmış olur. İşlemci üzerinde bağlı bulunan pine interrupt bağlanabilir.
LM3S811 UART Modül Özellikleri: UART HABERLEŞME MODÜLÜ LM3S811 UART Modül Özellikleri: LM3S811 üzerinde 2 adet UART girişi bulunur. BAUD hızı 3.125Mbps(mega bit per second) ‘a kadar çıkabilir. 5,6,7,8 bit data iletimi gerçekleştirebilir. Parity yakalama özelliğine sahiptir. 16x8 bit iletim(TX) ve data alma(RX) buffer alanına sahiptir. Bu alanlar FIFO mantığına göre çalışır.
StellarisWare Algoritması: Algoritma 1(UART Echo) : UART HABERLEŞME MODÜLÜ StellarisWare Algoritması: Algoritma 1(UART Echo) : UART ayarlamaları yapılır. UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE ); UART aktif hale getirilir. UARTEnable(UART0_BASE); Eğer data alımı yapılacaksa RX buffer alanı kontrol edilebilir. while(!UARTCharsAvail(UART0_BASE)){} while(UARTCharGetNonBlocking(UART0_BASE)){} Eğer data gönderilecekse TX buffer alanına konulabilir. UARTCharPut(UART0_BASE, ’xxx’)); Kullanılmak isteniyorsa kullanılacak kısımlar üzerinde interrupt açılır. UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
StellarisWare Algoritması: Algoritma 2 (UartStdio): UART HABERLEŞME MODÜLÜ StellarisWare Algoritması: Algoritma 2 (UartStdio): UART aktif hale getirilir. SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); UARTStdio belirlenir. Bütün ayarları kendisi içerisinde yapmaktadır. UARTStdioInit(0); Printf fonksiyonunun C programlamadaki bütün görevlerini yerine getirebilir. UARTprintf(" deger=%d%s \n ",sayi,karakter); uartstdio.c ve uartstdio.h projeye eklenmelidir.(stellarisware)