Cümleten selamun aleyküm,

STM32F0 Assembly yazılarımıza kaldığımız yerden devam edelim inşaallah. En son yazımda USART birimini kullanarak uart üzerinden temel haberleşme(Echo) uygulaması yapmıştık. Bu yazımda ise kesme ve alt program yapıları kullanarak modifiyeli benzer bir uygulama yaptım. Bu arada geçen uygulamayı hazırlarken debug yapamama gibi bir sorunum vardı. Bu durumndan kartımın eski olmasını sorumlu tuttuğum için bahsetmemiştim. Fakat daha derinlemesine dökümanları karıştırınca hatanın bende olduğunu fark ettim. Yaşadığım durumu yazının altına not düşerek uygulama kodlarını güncelledim. Görüldüğü gibi assembly ile kod yazarken bir çok şeyi göz önünde bulundurmak gerekiyor. İbret alalım inşaallah. Uzatmadan yeni uygulamamıza geçelim.

Uygulama Hakkında

Bildiğiniz/bilmediğiniz gibi arm cortex-m0 işlemcisinde NVIC denen, kesme olaylarını yöneten, daha hızlı cevap verebilmek vs. için işlemci çekirdeğinde bulunan bir birim var. Kullanımı biraz çetrefilli olduğu için geçen yazıda kullanmadım. Fakat kesmelerin kullanımı kaçınılmaz olduğu için bu yazıda üstüne düşüp kullanmayı başardım.

Bu sayede daha kaliteli, tasarruflu bir kod yazdığımı düşünüyorum. Program çalışmaya başladıktan sonra gerekli ilk ayarları, kesme ayarlarını vs. yaparak uart üzerinden açılış mesajını gönderir. Mesajı gönderdikten sonra küçük bir led blink şovu yaparak uyku moduna girer. Sonrasında uart üzerinden herhangi bir veri alırsa, kesme oluşarak işlemci uyanır ve kesme alt programını icra eder. Kesme alt programında ise geçen uygulamada olduğu gibi aldığı veriyi geri gönderir.(Echo) Sonrasında kesme programının çalıştığını belli etmek için kart üerindeki ledlerin durumu tersler, tekrar kaldığı uykusuna devam eder.

Aynı zamanda programda bir çok kez kullanılan kod parçalarını alt program haline getirerek daha modüler ve verimli bir hale getirdim. Bu programda bekle ve USART_VERI_GONDER adında iki adet alt program hazırladım. İsimlerdende anlaşılacağı gibi bekle programı gecikme üretmek için USART_VERI_GONDER programı ise usart üzerinden veri göndermek için kullanılmaktadır. Bu arada yazılarımda yada programlarda bazı yerlerde usart ve uart kelimeleri kullanıyorum. Kafa karışıklığı olmasın usart stm32 içinde bulunan çevre birimidir. Aynı zamanda senkron(SPI,I2C) haberleşme yapabildiği için adı USART(Universal synchronous/asynchronous receiver transmitters) olarak geçmektedir. Uart(Universal asynchronous receiver transmitters) asenkron haberleşme protokolüdür. Usart birimide kullansak yaptığımız uart haberleşmesidir. Usart birimi çıkışları TTL seviyesindedir. Eğer çıkışa RS232 seviye dönüştürücü bir yapı eklersek direk olarak RS232 haberleşmesi yapabiliriz. Ben uygulamalarımda USB-UART dönüştürücü kullandığım için RS232 seviye dönüştürücü kullanmıyorum. Zaten bilgisayarımda da RS232 portu yok. Bu arada uygulamanın kodları aşağıdaki gibidir.

;****************************************************************************
;	Uygulama 		: USART Kesmesi ve alt program kullanımı		  		*
;	Yazan			: Erhan YILMAZ				  						  	*
;	E-posta			: erhanyilmaz.ytu@gmail.com								*
;	Tarih			: 26-06-2016				  							*
;	Sürüm			: 1.0					  								*
;	Açıklama		: Cortex M0 işlemcisine sahip STM32F051R8 denetleyicisi	*
; 	için assembly dilinde yazılmış USART kesmesi ve alt program kullanım 	*
;	uygulamasıdır. 															*
; 	Geliştirme kartı olarak STM32F0 Discovery kullanılmıştır.				*
;****************************************************************************
 
Stack_Size      EQU     0x00000400			;Stack boyutu tanımlanıyor.(1kb)
 
; Genel amaçlı bit değerleri için tanımlamalar yapılıyor.
BIT0	EQU	0x00000001
BIT1	EQU	0x00000002
BIT2	EQU	0x00000004
BIT3	EQU	0x00000008
BIT4	EQU	0x00000010
BIT5	EQU	0x00000020
BIT6	EQU	0x00000040
BIT7	EQU	0x00000080
BIT8	EQU	0x00000100
BIT9	EQU	0x00000200
BIT10	EQU	0x00000400
BIT11	EQU	0x00000800
BIT12	EQU	0x00001000
BIT13	EQU	0x00002000
BIT14	EQU	0x00004000
BIT15	EQU	0x00008000
BIT16	EQU	0x00010000
BIT17	EQU	0x00020000
BIT18	EQU	0x00040000
BIT19	EQU	0x00080000
BIT20	EQU	0x00100000
BIT21	EQU	0x00200000
BIT22	EQU	0x00400000
BIT23	EQU	0x00800000
BIT24	EQU	0x01000000
BIT25	EQU	0x02000000
BIT26	EQU	0x04000000
BIT27	EQU	0x08000000
BIT28	EQU	0x10000000
BIT29	EQU	0x20000000
BIT30	EQU	0x40000000
BIT31	EQU	0x80000000
 
 
; Kullanılan kaydedicilerin adresleri tanımlanıyor.
 
; NVIC kaydedici adresleri
ISER 	EQU	0xE000E100
ICER 	EQU	0XE000E180
ISPR	EQU	0XE000E200
ICPR	EQU	0XE000E280
IPR0	EQU	0xE000E400
IPR1	EQU	0xE000E404
IPR2	EQU	0xE000E408
IPR3	EQU	0xE000E40C
IPR4	EQU	0xE000E410
IPR5	EQU	0xE000E414
IPR6	EQU	0xE000E418
IPR7	EQU	0xE000E41C
 
; RCC birimi kaydedici adresleri
RCC_BASE		EQU		0x40021000
RCC_AHBENR		EQU		RCC_BASE + 0x14
RCC_APB2ENR		EQU		RCC_BASE + 0x18
RCC_CFGR3		EQU		RCC_BASE + 0x30
 
; GPIOA birimi kaydedici adresleri
GPIOA_BASE		EQU		0x48000000
GPIOA_MODER		EQU		GPIOA_BASE + 0x0
GPIOA_OTYPER	EQU		GPIOA_BASE + 0x4
GPIOA_OSPEEDR	EQU		GPIOA_BASE + 0x8
GPIOA_PUPDR		EQU		GPIOA_BASE + 0xc
GPIOA_IDR		EQU		GPIOA_BASE + 0x10
GPIOA_ODR		EQU		GPIOA_BASE + 0x14
GPIOA_BSRR		EQU		GPIOA_BASE + 0x18
GPIOA_LCKR		EQU		GPIOA_BASE + 0x1C
GPIOA_AFRL		EQU		GPIOA_BASE + 0x20
GPIOA_AFRH		EQU		GPIOA_BASE + 0x24
GPIOA_BRR		EQU		GPIOA_BASE + 0x28
 
; GPIOC birimi kaydedici adresleri
GPIOC_BASE		EQU		0x48000800
GPIOC_MODER		EQU		GPIOC_BASE + 0x0
GPIOC_OTYPER	EQU		GPIOC_BASE + 0x4
GPIOC_OSPEEDR	EQU		GPIOC_BASE + 0x8
GPIOC_PUPDR		EQU		GPIOC_BASE + 0xc
GPIOC_IDR		EQU		GPIOC_BASE + 0x10
GPIOC_ODR		EQU		GPIOC_BASE + 0x14
GPIOC_BSRR		EQU		GPIOC_BASE + 0x18
GPIOC_LCKR		EQU		GPIOC_BASE + 0x1C
GPIOC_AFRL		EQU		GPIOC_BASE + 0x20
GPIOC_AFRH		EQU		GPIOC_BASE + 0x24
GPIOC_BRR		EQU		GPIOC_BASE + 0x28
 
; USART1 birimi kaydedici adresleri
USART1_BASE		EQU		0x40013800
USART1_CR1		EQU		USART1_BASE + 0x00
USART1_CR2		EQU		USART1_BASE + 0x04
USART1_CR3		EQU		USART1_BASE + 0x08
USART1_BRR		EQU		USART1_BASE + 0x0C
USART1_GTPR		EQU		USART1_BASE + 0x10
USART1_RTOR		EQU		USART1_BASE + 0x14
USART1_RQR		EQU		USART1_BASE + 0x18
USART1_ISR		EQU		USART1_BASE + 0x1C
USART1_ICR		EQU		USART1_BASE + 0x20
USART1_RDR		EQU		USART1_BASE + 0x24
USART1_TDR		EQU		USART1_BASE + 0x28
 
; Stack için yer ayrılıyor.
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   0x00001000
__initial_sp
 
                PRESERVE8	; Linker bildirimi
                THUMB		; Thumb komut seti kullanılıyor.
 
; Vector Table Mapped to Address 0 at Reset
; Vektör tablosu tanımlanıyor.
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors					   ; Linker bildirimi
; İşlemci tarafından kullanılan kesmeler(exceptions) handler'lar ve stack top adresi tanımlanıyor.
__Vectors       DCD     __initial_sp                   ; Top of Stack
                DCD     Reset_Handler                  ; Reset Handler
                DCD     NMI_Handler                    ; NMI Handler
                DCD     HardFault_Handler              ; Hard Fault Handler
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     SVC_Handler                    ; SVCall Handler
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     PendSV_Handler                 ; PendSV Handler
                DCD     SysTick_Handler                ; SysTick Handler
; External Interrupts
; Denetleyici tarfından kullanılan kesmeler(exceptions) için handler'lar tanımlanıyor.
                DCD     WWDG_IRQHandler                ; Window Watchdog
                DCD     PVD_IRQHandler                 ; PVD through EXTI Line detect
                DCD     RTC_IRQHandler                 ; RTC through EXTI Line
                DCD     FLASH_IRQHandler               ; FLASH
                DCD     RCC_IRQHandler                 ; RCC
                DCD     EXTI0_1_IRQHandler             ; EXTI Line 0 and 1
                DCD     EXTI2_3_IRQHandler             ; EXTI Line 2 and 3
                DCD     EXTI4_15_IRQHandler            ; EXTI Line 4 to 15
                DCD     TS_IRQHandler                  ; TS
                DCD     DMA1_Channel1_IRQHandler       ; DMA1 Channel 1
                DCD     DMA1_Channel2_3_IRQHandler     ; DMA1 Channel 2 and Channel 3
                DCD     DMA1_Channel4_5_IRQHandler     ; DMA1 Channel 4 and Channel 5
                DCD     ADC1_COMP_IRQHandler           ; ADC1, COMP1 and COMP2 
                DCD     TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
                DCD     TIM1_CC_IRQHandler             ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler                ; TIM2
                DCD     TIM3_IRQHandler                ; TIM3
                DCD     TIM6_DAC_IRQHandler            ; TIM6 and DAC
                DCD     0                              ; Reserved
                DCD     TIM14_IRQHandler               ; TIM14
                DCD     TIM15_IRQHandler               ; TIM15
                DCD     TIM16_IRQHandler               ; TIM16
                DCD     TIM17_IRQHandler               ; TIM17
                DCD     I2C1_IRQHandler                ; I2C1
                DCD     I2C2_IRQHandler                ; I2C2
                DCD     SPI1_IRQHandler                ; SPI1
                DCD     SPI2_IRQHandler                ; SPI2
                DCD     USART1_IRQHandler              ; USART1
                DCD     USART2_IRQHandler              ; USART2
                DCD     0                              ; Reserved
                DCD     CEC_IRQHandler                 ; CEC
                DCD     0                              ; Reserved
 
 
                AREA     MAIN, CODE, READONLY
 
; Reset handler routine
; Reset sonrası başlangıç adresi
Reset_Handler    
                EXPORT  Reset_Handler                 [WEAK]	; Linker bildirimi			
 
; GPIOA, GPIOC saatleri aktif
				LDR R0, =RCC_AHBENR		; RCC_AHBENR değerini R0'a yükle
				LDR R1, =BIT19+BIT17	; BIT19+BIT17 değerini R1'e yükle
				STR R1, [R0]	        ; RCC_AHBENR harici değişkenine BIT19+BIT17 değerini yükle
 
; USART1 clock aktif
				LDR R0, =RCC_APB2ENR	; RCC_APB2ENR değerini R0'a yükle	
				LDR R1, =BIT14			; BIT14 değerini R1'e yükle
				STR R1, [R0]			; RCC_APB2ENR harici değişkenine BIT14 değerini yükle		
 
; GPIOC.8, GPIOC.9 çıkış
				LDR R0, =GPIOC_MODER	; GPIOC_MODER değerini R0'a yükle
				LDR R1, =BIT16+BIT18	; BIT16+BIT18 değerini R1'e yükle
				STR R1, [R0]			; GPIOC_MODER harici değişkenine BIT16+BIT18 değerini yükle
 
; GPIOA.9, GPIOA.10 alternatif fonksiyon
				LDR R0, =GPIOA_MODER	; GPIOA_MODER değerini R0'a yükle
				LDR R1, [R0]			; GPIOA_MODER değişken içeriğini R1'e yükle
				LDR R2, =BIT19+BIT21	; BIT19+BIT21 değerini R2'ye yükle
				ORRS R1, R1, R2			; R1 = R1 OR R2
				STR R1, [R0]			; Güncellenmiş GPIOA_MODER değişken içeriğini geri yaz
 
; GPIOA.9, GPIOA.10 alternatif fonksiyon 1
				LDR R0, =GPIOA_AFRH		; GPIOA_AFRH değerini R0'a yükle
				LDR R1, =BIT4+BIT8		; BIT4+BIT8 değerini R1'e yükle
				STR R1, [R0]			; GPIOA_AFRH harici değişkenine BIT4+BIT8 değerini yükle
 
; USART1 saat kaynağı HSI(Dahili osilatör)
				LDR R0, =RCC_CFGR3		; RCC_CFGR3 değerini R0'a yükle
				LDR R1, =BIT0+BIT1		; BIT0+BIT1 değerini R1'e yükle
				STR R1, [R0]			; RCC_CFGR3 harici değişkenine BIT0+BIT1 değerini yükle
 
; USART1 baud=9600, HSI=FCK=8MHz,oversampling 16
				LDR R0, =USART1_BRR		; USART1_BRR değerini R0'a yükle
				LDR R1, =0x341			; 0x341 değerini R1'e yükle
				STR R1, [R0]			; USART1_BRR harici değişkenine 0x341 değerini yükle
 
; USART1 uart açık, alma açık, gönderme açık, alma kesmesi açık
				LDR R0, =USART1_CR1		; USART1_CR1 değerini R0'a yükle
				LDR R1, =BIT0+BIT2+BIT3+BIT5	; BIT0+BIT2+BIT3+BIT5 değerini R1'e yükle
				STR R1, [R0]			; USART1_CR1 harici değişkenine BIT0+BIT2+BIT3+BIT5 değerini yükle
 
; USART1 (NVIC_EnableIRQ) biriminin kesme oluşturmasına izin ver				
				LDR	R0, =ISER			; ISER değerini R0'a yükle
				LDR	R1,	=BIT27			; BIT27 (USART1_IRQn) değerini R1'e yükle
				STR R1, [R0]			; ISER harici değişkenine BIT27 (USART1_IRQn) değerini yükle
 
; Başlangıç mesajını gönder	"ERHAN YILMAZ USART TEST\n\r"
				MOVS R4, #'E'
				BL	USART_VERI_GONDER
				MOVS R4, #'R'
				BL	USART_VERI_GONDER
				MOVS R4, #'H'
				BL	USART_VERI_GONDER
				MOVS R4, #'A'
				BL	USART_VERI_GONDER
				MOVS R4, #'N'
				BL	USART_VERI_GONDER
				MOVS R4, #' '
				BL	USART_VERI_GONDER
				MOVS R4, #'Y'
				BL	USART_VERI_GONDER
				MOVS R4, #'I'
				BL	USART_VERI_GONDER
				MOVS R4, #'L'
				BL	USART_VERI_GONDER
				MOVS R4, #'M'
				BL	USART_VERI_GONDER
				MOVS R4, #'A'
				BL	USART_VERI_GONDER
				MOVS R4, #'Z'
				BL	USART_VERI_GONDER
				MOVS R4, #' '
				BL	USART_VERI_GONDER
				MOVS R4, #'U'
				BL	USART_VERI_GONDER
				MOVS R4, #'S'
				BL	USART_VERI_GONDER
				MOVS R4, #'A'
				BL	USART_VERI_GONDER
				MOVS R4, #'R'
				BL	USART_VERI_GONDER
				MOVS R4, #'T'
				BL	USART_VERI_GONDER
				MOVS R4, #' '
				BL	USART_VERI_GONDER
				MOVS R4, #'T'
				BL	USART_VERI_GONDER
				MOVS R4, #'E'
				BL	USART_VERI_GONDER
				MOVS R4, #'S'
				BL	USART_VERI_GONDER
				MOVS R4, #'T'
				BL	USART_VERI_GONDER
				MOVS R4, #'\n'
				BL	USART_VERI_GONDER
				MOVS R4, #'\r'
				BL	USART_VERI_GONDER
 
; Başlangıç animasyonu				
; GPIOC.8, GPIOC.9 çıkışlarını set et				
				LDR R6, =GPIOC_BSRR	; GPIOC_BSRR değerini R6'ya yükle
				LDR R0, =BIT8+BIT9	; BIT8+BIT9 değerini R0'a yükle
				STR R0, [R6]		; GPIOC_BSRR harici değişkenine BIT8+BIT9 değerini yükle
 
; Bir süre(R4 değişkeni içeriği kadar) bekle
				LDR R4, =0x00050000	; 0x00050000 değerini R4'e yükle
				BL		bekle		; Gecikme(bekle) alt programını çağır
 
; GPIOC.8, GPIOC.9 çıkışlarını sıfırla
				LDR R6, =GPIOC_BRR	; GPIOC_BRR değerini R6'ya yükle
				LDR R0, =BIT8+BIT9	; BIT8+BIT9 değerini R0'a yükle
				STR R0, [R6]		; GPIOC_BRR harici değişkenine BIT8+BIT9 değerini yükle
 
; Bir süre(R4 değişkeni içeriği kadar) bekle
				LDR R4, =0x00050000	; 0x00050000 değerini R4'e yükle
				BL		bekle		; Gecikme(bekle) alt programını çağır	
 
; GPIOC.8, GPIOC.9 çıkışlarını set et				
				LDR R6, =GPIOC_BSRR	; GPIOC_BSRR değerini R6'ya yükle
				LDR R0, =BIT8+BIT9	; BIT8+BIT9 değerini R0'a yükle
				STR R0, [R6]		; GPIOC_BSRR harici değişkenine BIT8+BIT9 değerini yükle
 
; Bir süre(R4 değişkeni içeriği kadar) bekle
				LDR R4, =0x00050000	; 0x00050000 değerini R4'e yükle
				BL		bekle		; Gecikme(bekle) alt programını çağır
 
; GPIOC.8, GPIOC.9 çıkışlarını sıfırla
				LDR R6, =GPIOC_BRR	; GPIOC_BRR değerini R6'ya yükle
				LDR R0, =BIT8+BIT9	; BIT8+BIT9 değerini R0'a yükle
				STR R0, [R6]		; GPIOC_BRR harici değişkenine BIT8+BIT9 değerini yükle
 
				WFI						; Kesme için bekle(enerji tasarruf modu)
				B .						; Debug yaparken WFI komutu çalışmadığı için sonsuz döngüye gir
; Ana program sonu
 
; Gecikme alt programı
bekle
				SUBS R4, #1			; R4=R4-1
				BNE bekle			; Sonuç 0 değilse label'e git
				BX	LR				; Alt programdan geri dön
 
; USART1 veri gönderme alt programı
USART_VERI_GONDER
				PUSH {R0,R1}		; Ana programda kullanılan değişkenleri stack'e it
 
; Gitmekte olan veri var mı diye kontrol et				
TX_WAIT
				LDR  R0, =USART1_ISR; USART1_ISR değerini R0'a yükle
				LDR  R1, [R0]		; USART1_ISR registerini R1'e kopyala
				MOVS R0, #BIT6		; R0'a BIT6 değerini yükle (R0=BIT6=TC)
				TST  R0, R1			; R0 & R1 (Bit6 test ediliyor)
				BEQ	 TX_WAIT		; Sonuç 1 değilse TX_WAIT'e git
 
; Gitmekte olan veri yoksa alınan veriyi gönder
				LDR R0, =USART1_TDR	; USART1_TDR değerini R0'a yükle
				STR R4, [R0]		; USART1_TDR harici değişkenine(gönderme değişkeni) R4 değişken değerini yükle
 
				POP {R0,R1}			; Ana programda kullanılan değişkenleri stack'tan çek
				BX	LR				; Alt programdan geri dön
 
; Dummy Exception Handlers (infinite loops which can be modified)
; Kesme(exceptions) vektörleri için tanımlanmış iç boş sonsuz döngüye giren handler'lar
NMI_Handler     
                B       .       
HardFault_Handler
                B       .
SVC_Handler     
                B       .
PendSV_Handler  
                B       .
SysTick_Handler 
                B       .
WWDG_IRQHandler
PVD_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_1_IRQHandler
EXTI2_3_IRQHandler
EXTI4_15_IRQHandler
TS_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_3_IRQHandler
DMA1_Channel4_5_IRQHandler
ADC1_COMP_IRQHandler 
TIM1_BRK_UP_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM6_DAC_IRQHandler
TIM14_IRQHandler
TIM15_IRQHandler
TIM16_IRQHandler
TIM17_IRQHandler
I2C1_IRQHandler
I2C2_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
 
; USART1 kesme programı
USART1_IRQHandler
; Ana programda kullanılan değişkenleri ve LR değişkenini stack'a it
				PUSH {R0,R1,R2,R4,LR}	
 
; Gelen veri var mı diye kontrol et					
				LDR  R0, =USART1_ISR	; USART1_ISR değerini R0'a yükle
				LDR  R1, [R0]		 	; USART1_ISR registerini R1'e kopyala
				MOVS R0, #BIT5		    ; R0'a BIT5 değerini yükle(R0=BIT5=RXNE)
				TST  R0, R1				; R0 & R1 (Bit5 test ediliyor)
				BEQ	 USART1_KESME_SONU	; Sonuç 1 değilse USART1_KESME_SONU'na git
 
; Veri geldiyse oku
				LDR  R0, =USART1_RDR; USART1_RDR(gelen veri) değerini R0'a yükle
				LDR  R4, [R0]		; USART1_RDR registerini R4'e kopyala
				BL	 USART_VERI_GONDER		; USART_VERI_GONDER alt programını çağır
 
; PC8 ve PC9'a bağlı LEDlerin durumunu tersle(XOR)
				LDR  R0, =GPIOC_ODR	; GPIOC_ODR değerini R0'a yükle
				LDR  R1, [R0]		; GPIOC_ODR registerini R1'e kopyala
				LDR  R0, =BIT8+BIT9	; BIT8+BIT9 değerini R0'a yükle
				EORS R0, R0, R1		; R0=R0^R1
				LDR R1, =GPIOC_ODR	; GPIOC_ODR değerini R1'e yükle	
				str R0, [R1]		; GPIOC_ODR harici değişkenine R0 değişken değerini yükle
 
USART1_KESME_SONU
; Ana programda kullanılan değişkenleri ve geri dönüş değerini stack'tan çek
				POP	{R0,R1,R2,R4,PC} 
USART2_IRQHandler
CEC_IRQHandler   
                B .
	ALIGN	; Adres hizalama Assembler bildirimi
	END		; Program sonu assmbler bildirimi

Uygulama kodlarını mümkün mertebe açıklamalarıyla birlikte yazıyorum. Fakat bazen bu değişkene niye böyle yazdık bu bit niye değişti gibi sorularınız olabilir. Bunun için denetleyici dökümanlarını biraz kurcalamak gerekir. Tüm teknik detayları burada yazmam malesef mümkün değil. Bana da yazık. Bu arada kodları yazarken bazen önceki uygulamalardan kopyalar çekiyorum. Kopyalarken bazen yorum kısımlarını güncellemeyi unutabiliyorum. Böyle bir durumla karşılaşırsanız kafanız karışmasın muhtemelen benim hatamdır. Bu gibi durumları bana bildirirseniz sevinirim ayrıca.

Şekil-1

Şekil-1’de uygulamanın test görüntüsü görülmektedir. Görüldüğü gibi haberleşme hızımız yine 9600 baudtur. Diğer ayarlar genel geçer şekildedir.

Görüldüğü gibi program ilk çalıştığında namımı yürüten açılış mesajını gönderir. Sonrasında alt satıra geçme ve yeni satır verilerini göndererek, animasyondan sonra uykuya geçer. Sonrasında çeşitli zamanlarda bilgisayardan aldığı verilere karşılık vererek echo işlemi yapar. Bu şekilde çalışmasına yarı uykulu devam eder.

Şekil-2

Şekil-2’de ise uygulama donanımı görülmektedir. Bu sefer USB-UART dönüştürücü olarak Arduino üzerinde bulunan dönüştürücüyü kullandım. Onun dışından kendisiyle başka bir alakam yoktur.

Böylelikle bir yazının daha sonuna gelmiş bulunuyoruz elhamdülillah. Uygulama ait dosyalara vs. buradan ulaşabilirsiniz. Gözümden kaçan herhangi bir hata varsa, öneri, görüş vs. yada bildirirseniz sevinirim. Faydalı olması dileğiyle, bir sonraki yazıda görüşmek üzere inşaallah…

Esen kalın.