|
楼主 |
发表于 2013-12-3 17:35:34
|
显示全部楼层
/************************************************
文件:main.c
用途:
注意:内部8M晶振
************************************************/
//#include "config.h"
#include <iom128v.h> //包含型号头文件
#include <macros.h> //包含"位"操作头文件
#include <stdio.h> //标准输入输出头文件
#include <AVRdef.h>
#define uchar unsigned char
#define uint unsigned int
#pragma interrupt_handler timer1_capture: 12 //指定定时器捕获中断函数
#pragma interrupt_handler timer1_over: 15 //指定定时器溢出中断函数
//#pragma interrupt_handler EXT_INT3: 5 //外部中断INT3
//unsigned int fault = 0;
uint freq=0,i = 1,j = 0,flag = 0,a = 0,b = 0,flag_open = 0;
void Init_IO()//io初始化
{
DDRA |= BIT(0);//继电器控制端IO口初始化
PORTA &= ~BIT(0);
}
void timer1_capture()
{
freq++;
delay_nms(100);
if(freq == 63355)
{
freq = 0;
}
//flag_open = 1;//间接判断电机是否打开,排除大循环电机一直运动
}
void timer1_over()//200MS产生中断一次
{
TCNT1= 0XC2F7;//1S 0X85ED; 200mS
i = freq;
flag++;
switch(flag)
{
case 1:
a = freq;
break;
case 2:
b = freq;
break;
case 3:
b = 1;
break;
default:
flag = 0;
break;
}
//判断两次0.5s的freq(电机转动计数标志)是否相等
if((a == b)&(a != 0)&(b != 1))
{
flag_open = 1;
flag = 0;
a = 1;
b = 1;
}
else
flag_open = 0;
//TCNT1= 0X85ED;//1S 0X85ED; 200mS
}
/*void EXT_INT3(void)
{
up_to_down = 1;
j++;
if(j = 1)
{
}
}
*/
void Init_TIMER1(void)
{
TIMSK |= BIT(5)|BIT(2);//开启溢出中断和捕获中断
TCCR1A = 0X00;//TCCR1A Bit 76543210 COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 胀ǘ丝诓僮鳎?COM1C0 WGM11 WGM10 芆CnA/OCnB/OCnC未连接,普通模式
TCCR1B |= BIT(2)|BIT(7);//clkI/O/1 ( 256预分频),使能噪声抑制器,下降沿捕获
TCCR1B &= ~BIT(6);
TCCR1C = 0X00;//无强制转换
TCNT1= 0XC2F7;//1S 0X85ED; 200mS;//0XE795定时200ms 0X85ed;// 定时1s,TCNT1 = 0X00;//设置计数器初始值 TCNT1H = 0X00;TNCT1L = 0X00;
/*
500ms定时器时间计算
65536-(8M/256)*0.5=49911(0XC2F7)
*/
DDRD &= ~BIT(4);//计数捕获IO口初始化
PORTD |= BIT(4);
}
void main(void)
{
Init_IO();
Init_TIMER1();
EICRA |= BIT(7);//INT3下降沿产生异步中断
EIMSK |= BIT(3);//INT3外部中断使能
SREG |= BIT(7);//SREG=0x80; //开全局中断数据手册的8页
while(1)
{
//a = TCNT1;
if(flag_open == 1)
{
SREG &= ~BIT(7);//SREG=0x80; //关全局中断
flag_open = 0;
freq = 0;//freq重新赋值
//a = TCNT1;
delay_nms(500);//延时1.5s机械爪加紧
//a = TCNT1;
DDRA |= BIT(0);
PORTA |= BIT(0);//继电器动作断开电源
delay_ns(3);
//a = TCNT1;
PORTA &= ~BIT(0);//继电器动作接通电源
//a = TCNT1;
TCNT1= 0XC2F7;
TIFR |= BIT(2);//
/************************************************
Bit 2 – TOV1:T/C1溢出标志
该位的设置与T/C1的工作方式有关。工作于普通模式和CTC模式时,T/C1溢出时TOV1
置位。对工作在其它模式下的TOV1标志位置位,见P 122Table 61 。
执行溢出中断服务程序时OCF1A自动清零。也可以对其写入逻辑"1”来清除该标志位。
************************************************/
SREG |= BIT(7);
}
}
}
程序写的比较丑,我感觉没有配置错,捕获和定时都按时发生,就是捕获的时候,发生了两次中断,很郁闷, |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|