M16C/Tiny HEW4 UART1 interrupt

Başlatan esensoy, 19 Haziran 2011, 23: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=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.
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.