极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21807|回复: 16

也来贡献一点东西——关于IRemote库与mega8

[复制链接]
发表于 2013-12-1 16:26:57 | 显示全部楼层 |阅读模式
本帖最后由 一墙一别院 于 2013-12-1 16:42 编辑

到年尾了同事家想搞个GSM防盗器,顺手做了一个,用了mega8的片子,网淘了个sim900a的拆机模块,加上坏主板上的一些部件,可是ARDUINO的IRemote库我想大家因为程序体积问题都是在mega16以上片子的系统上完成设计的吧,因为从来没见到有人说它在mega8上是不好使的,事实也确实如此,它有一个Arduino的兼容性错误(姑且让我这样称呼它吧),因为我的GSM模块是拆机件,人工引出的pwr_key所以是需要外加1s左右的高电平开机的,但在红外控制部分我使用了中断,IRemote库在MEGA8上是使用的定时器1中断,其他片子大多是TIMER2,具体可以去看IRemoteInt文件,很抱歉因为作者这个特殊的设定,造成了一旦在mega8上使用该库文件,那么就会造成Arduino库的所有使用TIMER0的函数不好使,例如delay(),macros()函数,他们都是使用的TIMER0计数器,但是mega8的TIMER0与TIMER1是共用中断寄存器TIMSK的,作者在对TIMER1的TIMSK寄存器赋值时不小心的用了这样一句:“
#if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
  #define TIMER_ENABLE_INTR    (TIMSK = _BV(OCIE1A))
作者没有意识到他在开启TIMER1的比较匹配中断时也将TIMER0的中断溢出位TIMSK的TOIE0位也抹0了,所以现在你只需要做一件事,那就是找到上面那段话毫不留情的将它修改成:
#if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
  #define TIMER_ENABLE_INTR    (TIMSK |= _BV(OCIE1A))
好吧,现在你可以在MEGA8上惬意的享受IRemote库带来的便捷了{:soso_e104:}
外带附上几张我的GSM报警器
另外感觉红外不是很给力,在研究315M波段的收发信器以及NRF24L01,希望有经验的朋友一起来交流下!{:soso_e100:}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-12-1 19:09:53 | 显示全部楼层
为什么我用mega8板子的时候,下载带红外库文件的程序,装不下呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-1 22:33:25 | 显示全部楼层
mega8本来就只有8k的空间,如果烧入bootloader的话就只有7k左右了,光编译IRemote库大概就有7k左右了,你当然烧不进啦,首先我没有烧bootloader,IRemote库也被我精简过了,就剩下了我需要的代码,全部程序下载完4k不到
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-1 23:25:39 | 显示全部楼层
hp198969 发表于 2013-12-1 19:09
为什么我用mega8板子的时候,下载带红外库文件的程序,装不下呢?

mega8本来就只有8k的空间,如果烧入bootloader的话就只有7k左右了,光编译IRemote库大概就有7k左右了,你当然烧不进啦,首先我没有烧bootloader,IRemote库也被我精简过了,就剩下了我需要的代码,同时我也没有采用arduino.h库函数,所以全部程序下载完4k不到
回复 支持 反对

使用道具 举报

发表于 2013-12-2 10:08:36 | 显示全部楼层
sim900a多少钱买的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-2 20:31:01 | 显示全部楼层
flashria 发表于 2013-12-2 10:08
sim900a多少钱买的

单买片子的话38,邮票封装,自己焊接麻烦,买2手拆机带板才42,可惜就是没有引出mic跟speaker,现在有冲动飞线出来加MT8870做DTMF控制
回复 支持 反对

使用道具 举报

发表于 2013-12-2 22:55:31 | 显示全部楼层
hp198969 发表于 2013-12-1 19:09
为什么我用mega8板子的时候,下载带红外库文件的程序,装不下呢?

我也装不下,超体积了
回复 支持 反对

使用道具 举报

发表于 2013-12-2 22:56:38 | 显示全部楼层
楼主,可以吧你精简后的 红外库 分享一下吗,Atmp8 很需要它
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-3 21:53:53 | 显示全部楼层
本帖最后由 一墙一别院 于 2013-12-3 21:57 编辑
绿林网页 发表于 2013-12-2 22:56
楼主,可以吧你精简后的 红外库 分享一下吗,Atmp8 很需要它


我是直接拿的功能,然后使用的自己的编码格式,只保留了hashcode解码写到程序里面了,不知道你要些什么功能,简单的精简方式就是,收发分离的话单独去掉收或者发,收发一体的话,根据自己的片子和使用的代码类型,去掉其他片子的文件和其他类型的解码,深一点的话就是继续将ARDUINO.h的库函数再改成avr的库函数,但这时切忌不要使用arduino的IDE编译,因为他是自动加ARDUINO库的
回复 支持 反对

使用道具 举报

发表于 2013-12-3 22:33:12 | 显示全部楼层
一墙一别院 发表于 2013-12-3 21:53
我是直接拿的功能,然后使用的自己的编码格式,只保留了hashcode解码写到程序里面了,不知道你要些什么 ...

就是 收和发 分离开,不需要支持那么多设备协议,只要支持Arduino测试用的那个遥控器就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-4 20:54:12 | 显示全部楼层
绿林网页 发表于 2013-12-3 22:33
就是 收和发 分离开,不需要支持那么多设备协议,只要支持Arduino测试用的那个遥控器就可以了

你说的测试那个遥控器是什么代码格式呢……
回复 支持 反对

使用道具 举报

发表于 2013-12-4 21:06:22 | 显示全部楼层
本帖最后由 绿林网页 于 2013-12-4 21:10 编辑
一墙一别院 发表于 2013-12-4 20:54
你说的测试那个遥控器是什么代码格式呢……



http://tradearchive.taobao.com/t ... eID=268724481542134
MP3遥控器 红外载波频率:38KHz

资料下载 http://pan.baidu.com/share/link?shareid=459500&uk=2302102993
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-12-5 19:37:52 | 显示全部楼层
本帖最后由 一墙一别院 于 2013-12-5 19:41 编辑
绿林网页 发表于 2013-12-4 21:06
http://tradearchive.taobao.com/trade/detail/tradeSnap.htm?spm=a1z09.2.9.157.xULOvA&tradeID=268 ...


你这个好像也没协议的,精简了一个已经修复了mega8的定时器错误,你自己试下行不行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-12-5 21:43:25 | 显示全部楼层
一墙一别院 发表于 2013-12-5 19:37
你这个好像也没协议的,精简了一个已经修复了mega8的定时器错误,你自己试下行不行

先谢谢哥们,其次,编译好像过不了,报错了

代码:
  1. #include <IRremote.h>
  2. #include <IRremoteInt.h>

  3. int RECV_PIN = 11;//定义红外接收器的引脚为11
  4. IRrecv irrecv(RECV_PIN);
  5. decode_results results;

  6. void setup()
  7. {
  8.   Serial.begin(9600);
  9.   irrecv.enableIRIn(); // 初始化红外接收器
  10. }

  11. void loop() {
  12.   if (irrecv.decode(&results)) {
  13.     Serial.println(results.value, HEX);//以16进制换行输出接收代码
  14.     Serial.println();//为了便于观看输出结果增加一个空行
  15.     irrecv.resume(); // 接收下一个值
  16.   }
  17. }
复制代码
用Atm8 和 uno 都 报错,编译不过

IRremoteMin\IRremote.cpp.o: In function `MATCH(int, int)':
/IRremoteInt.h:176: multiple definition of `MATCH(int, int)'
sketch_dec05a.cpp.o:\Arduino\libraries\IRremoteMin/IRremoteInt.h:176: first defined here
IRremoteMin\IRremote.cpp.o: In function `MATCH_MARK(int, int)':
/IRremoteInt.h:177: multiple definition of `MATCH_MARK(int, int)'
sketch_dec05a.cpp.o:\Arduino\libraries\IRremoteMin/IRremoteInt.h:177: first defined here
IRremoteMin\IRremote.cpp.o: In function `MATCH_SPACE(int, int)':
/IRremoteInt.h:178: multiple definition of `MATCH_SPACE(int, int)'
sketch_dec05a.cpp.o:\Arduino\libraries\IRremoteMin/IRremoteInt.h:178: first defined here
回复 支持 反对

使用道具 举报

发表于 2013-12-5 22:00:57 | 显示全部楼层
我弄好了,原来是多添加了一个引用,,我是点菜单上的查入库,就自动添加了这两个
#include <IRremote.h>
#include <IRremoteInt.h>
就报错了,后来发现,删掉第二个,只保留第一个,就不报错了,可以用了
非常感谢~
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 19:14 , Processed in 0.040169 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表