<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pic dsPIC Arm7 Arm Cortex Programlama ve Projeler &#187; asm30</title>
	<atom:link href="http://www.uicroarm.com/tag/asm30/feed" rel="self" type="application/rss+xml" />
	<link>http://www.uicroarm.com</link>
	<description>ds-pic arm-7 cortex nxp proje uygulama</description>
	<lastBuildDate>Wed, 01 Feb 2012 22:41:38 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>dsPIC &#8211; ASM30 ile Uart</title>
		<link>http://www.uicroarm.com/dspic-asm30-ile-uart</link>
		<comments>http://www.uicroarm.com/dspic-asm30-ile-uart#comments</comments>
		<pubDate>Sun, 01 Mar 2009 19:22:25 +0000</pubDate>
		<dc:creator>Aykut</dc:creator>
				<category><![CDATA[PIC24F dsPIC30F dsPIC33F Uygulamaları]]></category>
		<category><![CDATA[asm30]]></category>
		<category><![CDATA[dsPIC30F]]></category>
		<category><![CDATA[PIC24F]]></category>
		<category><![CDATA[PIC33F]]></category>
		<category><![CDATA[uart]]></category>

		<guid isPermaLink="false">http://www.uicroarm.com/?p=30</guid>
		<description><![CDATA[
Merhaba,
Bu yazımızda microchip asm30 ile uart haberleşmesini gerçekleştireceğiz. Bu bölümde port değiştirme (led veya role sürme) gibi bir uygulamadan başlamak istemedim. Microchip asm30 derleyicisini ve dsPIC,PIC24 serinin registerlerini C optimizasyonu için özel olarak ayarlamış. C&#8217;deki while, do-while, işlemlerini yapan asm30 komutları ve regsiterleri var. Küçük bir örnek olarak asm30 &#8220;repeat #k&#8221; komutu kendisinden sonraki komutu [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.uicroarm.com/wp-content/dosyalar/2009/03/dspic_kucuk4.jpg" alt="dspic_kucuk4" title="dspic_kucuk4" width="295" height="221" class="alignnone size-full wp-image-56" /><span id="more-30"></span></p>
<p>Merhaba,</p>
<p>Bu yazımızda microchip asm30 ile uart haberleşmesini gerçekleştireceğiz. Bu bölümde port değiştirme (led veya role sürme) gibi bir uygulamadan başlamak istemedim. Microchip asm30 derleyicisini ve dsPIC,PIC24 serinin registerlerini C optimizasyonu için özel olarak ayarlamış. C&#8217;deki while, do-while, işlemlerini yapan asm30 komutları ve regsiterleri var. Küçük bir örnek olarak asm30 &#8220;repeat #k&#8221; komutu kendisinden sonraki komutu k+1 kez çalıştırır. Bu yapı C&#8217;deki while{} yapısına benzer.</p>
<p>Aslında Microchip projelerimde C30 kullanıyorum ama şimdiye kadar intenette de doğru düzgün asm30 kod görmediğim için referans olması açısından bir kaç uygulama eklemek isteyorum. Açıkçası Microchip&#8217;in PIC24 ve dsPIC serisini beğendim.PIC24 serisinde özellikle kullanmak istediğin modulun port çıkışlarını seçmek için registerler koymaları çok iyi, bu pcb çizenlere de kolaylık sağlar. dsPIC&#8217;te ise 40bitlik çarpma işlemlerini gerçekleştirebilen bir donanıma sahip.</p>
<p>Burada yazdığım kodları yukarıda resmini verdiğim dsPIC30F4011 geliştirme boardunda denedim. Geliştirme board&#8217;unuda 2006&#8242;da ben hazırlamıştım. Resim üzerinde yine daha önce yaptığım nokia lcd üzerinde animasyon ve kayan yazı uygulamasından küçük örnek var. (LQFP kılıf uc olan board LPC2148 board&#8217;u)</p>
<p><a href="http://www.uicroarm.com/wp-content/dosyalar/2009/03/dspic_buyuk3.jpg" rel="lightbox[30]"><img src="http://www.uicroarm.com/wp-content/dosyalar/2009/03/dspic_buyuk3-150x150.jpg" alt="dspic_buyuk3" title="dspic_buyuk3" width="150" height="150" class="alignnone size-thumbnail wp-image-57" /></a></p>
<pre class="brush: cpp; title: ; notranslate">
/*********************************************************/
Aykut ULUSAN, Elektronik Mühendisi, IZMIR

Aşağıda 38400bps ile 0,5 saniyede bir KUTAY table'ı uart1'den gönderilir.

/*********************************************************/

.equ __30F3010, 1				             ; kullanılacak işlemci
.include &quot;p30fxxxx.inc&quot;
config	__FOSC, CSW_FSCM_OFF &amp;XT_PLL8    ; 10Mhz*8 =80Mhz
config	__FWDT, WDT_OFF				         ;  WDT off
config	__FBORPOR, MCLR_EN &amp;PBOR_OFF &amp;PWRT_16	; Brown-out off, MCLR enable, Power_up timer 16msn
config 	__FGS, CODE_PROT_OFF			       ; Kod koruması off

.equiv	flag_bit, 0					; zamanın dolduğunu bildirir
.equiv	FCY, 20000000				    ; Osc 80Mhz / FCY=20Mhz =20MIPS
.equiv	BAUDRATE, 38400				  ; RS232 baudrate 38400

.macro 	MOVFF	F1,F2				   ; F1, F2'ye atılır
mov	\F1,wreg
mov	wreg,\F2
.endm

.macro	MOVLF	L,F					; Literal file'a atılır
mov	\L,w0
mov	w0,\F
.endm

;=============================================================================================
; global atamalar yapılır, C30 içinde kullanacağımız tüm altprogramlar global olmalı
;=============================================================================================

.global	__reset					; Device resetten sonra hemen  __reset etiketini gördüğü yere gider, linker içinde tanımlanmıştır.
.global	__T1Interrupt			      ; Artık asm içinde  interrupt,

.section 	.const, &quot;r&quot;  				; PSV içinde Kutay adlı bir table tutalım, r=read only data
KUTAY:
.asciz	&quot;asm30 ile uart1, 38400bps by EEMKUTAY&quot;	; asciz, zero ile sonlanır

.text							; program buradan başlar, code yazma başlangıcı

__T1Interrupt:						; işlemci 0,5 sn'de bir buraya gelir
bclr  	IFS0, #T1IF				; flag'i sil
bset	W1, #flag_bit				; RS232 flag biti set et
retfie						    ; interrupt'an geri dön

__reset:
mov	#__SP_init, W15				; __SP_init , işlemciye göre linker içinde tanımlı, W15 stack pointer
MOVLF	#__SPLIM_init,SPLIM			; Stack Pointer limiti gir, linker içinde tanımlı
nop						        ; SPLIM ayarlanması için bir nop gerekli
; Şimdi working registerleri clear edeceğiz
clr	W0					      ; W0
mov	W0, W14 				; W14, adres pointer  oldu  ve  W14=0 adresini gösterir(adres pointer) yani W0'ın adresini
repeat	#12                                        ; next komut 13 kez repeat
mov	W0, [++W14]				; W1 - W13'ü clear yapar
clr	W14					; Counter'i silelim, W14=0

rcall	PORTLARI_HAZIRLA			; portları hazırla
rcall	INIT_TIMER1				; timer1'i  0,5 saniye için ayarla
rcall	INIT_UART1				; uart1 hazırlanır
bclr	W1, #flag_bit				; 0,5sn dolmadan table'ı gönderme
; table okuma ve yazma komutlarıyla , string okuyalım
mov	#tblpage(KUTAY),w0			;Kutay table'ın  page’ını w0’a at
mov	w0, _TBLPAG

main_loop:
btss	W1, #flag_bit				; 0,5 sn doluncaya kadar bekle
bra	main_loop				; zaman dolmamış
bclr	W1, #flag_bit				; zaman dolmuş flag'i clear et
mov	#tbloffset(KUTAY), W2 ; w2'yi pointer olarak kullanacağız (w2, KUTAY table'ın adresini tutuyor)
clr		W0				; w0=0 yap çünkü byte yükleyeceğiz (bit15-8 arası 0 olsun)

wrt_loop:
mov.b	[W2++], W0				; harfi W0'a yükle (byte modunda Program counter 1 artar)
cp0	W0					     ; karakter 0 ise string sonu
bra	z, main_loop				   ; Z=1 ise main loop'a git
mov	W0, U1TXREG				; harfi buffer'a at
xmt_loop:
btss	U1STA, #TRMT				; gönderildi mi?( gönderilince 1 olur)
bra	$-2					       ; Gönderilinceye kadar bekle
bra	wrt_loop				     ; next harfi gönder

PORTLARI_HAZIRLA:
clr	LATF					; portu temizle
mov	#0xFF,w0
mov	w0,TRISF
return

; Instruction cycle = 20MIPS
; ds30f3010 üzerinde TMR1 A tipi timerdır. (50ns x prescale x PR1 = zaman)
; zaman =0,5sn için, prescale=1/256  (0,5sn= 500ms=500 000us)
; 50nsx256=12580ns=12,8us
; PR1 = 500 000us / 12,8us = 39765=0x9B41
INIT_TIMER1:
clr	TMR1
MOVLF	#0x9B41,PR1				; PR1'e yükle
MOVLF	#0x8030, T1CON				; 1:256 prescale ve timer1 on
bclr	IFS0, #T1IF				; TMR1 interrupt flag clear
bset	IEC0, #T1IE				; TMR1 interrupt set
return

INIT_UART1:
clr 	U1MODE					; Uart mode clear et, bit ile ayarlayacağız
clr 	U1STA					; status biti clear et,  bit ile ayarlayacağız
;	bset	U1MODE, #ALTIO				; U1ATX/U1ARX pinlerini kullan
bset 	U1MODE, #UARTEN 			; Enable UART
mov 	#(((FCY/BAUDRATE) / 16) - 1), w0
mov 	w0, U1BRG				; BRG ayarla
return

.end

/*********************************************************/
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.uicroarm.com/dspic-asm30-ile-uart/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

