Timer Suhap SAHIN 0 {\ /\
clock
clock
Phase-Lock-Loop (Faz-Kilit-Döngü) 400 MHz Faz-Kilit-Döngü ARM mikrodenetleyiciler Faz-Kilit-Döngüleri (PLL'ler) ile donatılmıstır. Tiva kartı, dahili bir 400 MHz PLL ile birlikte gelmektedir. Tiva nın PLL i, giris saati kaynagını çarpmak yerine, istenen saat hızlarını elde etmek için Sistem Bölümü tarafından bölünür. Dahili PLL ile 3.125 MHz'den 80 MHz'e kadar saat frekansları üretebiliriz, Tiva için en yüksek çalısma saat hızı 80 MHz'dir.
clock kaynakları Precision Internal Oscillator (PIOSC) Main Oscillator (MOSC) Low-Frequency Internal Oscillator (LFIOSC) Hibernation Module Clock Source
clock Ayarlanması Saklayıcıların etkin oldugu islemler: Uyku ve modunda saat kaynak seçimi PLL veya diger kaynaklardan türetilmis sistem saati seçimi Osilatörlerin ve PLL'nin etkinlestirilmesi / devre dısı bırakılması Saat bölme Kristal giris seçimi
SYSDIV ve SYSDIV2 alanları RCC de bulunan SYSDIV ve SYSDIV2 alanları Sistem saati ; PLL çıkısı??? osilatör kaynagı BYPASS biti = 0??? 1
Sistem Saati Frekansları SysCtlClockSet() S DI Div Fre c (B AS =0) Fre c (B AS =1) Ste r Wa 0x0 /1 re v Clo s ef en /1 S C _S DI _1 0x1 /2 re v Clo s ef en /2 S C _S DI _2......... 0x4 /5 40 M z......... 0x9 /10 20 M z......... 0xF /16......... 0x3F /64 3.125 M z 12.5 M z (de... Clo s ef... en /5... Clo s ef... en /10... t) Clo s ef ef S C _S DI _10... en /16... Clo s S C _S DI _5 S C _S DI _16... en /164 S C _S DI _64
Sistem Saati Frekansları SysCtlClockSet() S DI 2 0x00 S DI 2L re v Div Fre c (B AS =0) /2 re v re v Ste r Wa 0x01 0 /3............... 0x02 0 /5 80 M z S C _S DI _2_5......... /10 40 M z S C _S DI _5......... /128 3.125 M z S C _S DI _64... 0x4 1... 0x3F 1
islemci hızının ayarlanması
islemci hızının ayarlanması
islemci hızının ayarlanması
Port F Kesmesi Cortex M4 8 32k RAM GPIO Port B GPIO Port A 8 Eight UARTs Four I2Cs Four SSIs CAN 2.0 GPIO Port D GPIO Port C 4 Twelve Timers Six 64-bit wide USB 2.0 JTAG 6 GPIO Port F GPIO Port E Two Analog Comparators ADC 2 channels 12 inputs 12 bits Two PWM Modules System Bus 8 5
islemci hızının ayarlanması #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" #include "inc/hw_types.h" // SysCtl ile baslayan fonksiyonlarda gerekli #include "driverlib/sysctl.h" void init_port_f() { volatile unsigned long delay; SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; delay = SYSCTL_RCGC2_R; GPIO_PORTF_DIR_R = 0b01110; GPIO_PORTF_AFSEL_R &= ~0b01110; GPIO_PORTF_DEN_R = 0b01110;
islemci hızının ayarlanması #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" #include "inc/hw_types.h" // SysCtl ile baslayan fonksiyonlarda gerekli #include "driverlib/sysctl.h" void init_port_f() { volatile unsigned long delay; SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; delay = SYSCTL_RCGC2_R; GPIO_PORTF_DIR_R = 0b01110; GPIO_PORTF_AFSEL_R &= ~0b01110; GPIO_PORTF_DEN_R = 0b01110;
islemci hızının ayarlanması #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" #include "inc/hw_types.h" // SysCtl ile baslayan fonksiyonlarda gerekli #include "driverlib/sysctl.h" void init_port_f() { volatile unsigned long delay; SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; delay = SYSCTL_RCGC2_R; GPIO_PORTF_DIR_R = 0b01110; GPIO_PORTF_AFSEL_R &= ~0b01110; GPIO_PORTF_DEN_R = 0b01110;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 2.5 = 80 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_1 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 2.5 = 80 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_1 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 2.5 = 80 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_1 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 2.5 = 80 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_1 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 2.5 = 80 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_1 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 2.5 = 80 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_1 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 5 = 40 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_5 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_2 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 200 / 10 = 20 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_10 SYSCTL_USE_PLL SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_3 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 16 / 1 = 16 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_1 SYSCTL_USE_OSC SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_4 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
islemci hızının ayarlanması int main() { volatile unsigned long delay; // USE_PLL -> 200 / SYSDIV_X // USE_OSC -> 16 / SYSDIV_X // 16 / 2 = 8 Mhz (clock source crystal oscilator) SysCtlClockSet(SYSCTL_SYSDIV_2 SYSCTL_USE_OSC SYSCTL_OSC_MAIN SYSCTL_XTAL_16MHZ); volatile unsigned long clock_period_5 = SysCtlClockGet(); init_port_f(); while (1) { GPIO_PORTF_DATA_R ^= 0b00100; for (delay = 0 ; delay < 1000000 ; delay++) /* */;
Port F Kesmesi
Port F Kesmesi Cortex M4 8 32k RAM GPIO Port B GPIO Port A 8 Eight UARTs Four I2Cs Four SSIs CAN 2.0 GPIO Port D GPIO Port C 4 Twelve Timers Six 64-bit wide USB 2.0 JTAG 6 GPIO Port F GPIO Port E Two Analog Comparators ADC 2 channels 12 inputs 12 bits Two PWM Modules System Bus 8 5
Port F Kesmesi
Tiva & Stellaris Port Baglantıları
Nested Vector Interrup Controller (NVIC) extern void PortF_interrupt_handler();
Interrupt Service Rutine (ISR) // The vector table alanı içindeki IntDefaultHandler, // GPIO Port F satırı aşağıdaki gibi değiştirilmeli PortF_interrupt_handler, // GPIO Port F
Kütüphane tanımlamaları #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h"
Kesme Fonksiyonları 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");
PortF Kurulumu void init_port_f() { volatile unsigned long tmp; SYSCTL_RCGCGPIO_R = 0x00000020; tmp = SYSCTL_RCGCGPIO_R; GPIO_PORTF_LOCK_R = 0x4C4F434B; GPIO_PORTF_CR_R = 0x1F; GPIO_PORTF_AMSEL_R = 0x00; GPIO_PORTF_PCTL_R = 0x00000000; GPIO_PORTF_DIR_R = 0x0E; GPIO_PORTF_AFSEL_R = 0x00; GPIO_PORTF_PUR_R = 0x11; GPIO_PORTF_DEN_R = 0x1F; // Port F nin saatini aktifleştir // Saatin başlaması için gecikme // Port F GPIO kilidini aç // PF4-0 kilidini aç // PF anlog I/O kapat // PF4-0 GPIO olarak ayarla // PF4,PF0 giriş, PF3-1 çıkış // PF7-0 Alternatif fonksiyonları kapat // PF0 ve PF4 üzerindeki pull-up direncini // aktifleştir // PF4-0 digital I/O aktifleştir
PortF Kesme Kurulumu void PF4_interrupt_init() { GPIO_PORTF_IS_R &= ~0b10000; // PC4 is kenar hassas GPIO_PORTF_IBE_R &= ~0b10000; // PC4 iki kenara hassas değil GPIO_PORTF_IEV_R &= ~0b10000; // PC4 düşen kenar hassasiyeti GPIO_PORTF_ICR_R = 0b10000; // flag4 kesmesini temizle GPIO_PORTF_IM_R = 0b10000; // PC4 kesmesi aktifleştir NVIC_PRI7_R = (NVIC_PRI7_R & 0xFF00FFFF) 0x00A00000; // NVIC_SYS_PRI3_R kaydında TICK alanını kullanarak SysTick kesmelerinin önceliğini // oluşturulur NVIC_EN0_R = (1<<30); // NVIC_ST_CTRL_R kontrol saklayıcısına istenen modu yazılır
Kesme Esnasında Çalısacak Fonksiyon volatile uint32_t kesme_sayisi = 0; void PortF_interrupt_handler() { disable_interrupts(); GPIO_PORTF_ICR_R = 0b10000; // flag4 kesmesini temizle kesme_sayisi++; // yesil ledi ters cevir GPIO_PORTF_DATA_R ^= 0b01000; enable_interrupts();
Kesme Esnasında Çalısacak Fonksiyon volatile uint32_t kesme_sayisi = 0; void PortF_interrupt_handler() { disable_interrupts(); GPIO_PORTF_ICR_R = 0b10000; // flag4 kesmesini temizle kesme_sayisi++; // yesil ledi ters cevir GPIO_PORTF_DATA_R ^= 0b01000; enable_interrupts();
Kesme Esnasında Çalısacak Fonksiyon volatile uint32_t kesme_sayisi = 0; void PortF_interrupt_handler() { disable_interrupts(); GPIO_PORTF_ICR_R = 0b10000; // flag4 kesmesini temizle kesme_sayisi++; // ledi ters cevir GPIO_PORTF_DATA_R ^= 0b01000; enable_interrupts();
Kesme Esnasında Çalısacak Fonksiyon volatile uint32_t kesme_sayisi = 0; void PortF_interrupt_handler() { disable_interrupts(); GPIO_PORTF_ICR_R = 0b10000; // flag4 kesmesini temizle kesme_sayisi++; // ledi ters cevir GPIO_PORTF_DATA_R ^= 0b01000; enable_interrupts();
Kesme islemi int main() { init_port_f(); PF4_interrupt_init(); enable_interrupts(); while (1) { wait_for_interrupt();
Kesme islemi int main() { init_port_f(); PF4_interrupt_init(); enable_interrupts(); while (1) { wait_for_interrupt();
Kesme islemi int main() { init_port_f(); PF4_interrupt_init(); enable_interrupts(); while (1) { wait_for_interrupt();
Timer islemleri
Timer islemleri
Timer islemleri Cortex M4 8 32k RAM GPIO Port B GPIO Port A 8 Eight UARTs Four I2Cs Four SSIs CAN 2.0 GPIO Port D GPIO Port C 4 Twelve Timers Six 64-bit wide USB 2.0 JTAG 6 GPIO Port F GPIO Port E Two Analog Comparators ADC 2 channels 12 inputs 12 bits Two PWM Modules System Bus 8 5
Timer islemleri
Timer islemleri
Timer islemleri 1 saniye Timer0A 1/10 saniyede Timer1A
Timer islemleri extern void timer_0a_handler(); extern void timer_1a_handler();
Timer islemleri // The vector table alanı içindeki // The vector table alanı içindeki IntDefaultHandler,... IntDefaultHandler, timer_0a_handler,... IntDefaultHandler, // Timer 0 subtimer A // Timer 1 subtimer A // Timer 0 subtimer A // Timer 1 subtimer A
Timer islemleri #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h"
Timer islemleri static inline void disable_interrupts() {asm("cpsid I"); static inline void enable_interrupts() {asm("cpsie I"); static inline void wait_for_interrupt() {asm("wfi");
Timer islemleri 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;
Timer islemleri void init_port_f() { volatile unsigned long delay; SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOF; delay = SYSCTL_RCGC2_R; GPIO_PORTF_DIR_R = 0b01110; GPIO_PORTF_AFSEL_R &= ~0b01110; GPIO_PORTF_DEN_R = 0b01110;
Timer islemleri void init_timer_0a(int period) { // timer_0 modulunu aktiflestir SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // timer_0 i periyodik olarak ayarla TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); // timer_0a modulunu "period" sayisindan geri sayacak sekilde ayarla TimerLoadSet(TIMER0_BASE, TIMER_A, period); // timer_0a kesmesini aktiflesitr IntEnable(INT_TIMER0A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // timer_0a'yi baslat TimerEnable(TIMER0_BASE, TIMER_A);
Timer islemleri void init_timer_1a(int period) { // timer_1 modulunu aktiflestir SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); // timer_1 i periyodik olarak ayarla TimerConfigure(TIMER1_BASE, TIMER_CFG_PERIODIC); // timer_1a modulunu "period" sayisindan geri sayacak sekilde ayarla TimerLoadSet(TIMER1_BASE, TIMER_A, period); // timer_1a kesmesini aktiflesitr IntEnable(INT_TIMER1A); TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); // timer_1a'yi baslat TimerEnable(TIMER1_BASE, TIMER_A);
Timer islemleri const uint8_t kodlar[] = { 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111 ;
Timer islemleri int sayi = 0; void timer_0a_handler() { // timer interrupt clear (timer kesmesini algiladigimizi bildiriyoruz) TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // sayiyi arttirip 7-segmentte gosterc sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi];
Timer islemleri void timer_1a_handler() { // timer interrupt clear (timer kesmesini algiladigimizi bildiriyoruz) TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT); GPIO_PORTF_DATA_R ^= 0b00010;
Timer islemleri int main() { volatile unsigned long delay; disable_interrupts(); // timer_0a kesmesini saniyede 1 kere calisacak sekilde kur init_timer_0a(sysctlclockget()); // timer_1a kesmesini saniyede 10 kere calisacak sekilde kur init_timer_1a( ()/10); init_port_b(); init_port_f(); enable_interrupts(); GPIO_PORTB_DATA_R = kodlar[sayi]; while (1) { wait_for_interrupt();
SysTick, Timer, 4 seven segment a b c d e f g Gnd Gnd Gnd Gnd
Timer islemleri extern void ekran_guncelleme_timer(); extern void systick_handler();
SysTick, Timer, 4 seven segment // The vector table alanı içindeki // The vector table alanı içindeki IntDefaultHandler,... IntDefaultHandler, systick_handler,... ekran_guncelleme_timer, // The SysTick handle // Timer 1 subtimer A // The SysTick handler // Timer 1 subtimer A
SysTick, Timer, 4 seven segment /** * ornekte systick kesmesi zamani olcmek icin, * timer kesmesi ekrani guncellemek icin kullaniliyor. */ #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" // stellaris icin: #include "inc/hw_ints.h" #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" #include "driverlib/timer.h"
SysTick, Timer, 4 seven segment static inline void disable_interrupts() { asm("cpsid I"); static inline void enable_interrupts() { asm("cpsie I"); static inline void wait_for_interrupt() { asm("wfi");
SysTick, Timer, 4 seven segment 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, Timer, 4 seven segment void init_port_e() { volatile unsigned long delay; SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOE; delay = SYSCTL_RCGC2_R; GPIO_PORTE_DIR_R = 0x0f; GPIO_PORTE_AFSEL_R &= ~0x0f; GPIO_PORTE_DEN_R = 0x0f;
SysTick, Timer, 4 seven segment void init_timer_0a(int period) { // timer_0 modulunu aktiflestir SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); // timer_0 i periyodik olarak ayarla TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); // timer_0a modulunu "period" sayisindan geri sayacak sekilde ayarla TimerLoadSet(TIMER0_BASE, TIMER_A, period); // timer_0a kesmesini aktiflesitr IntEnable(INT_TIMER0A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // timer_0a'yi baslat TimerEnable(TIMER0_BASE, TIMER_A);
SysTick, Timer, 4 seven segment void SysTick_Init(unsigned long period) { NVIC_ST_CTRL_R = 0; // disable SysTick during setup NVIC_ST_RELOAD_R = period - 1; // reload value NVIC_ST_CURRENT_R = 0; // any write to current clears it NVIC_SYS_PRI3_R = (NVIC_SYS_PRI3_R & 0x00FFFFFF) 0x40000000; // priority 2 NVIC_ST_CTRL_R = 0x07; // enable SysTick with core clock and interrupts // enable interrupts after all initialization is finished
SysTick, Timer, 4 seven segment // 0'dan 9'a kadar olan sayilarin seven segment kodlari // bit sirasi: g f e d c b a uint8_t kodlar[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111 ;
SysTick, Timer, 4 seven segment // 1 saniyedeki systick kesmesi sayisi #define SYSTICK_HZ 10 // 1 saniyede kac kere ekran guncelleme kesmesi olacagi #define EKRAN_KESME_HZ 400 // ekranda gosterilen sayi int sayi = 1234; // baslangictan itibaren olusan systick kesmesi sayisi uint32_t systick_count = 0; // ekran guncelleme kesmesinin sayaci int ekran_guncelle_sayac = 0;
SysTick, Timer, 4 seven segment /** systick kesmesinde calistirilan fonksiyon */ void systick_handler() { systick_count++; // 5 saniyede bir sayiyi arttir if (systick_count % (SYSTICK_HZ * 5) == 0) sayi++;
SysTick, Timer, 4 seven segment void ekran_guncelleme_timer() { /** Timer0A kesmesinde calistirilan fonksiyon */ // timer interrupt clear (timer kesmesini algiladigimizi bildiriyoruz) TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); ekran_guncelle_sayac++; if (ekran_guncelle_sayac % 4 == 1) { int birler = sayi % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[birler]; GPIO_PORTE_DATA_R &= ~0b0001; // birler basamagini aktiflestir else if (ekran_guncelle_sayac % 4 == 2) { int onlar = (sayi / 10) % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[onlar]; GPIO_PORTE_DATA_R &= ~0b0010; // onlar basamagini aktiflestir else if (ekran_guncelle_sayac % 4 == 3) { int yuzler = (sayi / 100) % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[yuzler]; GPIO_PORTE_DATA_R &= ~0b0100; // yuzler basamagini aktiflestir else if (ekran_guncelle_sayac % 4 == 0) { int binler = (sayi / 1000) % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[binler]; GPIO_PORTE_DATA_R &= ~0b1000; // binler basamagini aktiflestir
SysTick, Timer, 4 seven segment int main() { init_port_b(); init_port_e(); // Ekran guncelleme islemi icin saniyede EKRAN_KESME_HZ tane kesme uretilecek init_timer_0a(sysctlclockget() / EKRAN_KESME_HZ); // Zaman olcmek icin saniyede SYSTICK_HZ tane kesme uretilecek SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); // kesmeleri aktiflestir while (1) { wait_for_interrupt();
Sorular
Es zamanlı islem yapma Frekansı 100 olarak ayarlanmıs systick kesmesi ile zaman ölçümü yapmak Seven segment kullanarak SANiYEDE BiR sayma Ledi 2.5 SANiYE yak, 2.5 SANiYE söndür
Tiva/Stellaris 7 Segment & Buton & Led Bağlantısı PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 PE0 PE1 PE2 PE3 PE4 PE5 PF0 PF1 PF2 PF3 PF4 Vcc Seven Segment
Tiva/Stellaris 7 Segment & Buton & Led Bağlantısı PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 PE0 PE1 PE2 PE3 PE4 PE5 PF0 PF1 PF2 PF3 PF4 Vcc Seven Segment Led
Nested Vector Interrup Controller (NVIC)
Interrupt Service Rutine ISR
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
Kütüphane Tanımlamaları #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" // SysCtl ile baslayan fonksiyonlarda gerekli // 1 saniyede SYSTICK Kadar kesme üret #define SYSTICK_HZ 100
Kütüphane Tanımlamaları #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" // SysCtl ile baslayan fonksiyonlarda gerekli // 1 saniyede SYSTICK Kadar kesme üret #define SYSTICK_HZ 100
Kütüphane Tanımlamaları #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" // SysCtl ile baslayan fonksiyonlarda gerekli // 1 saniyede SYSTICK Kadar kesme üret #define SYSTICK_HZ 100
Kesme Fonksiyonları 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");
Port F İlklendirme void init_port_f() { volatile unsigned long tmp; SYSCTL_RCGCGPIO_R = 0x00000020; tmp = SYSCTL_RCGCGPIO_R; GPIO_PORTF_LOCK_R = 0x4C4F434B; GPIO_PORTF_CR_R = 0x1F; GPIO_PORTF_AMSEL_R = 0x00; GPIO_PORTF_PCTL_R = 0x00000000; GPIO_PORTF_DIR_R = 0x0E; GPIO_PORTF_AFSEL_R = 0x00; GPIO_PORTF_PUR_R = 0x11; GPIO_PORTF_DEN_R = 0x1F; // Port F nin saatini aktifleştir // Saatin başlaması için gecikme // Port F GPIO kilidini aç // PF4-0 kilidini aç // PF anlog I/O kapat // PF4-0 GPIO olarak ayarla // PF4,PF0 giriş, PF3-1 çıkış // PF7-0 Alternatif fonksiyonları kapat // PF0 ve PF4 üzerindeki pull-up direncini // aktifleştir // PF4-0 digital I/O aktifleştir
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;
Seven Segment Tablosu uint8_t kodlar[] = { 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111 ;
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
// baslangictan itibaren olusan systick kesmesi sayisi uint32_t systick_count = 0; Kesmede Çalışacak Fonksiyon // 7-segmentte gosterilen sayi volatile int sayi = 0; volatile int flag_sayi_arttir = 0; volatile int flag_ledi_ters_cevir = 0; void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak systick_count++; // kac tane systick kesmesi oldugunu say // Saniyede bir sayiyi arttirma flagini 1 yap // saydigimiz systick sayisi 100'e tam bolunuyorsa 1 saniye gecmistir if ((systick_count % (SYSTICK_HZ * 1)) == 0) flag_sayi_arttir = 1; // 5/2=2.5 saniyede bir ledi ters cevirme isleminin flagini 1 yap if (systick_count % (SYSTICK_HZ * 5/2) == 0)
// baslangictan itibaren olusan systick kesmesi sayisi uint32_t systick_count = 0; Kesmede Çalışacak Fonksiyon // 7-segmentte gosterilen sayi volatile int sayi = 0; volatile int flag_sayi_arttir = 0; volatile int flag_ledi_ters_cevir = 0; void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak systick_count++; // kac tane systick kesmesi oldugunu say // Saniyede bir sayiyi arttirma flagini 1 yap // saydigimiz systick sayisi 100'e tam bolunuyorsa 1 saniye gecmistir if ((systick_count % (SYSTICK_HZ * 1)) == 0) flag_sayi_arttir = 1; // 5/2=2.5 saniyede bir ledi ters cevirme isleminin flagini 1 yap if (systick_count % (SYSTICK_HZ * 5/2) == 0)
// baslangictan itibaren olusan systick kesmesi sayisi uint32_t systick_count = 0; Kesmede Çalışacak Fonksiyon // 7-segmentte gosterilen sayi volatile int sayi = 0; volatile int flag_sayi_arttir = 0; volatile int flag_ledi_ters_cevir = 0; void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak systick_count++; // kac tane systick kesmesi oldugunu say // Saniyede bir sayiyi arttirma flagini 1 yap // saydigimiz systick sayisi 100'e tam bolunuyorsa 1 saniye gecmistir if ((systick_count % (SYSTICK_HZ * 1)) == 0) flag_sayi_arttir = 1; // 5/2=2.5 saniyede bir ledi ters cevirme isleminin flagini 1 yap if (systick_count % (SYSTICK_HZ * 5/2) == 0)
// baslangictan itibaren olusan systick kesmesi sayisi uint32_t systick_count = 0; Kesmede Çalışacak Fonksiyon // 7-segmentte gosterilen sayi volatile int sayi = 0; volatile int flag_sayi_arttir = 0; volatile int flag_ledi_ters_cevir = 0; void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak systick_count++; // kac tane systick kesmesi oldugunu say // Saniyede bir sayiyi arttirma flagini 1 yap // saydigimiz systick sayisi 100'e tam bolunuyorsa 1 saniye gecmistir if ((systick_count % (SYSTICK_HZ * 1)) == 0) flag_sayi_arttir = 1; // 5/2=2.5 saniyede bir ledi ters cevirme isleminin flagini 1 yap if (systick_count % (SYSTICK_HZ * 5/2) == 0)
// baslangictan itibaren olusan systick kesmesi sayisi uint32_t systick_count = 0; Kesmede Çalışacak Fonksiyon // 7-segmentte gosterilen sayi volatile int sayi = 0; volatile int flag_sayi_arttir = 0; volatile int flag_ledi_ters_cevir = 0; void systick_handler() { // systick kesmesi oldugunda bu fonksiyon calisacak systick_count++; // kac tane systick kesmesi oldugunu say // Saniyede bir sayiyi arttirma flagini 1 yap // saydigimiz systick sayisi 100'e tam bolunuyorsa 1 saniye gecmistir if ((systick_count % (SYSTICK_HZ * 1)) == 0) flag_sayi_arttir = 1; // 5/2=2.5 saniyede bir ledi ters cevirme isleminin flagini 1 yap if (systick_count % (SYSTICK_HZ * 5/2) == 0)
int main() { init_port_b(); init_port_f(); Kesme Uygulaması // 1 saniyede SYSTICK_HZ tane kesme uretecek sekilde ayarlar SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); while (1) { if (flag_sayi_arttir) { flag_sayi_arttir = 0; sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi]; if (flag_ledi_ters_cevir) { flag_ledi_ters_cevir = 0; GPIO_PORTF_DATA_R ^= 0b00100; wait_for_interrupt(); // sonraki kesmeye kadar islemciyi uyku moduna alir
int main() { init_port_b(); init_port_f(); Kesme Uygulaması // 1 saniyede SYSTICK_HZ tane kesme uretecek sekilde ayarlar SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); while (1) { if (flag_sayi_arttir) { flag_sayi_arttir = 0; sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi]; if (flag_ledi_ters_cevir) { flag_ledi_ters_cevir = 0; GPIO_PORTF_DATA_R ^= 0b00100; wait_for_interrupt(); // sonraki kesmeye kadar islemciyi uyku moduna alir
int main() { init_port_b(); init_port_f(); Kesme Uygulaması // 1 saniyede SYSTICK_HZ tane kesme uretecek sekilde ayarlar SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); while (1) { if (flag_sayi_arttir) { flag_sayi_arttir = 0; sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi]; if (flag_ledi_ters_cevir) { flag_ledi_ters_cevir = 0; GPIO_PORTF_DATA_R ^= 0b00100; wait_for_interrupt(); // sonraki kesmeye kadar islemciyi uyku moduna alir
int main() { init_port_b(); init_port_f(); Kesme Uygulaması // 1 saniyede SYSTICK_HZ tane kesme uretecek sekilde ayarlar SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); while (1) { if (flag_sayi_arttir) { flag_sayi_arttir = 0; sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi]; if (flag_ledi_ters_cevir) { flag_ledi_ters_cevir = 0; GPIO_PORTF_DATA_R ^= 0b00100; wait_for_interrupt(); // sonraki kesmeye kadar islemciyi uyku moduna alir
int main() { init_port_b(); init_port_f(); Kesme Uygulaması // 1 saniyede SYSTICK_HZ tane kesme uretecek sekilde ayarlar SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); while (1) { if (flag_sayi_arttir) { flag_sayi_arttir = 0; sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi]; if (flag_ledi_ters_cevir) { flag_ledi_ters_cevir = 0; GPIO_PORTF_DATA_R ^= 0b00100; wait_for_interrupt(); // sonraki kesmeye kadar islemciyi uyku moduna alir
int main() { init_port_b(); init_port_f(); Kesme Uygulaması // 1 saniyede SYSTICK_HZ tane kesme uretecek sekilde ayarlar SysTick_Init(SysCtlClockGet() / SYSTICK_HZ); enable_interrupts(); while (1) { if (flag_sayi_arttir) { flag_sayi_arttir = 0; sayi = (sayi + 1) % 10; GPIO_PORTB_DATA_R = kodlar[sayi]; if (flag_ledi_ters_cevir) { flag_ledi_ters_cevir = 0; GPIO_PORTF_DATA_R ^= 0b00100; wait_for_interrupt(); // sonraki kesmeye kadar islemciyi uyku moduna alir
7 0b0111111, Parçalı Gösterge 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111,
Dörtlü 7 Parçalı Gösterge
Dörtlü 7 Parçalı Gösterge D1 12 A 11 F 10 D2 9 D3 8 B 7 1 E 2 D 3 4 C 5 G 6 D4 desimal
Dörtlü 7 Parçalı Gösterge D4 D3 D2 D1 a b c d e f g dp
Dörtlü 7 Parçalı Gösterge
Tiva/Stellaris 4 lü 7 Segment Bağlantısı PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 PF0 PF1 PF2 PF3 PF4 PF5 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 PE0 PE1 PE2 PE3 PE4 Vcc Seven Segment
Dörtlü Seven Segment #include <stdint.h> #include <stdbool.h> #include "inc/tm4c123gh6pm.h" // stellaris icin: #include "inc/lm4f120h5qr.h"
Dörtlü Seven Segment 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;
Dörtlü Seven Segment void init_port_e() { volatile unsigned long delay; SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOE; delay = SYSCTL_RCGC2_R; GPIO_PORTE_DIR_R = 0x0f; GPIO_PORTE_AFSEL_R &= ~0x0f; GPIO_PORTE_DEN_R = 0x0f;
Dörtlü Seven Segment // 0'dan 9'a kadar olan sayilarin seven segment kodlari // bit sirasi: g f e d c b a uint8_t kodlar[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111,
int main() Dörtlü { Seven Segment volatile unsigned long delay; init_port_b(); init_port_e(); int sayi = 1234; const int BEKLEME_LIMIT = 10000; while (1) { // Sonraki sunumlarda sadece while(1){ blogu gösterilecek
Dörtlü Seven Segment while (1) { int birler = sayi % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[birler]; GPIO_PORTE_DATA_R &= ~0b0001; // birler basamagini aktiflestir for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++) /* bekle */; // Sonraki slaytlarda onlar, yüzler ve binler basamakları bu kısımda // anlatılmaktadır.
int birler = sayi % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[birler]; GPIO_PORTE_DATA_R &= ~0b0001; // birler basamagini aktiflestir for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++) /* bekle */; Dörtlü Seven Segment int onlar = (sayi / 10) % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[onlar]; GPIO_PORTE_DATA_R &= ~0b0010; // onlar basamagini aktiflestir for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++) /* bekle */; int yuzler = (sayi / 100) % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[yuzler]; GPIO_PORTE_DATA_R &= ~0b0100; // yuzler basamagini aktiflestir for (delay = 0 ; delay < BEKLEME_LIMIT ; delay++) /* bekle */; int binler = (sayi / 1000) % 10; GPIO_PORTE_DATA_R = 0b1111; // hepsini kapat GPIO_PORTB_DATA_R = kodlar[binler]; GPIO_PORTE_DATA_R &= ~0b1000; // binler basamagini aktiflestir