Skip to content

Instantly share code, notes, and snippets.

@Mervetafrali
Last active May 3, 2017 10:56
Show Gist options
  • Save Mervetafrali/3bd0757c307072a0ae50e1e80427af27 to your computer and use it in GitHub Desktop.
Save Mervetafrali/3bd0757c307072a0ae50e1e80427af27 to your computer and use it in GitHub Desktop.

Sistem Programlama → 7.Sunum

1

MEŞGUL BEKLEME

  • Seven segment kullanarak sayma

  • Buttona basıldığında ledi yakma, basılmadığında söndürme

1

Tiva/Stellaris 7 Segment & Buton & Led Bağlantısı

  • Devre baglantilarini gerceklestir

  • PortF yi ilklendir

  • PortB’yi ilklendir

  • Seven Segment tablosunu olustur

  • Sayac yardimi ile tablodaki kodlari teker teker cagir ve PortB ye gonder

  • Bekle

  • PortF’den Led’e basılıp basılmadığını kontrol et

2
3

Meşgul Bekleme Port F İlklendirme

void init_port_F() {
volatile unsigned long tmp;
SYSCTL_RCGCGPIO_R |= 0x00000020;			// Port F’nin saatini aktifleştir
	tmp = SYSCTL_RCGCGPIO_R;					// Saatin başlaması için gecikme
GPIO_PORTF_LOCK_R = 0x4C4F434B;			// Port F GPIO kilidini aç
	GPIO_PORTF_CR_R = 0x1F;					// PF4-0 kilidini aç
GPIO_PORTF_AMSEL_R = 0x00;				// PF anlog I/O kapat
GPIO_PORTF_PCTL_R = 0x00000000;			// PF4-0 GPIO olarak ayarla
GPIO_PORTF_DIR_R = 0x0E;					// PF4,PF0 giriş, PF3-1 çıkış
GPIO_PORTF_AFSEL_R = 0x00;				// PF7-0 Alternatif fonksiyonları kapat
GPIO_PORTF_PUR_R = 0x11;					// PF0 ve PF4 üzerindeki pull-up direncini
         // aktifleştir
GPIO_PORTF_DEN_R = 0x1F;					// PF4-0 digital I/O aktifleştir
}

Meşgul Bekleme Port B İlklendirme

void init_port_B() {
volatile unsigned long delay;
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOB;
delay = SYSCTL_RCGC2_R;
GPIO_PORTB_DIR_R |= 0xFF;
GPIO_PORTB_AFSEL_R &= ~0xFF;
GPIO_PORTB_DEN_R |= 0xFF;
}

Meşgul Bekleme Seven Segment Tablosu

uint8_t kodlar[] = {
    0b00111111,
    0b00000110,
    0b01011011,
    0b01001111,
    0b01100110,
    0b01101101,
    0b01111101,
    0b00000111,
    0b01111111,
    0b01101111
};

Meşgul Bekleme Seven Segment Sürülmesi

volatile int sayi = 0;
// seven segmentte aralarda bekleyerek 0'dan 9'a say
void islem_1() {
volatile unsigned long delay;
GPIO_PORTB_DATA_R = kodlar[sayi];
for (delay = 0 ; delay < 2000000 ; delay++)
       /* */;
sayi = (sayi + 1) % 10;
}

Meşgul Bekleme Led Yak Söndür

// button basiliysa ledi yak, degilse sondur
void islem_2() {
if (GPIO_PORTF_DATA_R & 0b00001 == 0) {
         GPIO_PORTF_DATA_R |= 0b00100;
     } else {
         GPIO_PORTF_DATA_R &= ~0b00100;
     }
}

Meşgul Bekleme

int main() {
volatile unsigned long delay;
init_port_B();
init_port_F();
    // surekli islem_1 ve islem_2'yi yap
while (1) {
islem_1();
       islem_2();
}
}

Eş Zamanlı İşlem Yapma

3

Neden Kesme

4
5
6

Cortex-M Ailesinde Kesme Kavramı

  • Nested Vector Interrup Controller (NVIC)

EXPORT  __Vectors

__Vectors                            ; address    ISR
       DCD     StackMem + Stack      ; 0x00000000 Top of Stack
       DCD     Reset_Handler         ; 0x00000004 Reset Handler
       DCD     NMI_Handler           ; 0x00000008 NMI Handler
       DCD     HardFault_Handler     ; 0x0000000C Hard Fault Handler
       . . .
       . . .
       . . .
       DCD     PendSV_Handler        ; 0x00000038 PendSV Handler
       DCD     SysTick_Handler       ; 0x0000003C SysTick Handler
       . . .
       . . .
       . . .
       DCD     FlashCtl_Handler     ; 0x000000B4 Flash Control
       DCD     GPIOPortF_Handler    ; 0x000000B8 GPIO Port F
  • DCD, 32-bitlik bir sabiti tanımlayan bir assembler sözde-op’dır.

EXPORT  __Vectors

__Vectors                            ; address    ISR
       DCD     StackMem + Stack      ; 0x00000000 Top of Stack
       DCD     Reset_Handler         ; 0x00000004 Reset Handler
       DCD     NMI_Handler           ; 0x00000008 NMI Handler
       DCD     HardFault_Handler     ; 0x0000000C Hard Fault Handler
       . . .
       . . .
       . . .
       DCD     PendSV_Handler        ; 0x00000038 PendSV Handler
       DCD     SysTick_Handler       ; 0x0000003C SysTick Handler
       . . .
       . . .
       . . .
       DCD     FlashCtl_Handler      ; 0x000000B4 Flash Control
       DCD     GPIOPortF_Handler     ; 0x000000B8 GPIO Port F
  • Interrupt Service Rutine fonksiyonun bulunduğu bellek konumuna işaret eden ilişkili 32 bitlik bir vektör

NVIC

EXPORT  __Vectors

__Vectors                           ; address    ISR
       DCD     StackMem + Stack      ; 0x00000000 Top of Stack
       DCD     Reset_Handler         ; 0x00000004 Reset Handler
       DCD     NMI_Handler           ; 0x00000008 NMI Handler
       DCD     HardFault_Handler     ; 0x0000000C Hard Fault Handler
       . . .
       . . .
       . . .
       DCD     PendSV_Handler        ; 0x00000038 PendSV Handler
       DCD     SysTick_Handler       ; 0x0000003C SysTick Handler
       . . .
       . . .
       . . .
       DCD     FlashCtl_Handler      ; 0x000000B4 Flash Control
      *DCD     GPIOPortF_Handler     ; 0x000000B8 GPIO Port F*

ISR Interrup Service Rutine

void GPIOPortF_Handler(void){
  	GPIO_PORTF_ICR_R = 0x10;
}

Periyodik Kesmeler

7
8

SysTick kesmesi kullanarak led yakıp söndürme

  • ledi yakma ve söndürme

4

Tiva/Stellaris Led Bağlantısı

9

Nested Vector Interrup Controller (NVIC)

10

Interrupt Service Rutine ISR

11

Interrupt Service Rutine ISR

  • // The vector table alanı içindeki
    IntDefaultHandler, // The SysTick handler satırı aşağıdaki gibi değiştirilmeli
    systick_handler, // The SysTick handler

12

SysTick Kesmesi Port F İlklendirme

void init_port_F() {
volatile unsigned long tmp;
SYSCTL_RCGCGPIO_R |= 0x00000020;            // Port F’nin saatini aktifleştir
    tmp = SYSCTL_RCGCGPIO_R;                    // Saatin başlaması için gecikme
GPIO_PORTF_LOCK_R = 0x4C4F434B;            // Port F GPIO kilidini aç
    GPIO_PORTF_CR_R = 0x1F;                    // PF4-0 kilidini aç
GPIO_PORTF_AMSEL_R = 0x00;                // PF anlog I/O kapat
GPIO_PORTF_PCTL_R = 0x00000000;            // PF4-0 GPIO olarak ayarla
GPIO_PORTF_DIR_R = 0x0E;                    // PF4,PF0 giriş, PF3-1 çıkış
GPIO_PORTF_AFSEL_R = 0x00;                // PF7-0 Alternatif fonksiyonları kapat
GPIO_PORTF_PUR_R = 0x11;                    // PF0 ve PF4 üzerindeki pull-up direncini
        // aktifleştir
GPIO_PORTF_DEN_R = 0x1F;                    // PF4-0 digital I/O aktifleştir
}

SysTick Kesmesi ISR

/** systick_handler() fonksiyonu her systick kesmesi olduğunda çalışacak. */
void systick_handler() {
 // ledin durumunu ters cevir
  GPIO_PORTF_DATA_R ^= 0b00010;
}

SysTick Kesme İlklendirme

  • SysTick’i kapatmak için ENABLE bitini temizlenir

13
/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine
göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
    NVIC_ST_CTRL_R = 0;         // SysTick'i kapatmak için ENABLE bitini temizlenir
    NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
    NVIC_ST_CURRENT_R = 0;      // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
    NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}

Periyodik Kesmeler SysTick

RELOAD saklayıcısı ayarlanır

14

SysTick Kesme İlklendirme

/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
    NVIC_ST_CTRL_R = 0;         // SysTick'i kapatmak için ENABLE bitini temizlenir
    NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
    NVIC_ST_CURRENT_R = 0;      // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
    NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}

Periyodik Kesmeler SysTick

  • Sayacı silmek için NVIC_ST_CURRENT_R’ye herhangi bir değer yazılır

15

SysTick Kesme İlklendirme

/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
    NVIC_ST_CTRL_R = 0;         // SysTick'i kapatmak için ENABLE bitini temizlenir
    NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
    NVIC_ST_CURRENT_R = 0;      // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
    NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}

Kesmeler Öncelikleri

  • NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini oluşturulur

16

SysTick Kesme İlklendirme

/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
    NVIC_ST_CTRL_R = 0;         // SysTick'i kapatmak için ENABLE bitini temizlenir
    NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
    NVIC_ST_CURRENT_R = 0;      // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
    NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}

Periyodik Kesmeler SysTick

  • NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır

17
  • CLK_SRC = 1 olması gerekir,

  • CLK_SRC = 0 harici saat modu LM3S / TM4C ailesi yoktur

18
  • Kesmeleri etkinleştirmek için INTEN’ı ayarlanır

19
  • Sistemin çalışması için ENABLE biti ayarlanmalı

20

SysTick Kesme İlklendirme

/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
    NVIC_ST_CTRL_R = 0;         // SysTick'i kapatmak için ENABLE bitini temizlenir
    NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
    NVIC_ST_CURRENT_R = 0;      // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
    NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}

Periyodik Kesmeler SysTick

  • SysTick, saat frekansında azalma sağlayan 24 bitlik bir sayacı vardır.

21
  • CURRENT değeri 1’den 0’a iner, COUNT bayrağı set olur.

  • Bir sonraki saatte CURRENT RELOAD değeri ile yüklenir.

  • Bu şekilde, SysTick sayacı (CURRENT) sürekli olarak azalmaktadır.

  • RELOAD değeri n ise, SysTick sayacı modulo n + 1 ile çalışır.

  • COUNT bayrağı her n + 1 sayıda ayarlanacaktır.

22

SysTick Kesmesi

int main() {
  init_port_F();
  SysTick_Init(1600000); // 1600000 clockta bir kesme uret
  // islemcinin frekansi 16Mhz = 16000000
  // 1600000/16000000 = 0.1 saniyede bir kesme uretir
  enable_interrupts();
  while (1) {
     wait_for_interrupt();
  }
}
static inline void disable_interrupts() { //Kesmeleri pasif yap
  asm("CPSID I");
}

static inline void enable_interrupts() { // Kesmeleri aktifleştir
  asm("CPSIE I");
}

static inline void wait_for_interrupt() { // Kesme olana kadar bekle
  asm("WFI");
}

Eş Zamanlı İşlem Yapma

  • Seven segment kullanarak sayma

  • Buttona basıldığında ledi yakma, basılmadığında söndürme

4

Tiva/Stellaris 7 Segment & Buton & Led Bağlantısı

23
24

SysTick Kesmesi Port F İlklendirme

void init_port_F() {
volatile unsigned long tmp;
SYSCTL_RCGCGPIO_R |= 0x00000020;            // Port F’nin saatini aktifleştir
    tmp = SYSCTL_RCGCGPIO_R;                    // Saatin başlaması için gecikme
GPIO_PORTF_LOCK_R = 0x4C4F434B;            // Port F GPIO kilidini aç
    GPIO_PORTF_CR_R = 0x1F;                    // PF4-0 kilidini aç
GPIO_PORTF_AMSEL_R = 0x00;                // PF anlog I/O kapat
GPIO_PORTF_PCTL_R = 0x00000000;            // PF4-0 GPIO olarak ayarla
GPIO_PORTF_DIR_R = 0x0E;                    // PF4,PF0 giriş, PF3-1 çıkış
GPIO_PORTF_AFSEL_R = 0x00;                // PF7-0 Alternatif fonksiyonları kapat
GPIO_PORTF_PUR_R = 0x11;                    // PF0 ve PF4 üzerindeki pull-up direncini
        // aktifleştir
GPIO_PORTF_DEN_R = 0x1F;                    // PF4-0 digital I/O aktifleştir
}

SysTick Kesmesi Port B İlklendirme

void init_port_B() {
volatile unsigned long delay;
SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOB;
delay = SYSCTL_RCGC2_R;
GPIO_PORTB_DIR_R |= 0xFF;
GPIO_PORTB_AFSEL_R &= ~0xFF;
GPIO_PORTB_DEN_R |= 0xFF;
}

SysTick Kesmesi Seven Segment Tablosu

uint8_t kodlar[] = {
    0b00111111,
    0b00000110,
    0b01011011,
    0b01001111,
    0b01100110,
    0b01101101,
    0b01111101,
    0b00000111,
    0b01111111,
    0b01101111
};

SysTick Kesmesi Seven Segment Sürülmesi

volatile int sayi = 0;

void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak
    sayi = (sayi + 1) % 10;
    GPIO_PORTB_DATA_R = kodlar[sayi];
}

SysTick Kesme İlklendirme

/** SysTick_Init() fonksiyonu systick kesmesini aktifleştiriyor. Kaç saniyede bir kesme üretileceğini verilen period parametresine göre ayarlanıyor. */
void SysTick_Init(unsigned long period){
NVIC_ST_CTRL_R = 0;         // SysTick'i kapatmak için ENABLE bitini temizlenir
NVIC_ST_RELOAD_R = period-1; // RELOAD saklayıcısı ayarlanır
NVIC_ST_CURRENT_R = 0;      // Sayacı silmek için NVIC_ST_CURRENT_R'ye herhangi bir
// değer yazılır
NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R&0x00FFFFFF)|0x40000000;
// NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini
oluşturulur
    NVIC_ST_CTRL_R = 0x07; // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
}

SysTick Kesmesi

static inline void disable_interrupts() { //Kesmeleri pasif yap
  asm("CPSID I");
}

static inline void enable_interrupts() { // Kesmeleri aktifleştir
  asm("CPSIE I");
}

static inline void wait_for_interrupt() { // Kesme olana kadar bekle
  asm("WFI");
}

SysTick Kesmesi Led Yak Söndür

// button basiliysa ledi yak, degilse sondur
void islem_2() {
if (GPIO_PORTF_DATA_R & 0b00001 == 0) {
         GPIO_PORTF_DATA_R |= 0b00100;
     } else {
         GPIO_PORTF_DATA_R &= ~0b00100;
     }
}

SysTick Kesmesi

int main() {
   init_port_B();
   init_port_F();

    // 0.1 saniyede bir kesme uretir
    SysTick_Init(16000000); // 1600000 clockta bir kesme uret

    enable_interrupts();

    while (1) {
        islem_2();
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment