Uart1 interrupt ını çalıştıramadım, başlangıçta terminalden UART1'e gönderdiğim yazıyı görebiliyorum fakat terminalden gönderdiğim karakterler kesme oluşturmuyor sanırım,
kodlar;
#define output_low(x) x=0;
#define output_high(x) x=1;
#define delay_cycles(x) delay_us(x);
#define output_bit(x,y) x=y;
void delay_us(unsigned long deger);
void delay_ms(unsigned long ms);
void ConfigureOperatingFrequency(void);
void init_uart1(void);
void initTimerA0(void);
void text_write ( _far char * msg_string) ;
#pragma INTERRUPT U1rec_ISR
void U1rec_ISR (void);
void main(void);
#include "sfr26a.h"
#include "lcd_flex.c"
#include "init.c"
#include "stdio.h"
char U1_in;
void main(void)
{
ConfigureOperatingFrequency();
//initTimerA0();
lcd_init();
lcd_gotoxy(2,1);
lcd_puts("Emre");
init_uart1();
text_write("Emre\r\n");
while(1){
}
}
void init_uart1(void){
u1mr = 0x74; //01110100;
u1c0 = 0x10; //00010000;
u1brg = 0x81; //129;
ucon = 0x00;
u1tb = u1rb;
u1tb = 0;
asm("FCLR I"); // disable irqs before setting irq registers
s1ric = 0x04; // Enable UART0 receive interrupt, priority level 4
asm("FSET I"); // Enable all interrupts
u1c1 = 0x05;
}
void U1rec_ISR(void){
p7_6=~p7_6;
while(ri_u1c1 == 0); // make sure receive is complete
U1_in = u1rb; // read in received data
if (U1_in == 'z'){ // If "z" was entered do the following:
while(ti_u1c1 == 0); // wait for previous transmission to complete
u1tb = 'z'; // echo "z" to screen
}
}
void text_write ( _far char * msg_string)
{
char i;
for (i=0; msg_string[i]; i++){ // This loop reads in the text string and
while(ti_u1c1 == 0); // puts it in the UART 0 transmit buffer
u1tb = msg_string[i];
}
}
sect30.inc:
;----------------------------------------------------------------------
; |
; |
; |
; DESCRIPTION : Section definition. (for Assembler language) |
; |
; |
; This file is generated by Renesas Project Generator. |
; |
;----------------------------------------------------------------------
;/*********************************************************************
;*
;* Device : M16C Series
;*
;* File Name : sect30.inc
;*
;* Abstract : Section definition
;*
;* History : 1.20 (2009-01-26)
;*
;* NOTE : THIS IS A TYPICAL EXAMPLE.
;*
;* Copyright (C) 2009 (2010) Renesas Electronics Corporation.
;* and Renesas Solutions Corporation. All rights reserved.
;*
;*********************************************************************/
;=====================================================================
;
; Definition of section
;
;---------------------------------------------------------------------
; Near RAM data area
;---------------------------------------------------------------------
; SBDATA area
.section data_SE,DATA,ALIGN
.section bss_SE,DATA,ALIGN
.section data_SO,DATA
.section bss_SO,DATA
; SBDATA area definition
; Sets the top address (__SB__) of the SBDATA area
; (it is accessing area to used the SBrelative addressing mode).
.glb __SB__
__SB__ .equ 400H
; near RAM area
.section data_NE,DATA,ALIGN
.section bss_NE,DATA,ALIGN
.section data_NO,DATA
.section bss_NO,DATA
;---------------------------------------------------------------------
; Stack area
;---------------------------------------------------------------------
.if __STACKSIZE__ != 0
.section stack,DATA,ALIGN
.blkb __STACKSIZE__
.endif
.section istack,DATA,ALIGN
.blkb __ISTACKSIZE__
;---------------------------------------------------------------------
; heap section
;---------------------------------------------------------------------
.if __HEAPSIZE__ != 0
.section heap_NE,DATA,ALIGN
.blkb __HEAPSIZE__
.endif
;---------------------------------------------------------------------
; Far RAM data area
;---------------------------------------------------------------------
.if __FAR_RAM_FLG__ != 0
.section data_FE,DATA,ALIGN
.section bss_FE,DATA,ALIGN
.section data_FO,DATA
.section bss_FO,DATA
.endif
;---------------------------------------------------------------------
; Initial data of 'data' section
;---------------------------------------------------------------------
.section data_SEI,ROMDATA
.section data_SOI,ROMDATA
.section data_NEI,ROMDATA
.section data_NOI,ROMDATA
.if __FAR_RAM_FLG__ != 0
.section data_FEI,ROMDATA
.section data_FOI,ROMDATA
.endif
;---------------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------------
.section vector,ROMDATA,ALIGN
.org VECTOR_ADR
; When you use "#pragma interrupt" with "vect=",
; you need not define interrupt vector.
;
; When you use "#pragma interrupt" without "vect=",
; you must define all interrupt vectors like the following example.
; You define dummy_int for interrupt vector not used.
;
.lword dummy_int ; vector 0
.lword dummy_int ; vector 1
.lword dummy_int ; vector 2
.lword dummy_int ; vector 3
.lword dummy_int ; vector 4
.lword dummy_int ; vector 5
.lword dummy_int ; vector 6
.lword dummy_int ; vector 7
.lword dummy_int ; vector 8
.lword dummy_int ; vector 9
.lword dummy_int ; vector 10
.lword dummy_int ; vector 11
.lword dummy_int ; vector 12
.lword dummy_int ; vector 13
.lword dummy_int ; vector 14
.lword dummy_int ; vector 15
.lword dummy_int ; vector 16
.lword dummy_int ; vector 17
.lword dummy_int ; vector 18
.lword dummy_int ; vector 19
.glb U1rec_ISR
.lword U1rec_ISR ; vector 20
.lword dummy_int ; vector 21
.lword dummy_int ; vector 22
.lword dummy_int ; vector 23
.lword dummy_int ; vector 24
.lword dummy_int ; vector 25
.lword dummy_int ; vector 26
.lword dummy_int ; vector 27
.lword dummy_int ; vector 28
.lword dummy_int ; vector 29
.lword dummy_int ; vector 30
.lword dummy_int ; vector 31
;---------------------------------------------------------------------
; for User Boot Code Area
; Please custumize this data for your setting.
;---------------------------------------------------------------------
.if 0
.section _UB_section_FE,ROMDATA
.org 013ff0H
.byte 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ; User boot code
.word 0FFFFh ; Port address
.byte 0FFh ; Port bit
.byte 0FFh ; Boot level
.byte 0FFh,0FFh,0FFh,0FFh ; Reserved
.endif
;---------------------------------------------------------------------
; fixed vector section
;---------------------------------------------------------------------
.section fvector,ROMDATA
.org 0fffdcH
UDI:
.lword dummy_int
OVER_FLOW:
.lword dummy_int
BRKI:
.lword dummy_int
ADDRESS_MATCH:
.lword dummy_int
SINGLE_STEP:
.lword dummy_int
WDT:
.lword dummy_int
DBC:
.lword dummy_int
NMI:
.lword dummy_int
RESET:
.lword start
;=====================================================================
; ID code & ROM code protect
;---------------------------------------------------------------------
; ID code check function
.id "#FFFFFFFFFFFFFF"
; ROM code protect control address
; .protect 00H
;=====================================================================
; Initialize Macro declaration
;---------------------------------------------------------------------
N_BZERO .macro TOP_,SECT_
mov.b #00H,R0L
mov.w #(TOP_ & 0FFFFH),A1
mov.w #sizeof SECT_,R3
sstr.b
.endm
N_BCOPY .macro FROM_,TO_,SECT_
mov.w #(FROM_ & 0FFFFH),A0
mov.b #(FROM_ >> 16),R1H
mov.w #TO_,A1
mov.w #sizeof SECT_,R3
smovf.b
.endm
BZERO .macro TOP_,SECT_
push.w #sizeof SECT_ >> 16
push.w #sizeof SECT_ & 0ffffh
pusha TOP_ >> 16
pusha TOP_ & 0ffffh
.stk 8
.glb _bzero
.call _bzero,G
jsr.a _bzero
.endm
BCOPY .macro FROM_ ,TO_ ,SECT_
push.w #sizeof SECT_ >> 16
push.w #sizeof SECT_ & 0ffffh
pusha TO_ >> 16
pusha TO_ & 0ffffh
pusha FROM_ >> 16
pusha FROM_ & 0ffffh
.stk 12
.glb _bcopy
.call _bcopy,G
jsr.a _bcopy
.endm
yardımcı olursanız sevinirim.
Kesme oluşmaması için bir sebep görünmüyor. Başlangıçta Uart1'e gönderdiğim yazıyı görebiliyorum demişsiniz. İlk veri geldikten sonra bir daha alamıyor musunuz?
while(ri_u1c1 == 0);
satırını kaldırabilirsiniz , gereksiz. Zaten alma tamamlanınca kesme oluşuyor.
Yani M16C den gönderdiğim yazıyı PC terminal programında görebiliyorum, fakat PC terminal ekranından gönderdiğim karakter kesmeye düşmüyor gibi geliyor,
çünkü p7_6 da bir led var, kesmeye girmiş olsa o ledi yakacak ve farkedeceğim, ama ledde hiç bir hareket yok
Yani hiç veri gelmiyor sanırım,
sect30.inc içinde ki vector tanımlamasında bir sorun yok değil mi?
Vektör tanımında bir sorun dikkatimi çekmedi.
#pragma INTERRUPT U1rec_ISR
tanımını fonksiyon prototipininin başında yapmışsınız. Normalde sorun olmaması gerekir.
Ama bir de bu tanımı asıl fonksiyonun başında yapıp denermisiniz.
Eveeeett, Klein öncelikle sana çok teşekkür ederim,
HEW ile proje oluşturmuştum, HEW intprg.c diye bir dosya oluşturmuş, bunun içinde de kesme tanımlamaları vardı,
Sanırım HEW ilk o dosyayı okuyor, kesme oluşuyordu fakat intprg.c içinde ki kesme programında herhangi bir kod olmadığından işlem yapılmıyordu.
Yeniden bir proje oluşturdum, eski kodları içine ekledim, ve kesme dahil tüm fonksiyonlar çalıştı.
Proje dosyalarını aşağıya yüklüyorum,
10Mhz kristal 8(Xout) ve 10(Xin) pinlerde,
0260F6A (M16C/tiny 26A)
LCD (1602K) RS-->p9_0 (pin3), RW-->0 (direk GND ye bağlı), E-->p9_1 (pin2), D4-->p10_0(pin45), D5-->p10_1(pin43), D6-->p10_2 (pin42), D7-->p10_3 (pin41)
UART1 Tx-->pin26, Rx-->pin27 9600Bps,7Data bits, 2 Stop bits, Even Parity.
lcd_flex.c nette bulunan ve CCS C için yazılmış dosyanın uyarlamasıdır.
Diğer fonksiyonlar da sağdan soldan derleme fonksiyonlardır.
rar şifresi www.picproje.org
http://hotfile.com/dl/121553265/3f6649c/IKI.rar.html (http://hotfile.com/dl/121553265/3f6649c/IKI.rar.html)
IAR kullanıyorsun sanırım. Yukarıda belirtmişler aslında ama ben genel olarak IAR Renesas interrupt sisteminden bahsedeyim. Interrupt vectörünün atanması normalde bir startup dosyasında belirtilmesi lazım ama IAR bu konuda çok pratik bir çözüm sunduğu için #pragma kullanarak vectörü derleme zamanında istediğin noktada oluşturabiliyorsun. Yapman gereken kullanacağın vektörü listeden bularak ister bişr sembolik sabit ile istersen rakamsal olarak #pragma bildirimine vermen ve C dilini kullandığın için bir türü olmayan (void *) bir adres noktası lazım (kısaca biz buna fonksiyon diyoruz) . Fonksiyonun bildirimini yapmana gerek yok, zaten bunu senin yerine yapan bir #pragma denetimi var.
Yukarıda yazanlar bu işin dökümanında yazanların özeti, senin burada yapman gereken bir .c dosyasının içerisinde bir fonksiyon belirlemen ve #pragma bildirimi ile vectörü bu fonksiyona yönlendirmen. Böylece seçtiğin interrupt anında PC bu fonksiyona düşecek ve kodlarını yürütecektir.
Sevgiler..
IAR değil, HEW4 kullanıyorum,
Zaten sorunu da çözmüştüm, çözümü de son mesajımda yazmıştım, örnek olsun diye,
Sizin çözüm de IAR da nasıl olacağını gösteriyor,
İlginize teşekkürler.
Ben M16C ile 3 yıldır uğraşıyorum ve IAR ile devam ettiğim için diğer derleyicilere hiç bakmadım. Bir link gönderebilrsen incelerim..
ne linki istediğinizi tam olarak anlamadım ama HEW linki : http://www.renesas.com/products/tools/ide/ide_hew/index.jsp (http://www.renesas.com/products/tools/ide/ide_hew/index.jsp)
benim proje ile ilgili link te önce ki mesajımda var, bakabilirsiniz.