Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Hitachi, Mitsubishi Mikrodenetleyici => Konuyu başlatan: esensoy - 19 Haziran 2011, 23:00:11

Başlık: M16C/Tiny HEW4 UART1 interrupt
Gönderen: esensoy - 19 Haziran 2011, 23:00:11
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.
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: Klein - 20 Haziran 2011, 13:08:29
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.
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: esensoy - 20 Haziran 2011, 22:55:40
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?
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: Klein - 21 Haziran 2011, 14:09:16
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.
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: esensoy - 21 Haziran 2011, 21:53:34
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)
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: omergokgoz - 03 Ekim 2012, 09:46:21
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..
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: esensoy - 03 Ekim 2012, 11:16:27
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.
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: omergokgoz - 03 Ekim 2012, 13:38:07
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..
Başlık: Ynt: M16C/Tiny HEW4 UART1 interrupt
Gönderen: esensoy - 03 Ekim 2012, 15:34:08
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.