3446|6

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

万能的eeworld,万能的论坛亲们。万能的单片机高手们。帮个忙看看下边这个程序吧。谢谢了。 [复制链接]

各位大侠 这是小弟写的一个红外接收和发送程序 接收使用外部中断0,1。0用上升沿,1用下降沿。进入下个中断的时候关定时器记录定时器的值,并且初始化在打开计数器。等待下次中断。中断程序都一样。用数组保存每个红外信号长度 但是 编译没有错误 下载到芯片里却没有反应 请大家给我找找错误 谢谢了。 芯片是atmega128 。谢谢各位牛人们。


//ICC-AVR application builder : 2010-5-6 20:45:56
// Target : M128
// Crystal: 8.0000Mhz

#include
#include
#define uchar unsigned char;
unsigned char a[140];//数据存储数组
unsigned char b[140];
unsigned char i=0;
unsigned char j=0;//记录信号位数
unsigned char k;


//TIMER0 initialize - prescale:Stop
// WGM: Normal
// desired value: 8MHz
// actual value: Out of range


//TIMER1 initialize - prescale:Stop
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 8MHz
// actual value: Out of range
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
TCCR1A = 0x00;
}

#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x00 /*INVALID SETTING*/; //reload counter high value
TCNT1L = 0x00 /*INVALID SETTING*/; //reload counter low value
TCCR1B=0X00;//关断定时器1
TIMSK=0X00;//关定时器中断使能
}

//TIMER3 initialize - prescale:Stop
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 8MHz
// actual value: Out of range




#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
TCCR1B=0x00;//关断计数器
  a=TCNT1H;
  b=TCNT1L;
  i++;
  j++;
  timer1_init();
  TCCR1B = 0x02; //start Timer 八分子一分频 开启计数器 工作模式为普通模式
}

#pragma interrupt_handler int1_isr:3//external interupt on INT1
void int1_isr(void)//外部中断1子程序
{
TCCR1B=0x00;//关断计数器
  a=TCNT1H;b=TCNT1L;
  i++;j++;
  timer1_init();
  TCCR1B = 0x02; //start Timer 八分子一分频 开启计数器 工作模式为普通模式
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV  = 0x00; //xtal divider
XMCRA = 0x00; //external memory
timer1_init();
EICRA = 0x0E; //extended ext ints 开外部中断并且0为下降沿有效,1为上升沿有效
EICRB = 0x00; //extended ext ints
EIMSK = 0x03;//中断0 1 使能。
TIMSK = 0x40; //timer interrupt sources 定时器溢出中断使能。
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay_1s(unsigned int k)/////////////////// 发射子程序
{
unsigned int m,n;
for(m=0;m {for(n=0;n<1000;n++);}
}
int main(void)
{
init_devices();//设备初始化
while(TIFR==0X00)
        {
           }
EIMSK = 0x00;//关中断01中断使能
delay_1s(1000);
delay_1s(1000);delay_1s(1000);delay_1s(1000);delay_1s(1000);
DDRA=0X01;//灯亮,学习完成
PORTA=0X01;
CLI();
delay_1s(1000);
DDRA=0X00;
PORTA=0X00;
TCCR3B = 0x00;
TCCR0 = 0x00;//关定时器0,1
k=j;//红外信号位数
j=1;
DDRA=0X02;//红外发射口置0
PORTA=0X00;
TCNT3H=~a[j];
TCNT3L=~b[j];
TCNT0=242;
ETIMSK=0X04;//定时器3溢出中断使能
TIMSK=0X01;//定时器0溢出中断使能
SEI();
TCCR3B=0x12;
TCCR0=0x02;//开始定时器0,3开始计数
while(j {}
while(1)//指示灯亮发射完成
{
DDRA=0X04;
PORTA=0X04;
}
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 242; /*INVALID SETTING*/; //reload counter value13微秒计数
PORTA=~PORTA;
}
#pragma interrupt_handler timer3_ovf_isr:30
void timer3_ovf_isr(void) //TIMER3 has overflow 定时器3溢出中断子程序
{
j++;
TCNT3H =~a[j]; /*INVALID SETTING*/; //reload counter high value
TCNT3L =~b[j]; /*INVALID SETTING*/; //reload counter low value
if(j%2==1)// 奇数数组时候
{ TCCR0=0X02;//开定时器0
}
if(j%2==0)//偶数数组时候
{
TCCR0=0X00;//关断计数器0
PORTA=0X00;//38k端口保持低电平
}
}

最新回复

5楼兄弟  能参考一下你的程序么  我被催的急  谢谢你了  详情 回复 发表于 2010-5-10 15:24
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这个比较难,编译有错误大家还可以帮忙查查,如果说算法有问题让一个局外人帮着查太难了,还是得靠自已。
AVR单片机我倒是懂,不过这种具体应用真帮不上什么忙,只能帮你顶起。
我以前写PS/2键盘时也是编译没错,但就是不对,开始怀疑是硬件问题,结果最后才弄明白原来是PS/2的CLK和DATA两根线使用IO口时有问题,位操作时差了一个位,我相信这种问题发到哪个论坛也不会有人帮忙解决的,还得靠自已查算法。。。
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
UESTC
楼主校友,七系的吧?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
我考下来试一试 我也正在学单片机
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
熔丝设置对么?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
调试要一步一步来,要想办法排除每个环节的问题。
首先要确保红外发射和接收没问题,芯片确实收到了信号。
然后判断两个中断是否正常进入了
第三判断定时器是否正常工作了
类似的程序我也做过,是可以的。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
5楼兄弟  能参考一下你的程序么  我被催的急  谢谢你了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【回帖赢京东卡】说说无线技术那些事儿
即日起—2月28日,参与回帖讨论都有机会赢取【30元京东卡】

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表