M16C/Tiny HEW4 UART1 interrupt

Başlatan esensoy, 20 Haziran 2011, 02:00:11

esensoy

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=0msg_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.
En tehlikeli an "zafer" anıdır.

Klein

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.

esensoy

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?
En tehlikeli an "zafer" anıdır.

Klein

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.

esensoy

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
En tehlikeli an "zafer" anıdır.

omergokgoz

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..

esensoy

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.
En tehlikeli an "zafer" anıdır.

omergokgoz

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..

esensoy

ne linki istediğinizi tam olarak anlamadım ama HEW linki : http://www.renesas.com/products/tools/ide/ide_hew/index.jsp
benim proje ile ilgili link te önce ki mesajımda var, bakabilirsiniz.
En tehlikeli an "zafer" anıdır.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.