1 / 28

ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama

ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama. TUNA AYAN www.tuna-ayan.com tunayan@gmail.com. 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.

sabina
Download Presentation

ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ARM Tabanlı Mikrodenetleyici Temelleri ve Programlama TUNA AYAN www.tuna-ayan.com tunayan@gmail.com

  2. BAŞLAMADAN ÖNCE Clock Ayarı TIMER Modülü ADC Modülü UART Haberleşme Protokolü

  3. 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. İnternalosc 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.

  4. CLOCK AYARI Bütün OSC kaynakları PLL(PhaseLockedLoop) 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.

  5. CLOCK AYARI PLL Kullanımı: OSC1 ve OSC2 osilatör kaynaklarıdır. Bunlar kristal ya da tek girişli(singleended) 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.

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

  7. CLOCK AYARI StellarisWare İle PLL Kullanımı : Öncelikle osilatör kaynağını seçiyoruz. (SYSCTL_OSC_MAIN) 20 Mhzclock ü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);

  8. 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.(TimerATimerB) Başka bir modülü tetiklemek için, capture(yakalama) yapabilmek için ve PWM oluşturmak için kullanılabilir.

  9. TIMER MODÜLÜ TimerModları: 32-bit sayıcı modu 16-bit sayıcı modu 16-bit inputcapture (giriş sinyali yakalama) modu 16-bit PWM modu vardır. Mod Özellikleri: One-shottimer: 1 kerelik çalışan sayaçtır. Sayaç sıfırlandıktan sonra bir dafa devam etmez. Periodictimer: periyodik olarak çalışır. Sıfırlandıktan sonra saymaya devam eder.

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

  11. ADC MODÜLÜ ADC (Analog toDigital 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.

  12. ADC MODÜLÜ 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(singleended) ve çok girişli(differential) hesaplamalar yapılabilir. Saniyede 500k örnek alabilir. Dahili(On-chip) sıcaklık sensörüne sahiptir.

  13. ADC MODÜLÜ LM3S811 ADC Modül Özellikleri: Timer, PWM, GPIO ve interrupt ile kolayca tetiklenebilir. FIFO(First In First Out) mantığına göre çalışır.

  14. ADC MODÜLÜ 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)

  15. ADC MODÜLÜ ADC Modül Modları: Tek girişli(SingleEnded) 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.

  16. ADC MODÜLÜ 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.

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

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

  19. 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ü InterruptEnable(IEn): İnterrupt açık DifferentialSampling(Dn): Diferansiyel örnekleme N sayısı step numarasını ifade eder.

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

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

  22. UART HABERLEŞME MODÜLÜ UART Nedir: Universal Asynchronous Receiver/Transmitter (UART) bir seri haberleşme protokolüdür. UART byteolarak 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.

  23. 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 ToSend): Veri almaya hazırım, veri göndermeye başlayabilirsin sinyalidir. CTS(ClearToSend): Veri gönderebilirim sinyalidir. CTS ve RTS bacakları birbirlerine terslenerek bağlanırlar.

  24. 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 persecond) 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

  25. UART HABERLEŞME MODÜLÜ UART Özellikleri: Hardware FlowControl(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 pineinterrupt bağlanabilir.

  26. 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 persecond) ‘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.

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

  28. UART HABERLEŞME MODÜLÜ StellarisWare Algoritması: Algoritma 2 (UartStdio): UART aktif hale getirilir. SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); UARTStdiobelirlenir. 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)

More Related