打印
[AVR单片机]

atmega8的定时器1中断问题

[复制链接]
2156|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
树在路上|  楼主 | 2015-11-3 20:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大家一个问题,我用atmega8定时器1定时1秒时间,用iccavr写的C程序,现在遇到一个情况,程序里如果我只写一个中断,就是定时器1的定时中断,中断号9,那么程序是正常的。可是把捕获中断也写入程序,中断号6,捕获控制位没有启用,捕获中断程序里也没有任何程序代码,定时器1中断就无法进入了,这是怎么回事,大家有没有遇到过

相关帖子

沙发
cdwess| | 2015-11-3 20:15 | 只看该作者
//包含所需头文件
#include <ioM8v.h>
#include <macros.h>




/*------宏定义------*/
#define uchar        unsigned char
#define uint        unsigned int



//端口初始化
void port_init(void)
{
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00;
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}


//定时T1初始化
void timer1_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x24;//中断允许
TCNT1H = 0xE1;
TCNT1L = 0x7B;//初始值
OCR1AH = 0xE0;
OCR1AL = 0xFF;//匹配A值
OCR1BH = 0xE0;
OCR1BL = 0xFF;//匹配B值
ICR1H  = 0xFF;
ICR1L  = 0xFF;//输入捕捉匹配值
TCCR1A = 0x00;
TCCR1B = 0x85;//启动定时器
}


//定时器T1输入捕捉中断服务程序
#pragma interrupt_handler timer1_capt_isr:6
void timer1_capt_isr(void)
{
//timer 1 input capture event, read (int)value in ICR1 using;
// value=ICR1L;            //Read low byte first (important)
// value|=(int)ICR1H << 8; //Read high byte and shift into top byte
// TIFR|=BIT(ICF1);//软件写1清中断标志
}


//定时器T1溢出中断服务程序
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCNT1H = 0xE1; //重装值高位
TCNT1L = 0x7B; //重装值低位
}


void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR  = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR   = 0x00;
port_init();
timer1_init();
SEI();//开全局中断
}
//主函数
void main(void)
{
init_devices();
//在这继续添加你的代码
while(1)
{
  NOP();
}
}

应该不会冲突的,看上面标准的,是不是你哪里没设置对

使用特权

评论回复
评论
SD10A 2015-11-3 22:01 回复TA
看到了 在定时器1中~~~~~混在一起了 
SD10A 2015-11-3 22:00 回复TA
输入捕获没看到初始化? 
板凳
树在路上|  楼主 | 2015-11-3 20:18 | 只看该作者
谢谢,我对照你的在试试

使用特权

评论回复
地板
树在路上|  楼主 | 2015-11-4 20:32 | 只看该作者
iccavr中处理数据乘是不是要十进制,后来我发现0x01*0xffff结果是0,而0x01*65535能得到65535,不知道怎么回事

使用特权

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

本版积分规则

8

主题

33

帖子

0

粉丝