//high_Clk = IHRC_16M
//Fosc = 16MHz
//Fcpu = Fosc/4 = 4MHz 由编译选项(CODE OPTION)设置
#include "SN8P2711A.h"
#include "define.h"
#include "func.h"
#include "gpio.h"
#include "keys.h"
#include "tim0.h"
#include "tim1.h"
// extern GLOB g;
extern KEYS k;
extern TIME t;
extern BOOL b;//位域的定义
//===============================================================================================
// TC0 set 0.1ms interval time for TC0 interrupt. IHRC:16M Fcpu=Fosc/4 T0RATE=111 (Fcpu/2)
//===============================================================================================
//
// TC0 initial val = 256-(T0 interrupt interval time*clocl)
// = 256-(0.1ms*16MHz /4 /2)
// = 256-(0.0001*16*1000000/4/2)
// = 256-200
// = 56
//
void TIM0_Init(void)
{
TC0M=0x00; // 复位TC0
FTC0ENB=0; // TC0启动控制位 0=关闭 1=开启
FTC0IEN=0; // 禁止 TC0 interrupt
FTC0IRQ=0; // 清除 TC0 interrupt request flag
// T0M=0x00;
FTC0X8=0;
// Bit 1,TC0GN,0 = 禁止 TC0 的唤醒功能;
// Bit 2,TC0X8,0 = TC0 内部时钟来自 Fcpu, TC0RATE = Fcpu/2~Fcpu/256;1 = TC0内部时钟来自Fhosc,TC0RATE = Fosc/1~Fosc/128。
// Bit 3,TC1X8,0 = TC1 内部时钟来自 Fcpu, TC1RATE = Fcpu/2~Fcpu/256;1 = TC1内部时钟来自Fhosc,TC1RATE = Fosc/1~Fosc/128。
TC0M=0x70; // Fcpu/4, 内部时钟(Fcpu 或 Fosc)
// Bit0: FPWM0OUT=0;//0 = 禁止PWM输出;1 = 使能PWM输出,PWM输出占空比由T0OUT和ALOAD0控制
// Bit1: FTC0OUT=0;//0 = 禁止,P5.4作为输入/输出口;
// Bit2: FALOAD0=0;//自动装载控制位。仅当PWM0OUT = 0时有效。0 = 禁止;1 =允许
// Bit3: FTC0CKS=0;//0 = 内部时钟(Fcpu或Fosc);1= 外部时钟,由P0.0/INT0输入
// Bit6-4: FTC0RATE[2:0]=010;//TC0分频选择位
/*
TC0RATE [2:0] TC0X8 = 0 TC0X8 = 1
000 Fcpu / 256 Fosc / 128
001 Fcpu / 128 Fosc / 64
010 Fcpu / 64 Fosc / 32
011 Fcpu / 32 Fosc / 16
100 Fcpu / 16 Fosc / 8
101 Fcpu / 8 Fosc / 4
110 Fcpu / 4 Fosc / 2
111 Fcpu / 2 Fosc / 1
*/
// Bit7: FTC0ENB=0;//TC0启动控制位0 =关闭;1 =开启
TC0C=56; // 0.1ms interrupt Once
TC0R=56;
FALOAD0=1; // enable auto re-load
// FTC0ENB=1; // Enable TC0 timer
// FTC0IEN=1; // Enable TC0 interrupt
FTC0IRQ=0; // Clean TC0 interrupt request flag
}
void TIM0_Onn(void)
{
FTC0ENB=1; // Enable TC0 timer
FTC0IEN=1; // Enable TC0 interrupt
}
void TIM0_Off(void)
{
FTC0ENB=0; // Disable TC0 timer
FTC0IEN=0; // Disable TC0 interrupt
}
//===============================================================================================
//中断服务程序,进入中断后再查询中断标志
//===============================================================================================
void __interrupt[0x08] interrupt_isr(void)
{
//----------------------------------------
//INT1中断,P0.1按键外部中断唤醒
//----------------------------------------
if((FP01IEN==1)&&(FP01IRQ==1))
{
FP01IRQ=0;//清中断标记
// FP01IEN=0;//禁止P0.1外部中断(INT1)控制位
bbbit_zcd_once=1;
bbbit_zcd_lost=0;
t.cnt_zcd_lost=0;
b.bit_zcd_over=0;
if(k.val>0)
{
if(PORT_IDR_ZERO==0)
{
bbbit_zcd_keys=1;
}
}
}
//----------------------------------------
//TC0中断,定时0.1ms
//----------------------------------------
if((FTC0IEN==1)&&(FTC0IRQ==1))
{
FTC0IRQ=0;//清中断标记
if(bbbit_zcd_once==1)
{
///////////////////////////////////////////////////
//过零信号,持续验证是否消失
///////////////////////////////////////////////////
if(b.bit_zcd_over==0)
{
t.cnt_zcd_lost++;
if(t.cnt_zcd_lost>=250)//0.1ms*250=25ms累加超限,说明ZCD信号消失
{
t.cnt_zcd_lost=0;
bbbit_zcd_lost=1;
b.bit_zcd_over=1;
}
}
///////////////////////////////////////////////////
//按键+指示灯定时
///////////////////////////////////////////////////
if(++t.cnt_20ms0_keys>=200)//0.1ms*200=20ms
{
t.cnt_20ms0_keys=0;
bbbit_20ms0_keys=1;
if(++t.cnt_500ms_leds>=25)//20ms*25=500ms
{
t.cnt_500ms_leds=0;
if(k.val==0)
{
LED5_XOR;
LED6_XOR;
LED7_XOR;
}
}
}
}
///////////////////////////////////////////////////
//过零检测+PWM输出
///////////////////////////////////////////////////
if(bbbit_zcd_keys==1)
{
//=================================================
//第1档开关键延时
//=================================================
if(t.cnt_delay1_constant<DELAY_BEFORE_GEAR0)
{
if(++t.cnt_delay1_constant>=DELAY_BEFORE_GEAR0)
{
bbbit_delay1_constant=1;
t.cnt_adjust_volatile=t.cnt_delay1_constant;
//PWM 50%
}
}
//=================================================
//第1,2,3档切换键延时
//=================================================
else
{
if(bbbit_delay2_buz1mode==1)
{
if(++t.cnt_delay3_volatile>=t.cnt_adjust_volatile)
{
t.cnt_delay3_volatile=0;
bbbit_delay3_volatile=1;
bbbit_delay2_buz1mode=0;
//PWM 50%
}
}
}
//=================================================
//后续的PWM延时
//=================================================
if((bbbit_delay1_constant==1)||(bbbit_delay3_volatile==1))
{
t.cnt_delay2_buz1mode++;
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//PWM电平翻转↓↓↓↓↓↓↓↓↓↓
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
if(t.cnt_delay2_buz1mode<=1)
{
PORT_ODR_TRG2=1;//PWM 100%
}
else if((t.cnt_delay2_buz1mode>=2)&&(t.cnt_delay2_buz1mode<=(DELAY_ACTION_A-1)))//0.1ms*(15-1)=1.4ms
{
PORT_ODR_TRG2=~PORT_ODR_TRG2;//PWM 50%
}
else if((t.cnt_delay2_buz1mode>=(DELAY_ACTION_A))&&(t.cnt_delay2_buz1mode<=(DELAY_ACTION_B+1)))//0.1ms*(101-15)=8.6ms
{
PORT_ODR_TRG2=1;//PWM 100%
}
else if((t.cnt_delay2_buz1mode>=(DELAY_ACTION_B+2))&&(t.cnt_delay2_buz1mode<=(DELAY_ACTION_C-1)))//0.1ms*(115-101)=1.4ms
{
PORT_ODR_TRG2=~PORT_ODR_TRG2;//PWM 50%
}
else
{
PORT_ODR_TRG2=1;//PWM 100%
bbbit_zcd_keys=0;
bbbit_delay1_constant=0;
bbbit_delay3_volatile=0;
t.cnt_delay2_buz1mode=0;
bbbit_delay2_buz1mode=1;
if(t.cnt_adjust_volatile>k.val_delays_selected)
t.cnt_adjust_volatile--;
if(t.cnt_adjust_volatile<k.val_delays_selected)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
sn8p2711a.zip (56个子文件)
Include
sn8p2711a.prj 4KB
_sn8p2711a.msk 2KB
Lib
sn8p2711a.cfg 8KB
_sn8p2711a.cfg 8KB
_sn8p2711a.cop 425B
sn8p2711a.wsp.bkp 52B
Src
tim0.c 8KB
tim0.h 130B
main.c 949B
keys.h 152B
keys.c 2KB
gpio.h 216B
define.h 4KB
gpio.c 3KB
func.c 2KB
func.h 182B
tim1.h 130B
tim1.c 2KB
sn8p2711a.msk 2KB
makefile 4KB
sn8p2711a.prj.stb 14KB
Bin
sn8p2711a.sn8.dep 147B
sn8p2711a.sn8 2KB
sn8p2711a.out 52KB
_sn8p2711a_inc.h 3KB
Obj
tim1.i 5KB
tim1.asm.as 8KB
keys.asm 17KB
keys.asm.as 13KB
tim0.asm.as 18KB
keys.i 6KB
gpio.o 11KB
sn8p2711a.map 107KB
keys.o 13KB
tim1.asm 9KB
sn8p2711a.lst 63KB
tim0.i 8KB
func.o 12KB
gpio.i 6KB
gpio.asm 12KB
func.asm 14KB
tim1.o 9KB
func.i 6KB
func.asm.as 11KB
main.asm.as 7KB
tim0.o 20KB
main.o 7KB
main.i 5KB
main.asm 8KB
tim0.asm 26KB
gpio.asm.as 10KB
sn8p2711a.plo 67KB
sn8p2711a.wsp.dep 90B
sn8p2711a.wsp 7KB
sn8p2711a.cop 425B
sn8p2711a_inc.h 3KB
共 56 条
- 1
资源评论
御道御小黑
- 粉丝: 61
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功