打印

〔求助〕我的cy8c29866程序进不了I/O中断呀

[复制链接]
3357|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wswb|  楼主 | 2008-6-15 12:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的cy8c29866程序进不了I/O中断,但是能够进入UART中断,希望有人能够帮忙解决,在下感激不尽。
我的相关程序如下:
boot.asm中的中断设置为:
    org   1Ch                      ;GPIO Interrupt Vector
    ljmp    PSoC_GPIO_ISR
    reti
在device editor中将要产生中断的端口POO设置为:
stdcpu HighZ RisingEdge,然后点击了generate applaction按钮
main.c为:
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#pragma interrupt_handler UART_TX_ISR
#pragma interrupt_handler UART_RX_ISR
#pragma interrupt_handler PSoC_GPIO_ISR
#define Port6 PRT6DR                 
#define over  (PRT0DR&0x04)>>2        
#define EN_1  PRT0DR=PRT0DR|0x50       
#define EN_0  PRT0DR=PRT0DR&0xaf       
#define CLK_0 PRT2DR=PRT2DR&0xfa     
#define CLK_1 PRT2DR=PRT2DR|0x05       
#define WR_W  PRT2DR=PRT2DR|0x50      
#define WR_R  PRT2DR=PRT2DR&0xaf     
unsigned char cmd=0;
unsigned char flag_wr=0;
unsigned char start=0;
unsigned char  databuffer[160];
unsigned char row_finish=0;
unsigned char counter_collum=0;
unsigned char counter_row=0;
void UART_TX_ISR(void)
{
   UART_1_PutChar(over);
}
void UART_RX_ISR(void)
{
  cmd=UART_1_cGetChar( );
  if (cmd==0xe2)UART_1_PutChar(over);
}
void PSoC_GPIO_ISR(void)
{EN_1;CLK_0;WR_W;
 }
void main()
{   
      UART_1_CmdReset();                    
     UART_1_IntCntl(UART_1_ENABLE_RX_INT|UART_1_ENABLE_TX_INT);
// Enable RX&TX interrupts     
     UART_1_Start(0x00);         // Enable UART  
    
    M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO); 
   //以下四条注释掉的语句为自己的I/O中断的配置,不能够进入中断,后来换 // 为了M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO)但是仍然不行
   // PRT0IC0=0X00;//P102 int mode
   // PRT0IC1=0X04;
   // PRT0IE=0X04;//INT ENABLE P142
   // INT_MSK0=0X20;//MASK
    M8C_EnableGInt ;                     
 // Turn on interrupts         
 cmd=0xe2; 
     while(1);
 
}
沙发
ni_labview| | 2008-6-16 11:03 | 只看该作者

兄弟,试验一下这个看看

在初始化时加INT_MSK0&=~INT_MSK0_GPIO;看看怎么样
可否看看你的I/O中断处理程序怎么写的否

使用特权

评论回复
板凳
wswb|  楼主 | 2008-6-16 12:51 | 只看该作者

给2楼兄弟的回复

多谢2楼的兄弟,你的方法我会试一试
我的中断程序就是置标识,我程序里面已经给了,还是单独列出来吧,如下:
#pragma interrupt_handler PSoC_GPIO_ISR
void PSoC_GPIO_ISR(void)
{EN_1;CLK_0;WR_W;
}

使用特权

评论回复
地板
ni_labview| | 2008-6-16 18:04 | 只看该作者

那你这么改试验没准可以

把boot.asm中改成APSoC_GPIO_ISR
程序中也改成同样APSoC_GPIO_ISR,再加上初始化INT_MSK0&=~INT_MSK0_GPIO


boot.asm中的中断设置为:
    org   1Ch                      ;GPIO Interrupt Vector
    ljmp    _APSoC_GPIO_ISR
    reti
注意下滑线!!!

void APSoC_GPIO_ISR(void)
{EN_1;CLK_0;WR_W;
}

按这再不成找CYPRESS,相信组织上会为你做主,哈哈

使用特权

评论回复
5
wswb|  楼主 | 2008-6-16 19:32 | 只看该作者

回复ni_labview

你的两种方法都试过了,不行,不过还是谢谢你!希望有人能够帮忙解决,我按照以下改的:

boot.asm中的中断设置为:
    org   1Ch                      ;GPIO Interrupt Vector
    ljmp    _APSoC_GPIO_ISR
    reti

中断程序为:
void APSoC_GPIO_ISR(void)
{EN_1;CLK_0;WR_W;
UART_1_PutChar(0Xff); //如进入中断的话,发送0xff给电脑
}
主程序为:
void main()
{     
    UART_1_CmdReset();                     
 // Initialize receiver/cmd  buffer                                   
    UART_1_IntCntl(UART_1_ENABLE_RX_INT|UART_1_ENABLE_TX_INT);   
  // Enable RX&TX interrupts  
    UART_1_Start(0x00);         // Enable UART  
    INT_MSK0&=~INT_MSK0_GPIO;
    M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO); 
     M8C_EnableGInt ;                      // Turn on interrupts  
        cmd=0xe2; 
     UART_1_PutChar(0Xee);//发送0xee给电脑,表示初始化完毕
     while(1)
    {
      CLK_0;
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      asm("nop");asm("nop");
      CLK_1;     
       
    }
结果电脑只能够收到一个0xee。我是将p00设置为上升沿中断的,然后将p20(设置为上拉输出,产生方波信号〔while循环中实现产生方波〕)连接到P00。

使用特权

评论回复
6
ni_labview| | 2008-6-17 11:16 | 只看该作者

再看一下

中断处理程序是否有下面这条:
#pragma interrupt_handler APSoC_GPIO_ISR //这条没看到你是否写了
void APSoC_GPIO_ISR(void)
{EN_1;CLK_0;WR_W;
UART_1_PutChar(0Xff); //如进入中断的话,发送0xff给电脑
}

使用特权

评论回复
7
wswb|  楼主 | 2008-6-17 17:32 | 只看该作者

回复6楼

多谢你的再度关注!我可以肯定的说,我程序里面有这一条语句:
#pragma interrupt_handler APSoC_GPIO_ISR
但是这程序就是进不了IO中断,只能够进入UART相关中断。

使用特权

评论回复
8
PSoC_Rock| | 2008-6-18 10:18 | 只看该作者

I/O口中断设了吗?

在device editor中将要产生中断的端口POO设置为:
stdcpu HighZ RisingEdge,然后点击了generate applaction按钮

但后面的I/O口中断enable设了吗?

使用特权

评论回复
9
wswb|  楼主 | 2008-6-18 18:39 | 只看该作者

回复PSoC_Rock

RisingEdge 就是enableI/O中断啊

使用特权

评论回复
10
ni_labview| | 2008-6-19 09:49 | 只看该作者

再看一下,方便的话可否发project到my mail

main.c为:
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#pragma interrupt_handler UART_TX_ISR
#pragma interrupt_handler UART_RX_ISR
#pragma interrupt_handler PSoC_GPIO_ISR    ?????????把它删掉

使用特权

评论回复
11
wswb|  楼主 | 2008-6-19 11:42 | 只看该作者

回复10楼

我已将project发送给你,帮我看看,谢谢!
你的方法我下午试试看。

使用特权

评论回复
12
wswb|  楼主 | 2008-6-20 10:45 | 只看该作者

回复10楼

我按照你的方法试了,还是不行;然后我将该project的器件改为CY8C29466(相应的配置也做了修改),按照该页面上的所有方法,在CY3210开发板上还是不能够进入I/O中断,开发板应该不会有问题吧(这可是cypress官方的开发板呢!)?

使用特权

评论回复
13
tec2| | 2008-8-11 16:56 | 只看该作者

#define EN_1 PRT0DR=PRT0DR|0x50

#define EN_1  PRT0DR=PRT0DR|0x50 接收端口是不可以这样做的,这样可能改变端口的值。输出端口可以这样,输入端只能定义为#define EN_1  (PRT0DR|0x500). 

使用特权

评论回复
14
whlz58| | 2008-8-13 09:16 | 只看该作者

配置时开中断,不修改boot.asm 改 psocgpioint.asm

PSOC的C编译器处理不同

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

15

帖子

0

粉丝