arm tabanlı mikrodenetleyici temelleri ve programlama

28
TUNA AYAN www.tuna-ayan.com [email protected] ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama

Upload: sabina

Post on 23-Feb-2016

110 views

Category:

Documents


0 download

DESCRIPTION

ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama. TUNA AYAN www.tuna-ayan.com [email protected]. BAŞLAMADAN ÖNCE. Clock Ayarı TIMER Modülü ADC Modülü UART Haberleşme Protokolü. CLOCK AYARI. Sistemin çalışma hızını belirleyen kısımdır. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

TUNA [email protected]

ARM Tabanlı Mikrodenetleyici

Temelleri ve Programlama

Page 2: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

• Clock Ayarı• TIMER Modülü• ADC Modülü• UART Haberleşme Protokolü

BAŞLAMADAN ÖNCE

Page 3: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

• 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.

CLOCK AYARI

Page 4: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

• 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.

CLOCK AYARI

Page 5: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

CLOCK AYARI

Page 6: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

CLOCK AYARI

Page 7: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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);

CLOCK AYARI

Page 8: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

TIMER MODÜLÜ

Page 9: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

TIMER MODÜLÜ

Page 10: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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ırTimerEnable(TIMER0_BASE, TIMER_B);

TIMER MODÜLÜ

Page 11: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

ADC MODÜLÜ

Page 12: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

LM3S811 ADC Modül Özellikleri:• 10-bit Çözünürlüğe sahiptir.• 0-3V referansı vardır.

0V => 00 0000 00003V => 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.

ADC MODÜLÜ

Page 13: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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Ü

Page 14: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

ADC Modül Çözünürlüğü:• Adc modül çözünürlüğü: 10-bit • Referans Voltaj: 0-3V

Örnek 1:Vin: 2.5 volt => 0-1023 = 852.5 => 853 => 0x355

Örnek 2:Vin: 3cos(wt) (Bu sefer negatif değerlerde göz önünde bulundurulacaktır)

ADC MODÜLÜ

Page 15: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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Ü

Page 16: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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Ü

Page 17: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

ADC MODÜLÜ

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.

Page 18: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

ADC MODÜLÜ

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);

Page 19: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

Page 20: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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);

Page 21: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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);

Page 22: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

Page 23: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

Page 24: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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

Page 25: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

Page 26: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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.

Page 27: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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);

Page 28: ARM Tabanlı  Mikrodenetleyici  Temelleri ve Programlama

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)