PMC150是应广科技2013年新推的一颗纯IO功能的MCU,最大可以出9个引脚,一般封装为SOP8,SOT23-6或者DIP8(在小家电等产品上应用)。
目前已经大量使用在数据线,程序加密,豆浆打磨机,自行车灯,红外遥控器,摩托车,电单车报警器等产品上。
PMC150具有两个中断功能,一个是外部IO口中断,一个是定时器中断。一些刚入手的用户总是反应设置不对,不工作
所以单独和大家说说使用。
需要用到的控制寄存器和指令分别是:
1. 中断允许寄存器INTEN,可读写:
bit0控制PA0外部输入中断;
bit2控制定时器T16中断;
其他位保留,一般设置为0
2. 中断标志寄存器INTRQ,可读写:
bit0是PA0外部输入中断标志;
bit2是定时器T16中断标志;
其他位保留,一般设置为0
3. 中断边沿选择寄存器INTEGS,只写:
INTEGS.1~INTEGS0:
0 0 A0上升沿和下降沿都产生中断;
0 1 A0上升沿产生中断;
1 0 A0下降沿产生中断;
1 1 :保留,不使用
INTEGS.4:
0 :T16时钟上升沿产生中断;
1 :T16时钟下降沿产生中断;
其他位保留
4.特别指令:
engint: 使能总的中断
disgint: 关闭总的中断
和大家的IC一样,用起来很简单的。
请看DEMO程序,该程序利用T16产生50us的中断,由PA6输出,并产生25ms的脉冲方波信号,由PA4输出
另外PA0产生外部中断,在终中断中取反PA3.
//***************************************************************************
//***** PMC150 Peocessor Application Example Project *****
//***************************************************************************
// Project Name :: PMC150
// Version :: V0.0
// Module Name ::
// Abstract :: interruput study 中断使用例程
//
// Environment:
// PADAUK FPPA(TM) IDE Tool Version : 0.58
//
// Revision History:
// DEC. 5, 2013 Raker.Yang Created
/////////////////////////////////////////////////////////////////////////
// Copyright (C) 2013 by A-Tech Electronic Technology Co. Ltd. All rights reserved.
#define WTD_ON set1 clkmd.1
#define WTD_OFF set0 clkmd.1
T16_Base EQU 32568 + 10 // ICE = 32568 + 20
//设定50us 中断,定时器为系统时钟,4M,需要计数200次。
//计数初值为32768 -200 = 32568
KEY_IN equ pa.7 //按键输入
//BLU_OUT equ pa.4 //低1.4s,高2.8s
INT_IN equ pa.0 //
LED_RED_OUT equ pa.4 //
LED_GRN_OUT equ pa.3 //
PWM_T16_OUT equ pa.6
.ramadr 0
word t16_cnt;
word led_flash_cnt;
byte sysflag;
f_ledg_on equ sysflag.0 //add--->1; sub --->0
f_ledr_on equ sysflag.1
f_pwm_t16 equ sysflag.2
void t16init(void);
void t16_init(void)
{
word t16_index;
T16M = 0x27; //2F,系统时钟除以1,BIT15位中断
t16_index = T16_Base;
stt16 t16_index;
}
void FPPA0 (void)
{
byte key_value,key_value_bak;
byte sys_stop_cnt;
byte a_temp_m;
.ADJUST_IC SYSCLK=IHRC/4, IHRC=16MHz, VDD=3.3V//, Bandgap=On;
WTD_OFF; // WatchDog Enable
misc = 0x20;
intrq = 0x00;
inten.pa0 = 1; //开启定时器和PA0中断
inten.t16 = 1;
integs = 0;
//io_init();
pa = 0xff;
paph = 0x01; //PA0输入上啦,其他口都为输出
pac = 0xfe;
$ padier 0xf9; //所有口都为数字口,注意保留口不能设置为1
sysflag = 0;
t16_init();
wdreset;
WTD_ON;
engint;
while (1)
{ //a
if(inten.7 == 0)
{
goto 0;
}
else
{
wdreset;
}
//===============================================
} //aa
}
void Interrupt (void)
{
byte temp;
pushaf //
if (Intrq.T16) //timer interruput
{
ldt16 t16_cnt;
temp = t16_cnt$0;
t16_cnt = T16_Base+temp;
stt16 t16_cnt;
if(f_pwm_t16 == 1)
{
f_pwm_t16 = 0;
PWM_T16_OUT = 1;
}
else
{
f_pwm_t16 = 1;
PWM_T16_OUT = 0;
}
if(led_flash_cnt < 10000)
{
led_flash_cnt++;
if(led_flash_cnt < 5000)
{
f_ledr_on = 1;
}
else
{
f_ledr_on = 0;
}
}
else
{
led_flash_cnt = 0;
}
if(f_ledr_on == 1)
{
LED_RED_OUT = 0;
f_ledr_on = 0;
LED_RED_OUT = 0;
}
else
{
LED_RED_OUT = 1;
f_ledr_on = 1;
LED_RED_OUT = 1;
}
Intrq = Intrq & 0xfb;
}
if(Intrq.pa0)
{
if(f_ledg_on == 1)
{
f_ledg_on = 0;
LED_GRN_OUT = 0;
}
else
{
f_ledg_on = 1;
LED_GRN_OUT = 1;
}
Intrq = Intrq & 0xfe;
}
popaf // At PDK80CXX, not support the command
}
|