本帖最后由 PSoC小子 于 2012-3-29 22:04 编辑
众所周知,PSoC1的IO支持三种中断模式:上升沿中断、下降沿中断和 ChangeFromRead中断。 Read 指的是读取寄存器(PRTxDR), Change From Read 是说如果当前 PRTxDR 的值和最后一次读取的 PRTxDR 的值相比有变化则触发此中断。
例如把 P0[7] 的中断模式设置成 ChangeFromRead, 然后我们可以使用代码 “X = PRT0DR & 0x80” 来读取PRT0DR 中 P0[7] 的对应位。 在此代码执行完毕后,CPU会自动记录此次读取的 PRT0DR 第7位的值, 所以我们只需完成读的动作而无需关注结果是什么。 下图是GPIO的内部中断逻辑电路。当设置成 ChangeFromRead 模式,中断是否产生只取决于异或门C的输出是否是1,而C的输出取决于两个输入: QinLatch(最后一次读取的PRTxDR的值) 和 INBUF(当前PRTxDR的值)。因此当前PRTxDR的值发生改变时,C的两输入不相同,输出为1 中断产生。
因此使用此中断模式最关键的就是在合适的时机去不断的读取 PRTxDR 的值,这样当输入改变时才有对比的对象。
具体的示例代码如下(P0[7] 为中断输入,P1[7]为LED输出):
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler Cfr_Isr
void Cfr_Isr(void);
BYTE Isr_Flag = 0;
BYTE X;
void main(void)
{
INT_MSK0 |=INT_MSK0_GPIO; //Enable GPIO Interrupt
M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
X = PRT0DR&0x80; //Read action
while(1)
{
if(Isr_Flag) // If interrupt occur
{
Isr_Flag = 0; // Clear Interrupt Flag
PRT1DR ^= 0x80; // Toggle P1[7] output
}
}
}
// Interrupt function
void Cfr_Isr(void)
{
Isr_Flag = 1; // Set Interrupt Flag
X = PRT0DR & 0x80; //Read action
}
Project见附件! |