搜索
bottom↓
回复: 42

吐槽义隆单片机,顺便送上超轻红外解码程序.

  [复制链接]

出0入0汤圆

发表于 2015-11-26 09:47:30 | 显示全部楼层 |阅读模式
本帖最后由 i7gly 于 2015-11-26 11:41 编辑

最近有个案子要使用义隆153芯片,1K ROM 32Byte RAM,模拟5路PWM,红外解码,IIC,资源勉强够用.这款芯片大家都推荐汇编语言来编程,可我偏偏要用C,然后就被啪啪啪的打脸了,,,
路漫漫其修远兮,写好构架,编译,RAM不够?我明明只用了23Byte!!!然后上网查了下,编译器本身要占16Byte RAM,所以只能用32-16 = 16Byte RAM.我擦.竟然还有如此厚颜无耻的编译器!好吧,我忍了,谁叫我汇编不精.优化优化后,嘿嘿,刚刚好16Byte,编译,,,艹,当时我就想摔电脑了!!!编译器苦苦哀求:哥,再留3字节给我,中断时我还要保存保存状态寄存器呢!我当时就火大了,你TM的明明已经占用了16Byte了,你竟然出入栈都还向我要,你拿RAM去勾引妹子吗!!!
啪啪啪,脸被打肿后我只能忍着巨痛使用13Byte的RAM写完了这个案子.汇编不好真是苦逼,连编译器都欺负人.

下面送上这个案子使用的红外解码程序,只占用3.5Byte的RAM

采用轮询方式,例子是0.2ms轮询一次,修改时间参数可改动轮询时间.


  1. #define READ_IR        R62                                //定义红外接收管脚

  2. unsigned char        ir_step;                                //解码步
  3. unsigned char        ir_code_cnt;                        //解码计时
  4. unsigned char        ir_table;                                //解码值

  5. bit         ir_status;                                        //状态
  6. bit         ir_pin_old;                                        //管脚
  7. bit         ir_pin_now;                                        //管脚
  8. bit         ir_bit_ok;                                        //接收到1 BIT

  9. void Ir_Code(void)
  10. {
  11.         if(ir_code_cnt<255)
  12.                 ir_code_cnt ++;                        //脉宽计时
  13.         ir_pin_now = READ_IR;                        //读取IO状态

  14.         if((ir_pin_now) && (ir_pin_now != ir_pin_old))                //捕捉脉冲上升沿
  15.         {
  16.                 if(ir_code_cnt < 8)                                                        //脉冲1.125ms, -> 0
  17.                 {
  18.                         ir_bit_ok = 1;                                                        //读取到1 bit
  19.                         ir_pin_old = 0;                                                        //此处为借用变量
  20.                 }
  21.                 else if(ir_code_cnt < 16)                                        //脉冲2.25ms, -> 1
  22.                 {
  23.                         ir_bit_ok = 1;
  24.                         ir_pin_old = 1;       
  25.                 }          
  26.                 if(ir_code_cnt > 56)                                                //脉冲13.5ms, -> 包头
  27.                 {                                                                                //计时时间一定要适当放宽
  28.                         ir_step=0;                                                        //解码步复位
  29.                 }
  30.                 ir_code_cnt = 0;                                                        //计时复位
  31.         }
  32.         if(ir_bit_ok)                                                                        //有读取到内容
  33.         {
  34.                 ir_bit_ok = 0;                                                                //先复位
  35.                 if(ir_step < 24)                                                        //只接收24bit
  36.                 {
  37.                         ir_table >>= 1;                                                //移位
  38.                         if(ir_pin_old)        ir_table+= 0x80;
  39.                 }

  40.                 if(ir_step == 7)                                                        //第一个字节数据
  41.                 {
  42.                         if(ir_table !=0x80)                ir_step = 0;                 //如果用户码为0x80,允许继续
  43.                 }
  44.                 if(ir_step == 15)
  45.                 {
  46.                         if(ir_table !=0x7f)                ir_step = 0;                 //如果用户反码为0x7f,允许继续
  47.                 }
  48.                 if(ir_step == 23)                                                        //好了,接收到按键值了
  49.                 {
  50.                         ir_status = 1;                                                        //置位状态,标识可读取
  51.                 }
  52.                 if(ir_step < 255)                                                        //接收步计数
  53.                         ir_step ++;
  54.         }
  55.        
  56.         ir_pin_old = ir_pin_now;                                                //管脚状态
  57. }

  58. void main()
  59. {
  60.         while(1)
  61.         {
  62.                 if(ir_status)                                                //如果有接收标识
  63.                 {
  64.                         ir_status = 0;                                        //复位标识
  65.                         switch(ir_table)                                //键值使用
  66.                         {
  67.                                 case 0x01:
  68.                                         ......
  69.                                 break;
  70.                         }
  71.                 }
  72.         }
  73. }

  74. //0.2ms中断
  75. void _intcall interrupt(void) @ int
  76. {
  77.         Ir_Code();                                                                        //中断里调用
  78. }

复制代码



修改理由:修改代码注释

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-11-26 09:51:41 | 显示全部楼层

出0入0汤圆

发表于 2015-11-26 09:54:52 | 显示全部楼层
佩服用白菜MCU也能做出牛叉应用的人。

出0入0汤圆

发表于 2015-11-26 09:55:38 | 显示全部楼层
不错,以前天天搞153的东西

出0入0汤圆

发表于 2015-11-26 10:10:39 来自手机 | 显示全部楼层
在中断中解红外,软P W M性能不好,要不频率不高

出0入0汤圆

 楼主| 发表于 2015-11-26 10:16:26 | 显示全部楼层
tenx 发表于 2015-11-26 10:10
在中断中解红外,软P W M性能不好,要不频率不高

频率不高,300HZ,所以影响不大.

出0入0汤圆

发表于 2015-11-26 10:21:09 来自手机 | 显示全部楼层
8位精度的P WM,300H Z频率可已不错了

出0入0汤圆

发表于 2015-11-26 10:27:40 | 显示全部楼层
目前正在做的就是移植以前的汇编程序,>2000行,头都大了

出0入0汤圆

发表于 2015-11-26 10:31:33 | 显示全部楼层
台系这些从不用C,目前手上4bit机无中断无堆栈的更折腾

出0入0汤圆

 楼主| 发表于 2015-11-26 10:39:41 | 显示全部楼层
shower.xu 发表于 2015-11-26 10:31
台系这些从不用C,目前手上4bit机无中断无堆栈的更折腾

没有堆栈还可以理解,没有中断就太鸡肋了吧,还在用4位机做什么应用?

出0入0汤圆

发表于 2015-11-26 10:42:38 | 显示全部楼层
i7gly 发表于 2015-11-26 10:39
没有堆栈还可以理解,没有中断就太鸡肋了吧,还在用4位机做什么应用?

玩具,低端红外遥控语音玩具。。

有个baseTimer,但不触发中断,要自己去查标志位。NND

出0入0汤圆

发表于 2015-11-26 10:45:34 | 显示全部楼层
之前用过C写这个IC控制IO口,莫名其秒的问题出现.没办法只能改汇编.
查了一下,这个IC的编译器对C编译很差.

出0入0汤圆

发表于 2015-11-26 10:46:57 | 显示全部楼层
LZ水平很好哈,嘿嘿

出0入0汤圆

 楼主| 发表于 2015-11-26 10:54:14 | 显示全部楼层
Firman 发表于 2015-11-26 10:45
之前用过C写这个IC控制IO口,莫名其秒的问题出现.没办法只能改汇编.
查了一下,这个IC的编译器对C编译很差. ...

编译器倒不是很差,同样的程序,我在51上验证时,Keil编译出1.5K ROM.这个编译器编译0.9K ROM, 只是RAM占用太明显...

出10入210汤圆

发表于 2015-11-26 10:56:29 | 显示全部楼层
同感,经常把一个8位变量拆成2-3个来用.

出0入0汤圆

 楼主| 发表于 2015-11-26 10:56:41 | 显示全部楼层
shower.xu 发表于 2015-11-26 10:42
玩具,低端红外遥控语音玩具。。

有个baseTimer,但不触发中断,要自己去查标志位。NND ...

我猜是中颖的单片机...

出0入0汤圆

发表于 2015-11-26 11:02:41 | 显示全部楼层
i7gly 发表于 2015-11-26 10:54
编译器倒不是很差,同样的程序,我在51上验证时,Keil编译出1.5K ROM.这个编译器编译0.9K ROM, 只是RAM占用 ...

用153写遥控器,土豪呀!
2K ROM我们用ABOV ADAM26/27的MCU,两毛钱,还不用外部晶振.

出0入8汤圆

发表于 2015-11-26 11:14:53 | 显示全部楼层
shower.xu 发表于 2015-11-26 10:31
台系这些从不用C,目前手上4bit机无中断无堆栈的更折腾

台系 一直用C,除非没有C编译器。  楼主这还算是好的,我第一次用义隆,那个C编译器真的是第一个版本,那把我折腾了,最后都是发源代码到义隆原厂,找问题的。就折腾了一次,后面就很熟练了。

出0入0汤圆

发表于 2015-11-26 11:15:39 | 显示全部楼层
  if((ir_pin_now) && (ir_pin_now != ir_pin_old))                //捕捉脉冲下降沿,               
这里是不是有错误啊,不应该是捕捉到上升沿吗 ?

出0入0汤圆

发表于 2015-11-26 11:23:23 | 显示全部楼层
i7gly 发表于 2015-11-26 10:56
我猜是中颖的单片机...

是九齐的,其实台系都差不多

出0入0汤圆

发表于 2015-11-26 11:23:30 | 显示全部楼层
不错,标记下

出0入0汤圆

发表于 2015-11-26 11:25:09 | 显示全部楼层
kebaojun305 发表于 2015-11-26 11:14
台系 一直用C,除非没有C编译器。  楼主这还算是好的,我第一次用义隆,那个C编译器真的是第一个版本,那 ...

就那点RAM和ROM,都是一位位扣的,C怕不够用,还各种坑

出0入0汤圆

发表于 2015-11-26 11:29:14 | 显示全部楼层
Firman 发表于 2015-11-26 11:02
用153写遥控器,土豪呀!
2K ROM我们用ABOV ADAM26/27的MCU,两毛钱,还不用外部晶振. ...

没搜到资料,能发个datasheet上来么,简单的就行

出0入0汤圆

 楼主| 发表于 2015-11-26 11:36:33 | 显示全部楼层
shower.xu 发表于 2015-11-26 11:29
没搜到资料,能发个datasheet上来么,简单的就行

http://www.abov.co.kr/chn/index. ... pth3=1&Depth4=3

出0入0汤圆

 楼主| 发表于 2015-11-26 11:43:54 | 显示全部楼层
见入佳境 发表于 2015-11-26 11:15
if((ir_pin_now) && (ir_pin_now != ir_pin_old))                //捕捉脉冲下降沿,               
这 ...

注释是随便敲上去的,多谢提醒,已修改过来了.

出0入0汤圆

发表于 2015-11-26 11:49:00 | 显示全部楼层
i7gly 发表于 2015-11-26 11:36
http://www.abov.co.kr/chn/index.php?Depth1=3&Depth2=1&Depth3=1&Depth4=3

谢谢,原来是现代

出0入0汤圆

发表于 2015-11-26 11:59:53 | 显示全部楼层
楼主牛B

出0入0汤圆

发表于 2015-11-26 13:29:38 | 显示全部楼层
Firman 发表于 2015-11-26 11:02
用153写遥控器,土豪呀!
2K ROM我们用ABOV ADAM26/27的MCU,两毛钱,还不用外部晶振. ...

2K ROM还只要2毛钱,这么便宜.
也是8脚么?

出0入8汤圆

发表于 2015-11-26 13:50:03 | 显示全部楼层
shower.xu 发表于 2015-11-26 11:29
没搜到资料,能发个datasheet上来么,简单的就行

坑多了,就习惯了。

出0入0汤圆

发表于 2015-11-26 16:28:38 | 显示全部楼层
liufabing 发表于 2015-11-26 13:29
2K ROM还只要2毛钱,这么便宜.
也是8脚么?

脚的个数与价格有多大联系吗?
我们一般谈价格与ROM大小关系较大.
它是特定为遥控器做的MCU,肯定能满足基本要求.
8个脚能做什么?

出0入0汤圆

发表于 2015-12-2 15:00:36 | 显示全部楼层
楼主,问你个问题:义隆C的unsigned int 和unsigned char一样都是8位数据吗?我做12位ADC转换,是用了unsigned short int定义才是16位的数据!之前用unsigned int定义都是只有8位!

出0入34汤圆

发表于 2015-12-2 15:19:28 | 显示全部楼层
高人,PIC汇编,C不会飘过

出0入0汤圆

 楼主| 发表于 2015-12-2 17:19:05 | 显示全部楼层
1125526801 发表于 2015-12-2 15:00
楼主,问你个问题:义隆C的unsigned int 和unsigned char一样都是8位数据吗?我做12位ADC转换,是用了unsig ...

是的,义隆的char跟int都是8位的,short是16位的.
松翰的char跟int是8位的,long是16位的

出0入0汤圆

发表于 2015-12-2 18:14:42 | 显示全部楼层
i7gly 发表于 2015-12-2 17:19
是的,义隆的char跟int都是8位的,short是16位的.
松翰的char跟int是8位的,long是16位的 ...

明白了,谢谢。我前入手义隆的仿真器才几天。我只会用C

出0入0汤圆

发表于 2015-12-2 19:26:40 | 显示全部楼层
学习了,现代有2毛的单片机啊

出0入0汤圆

发表于 2015-12-25 12:29:06 | 显示全部楼层
这个红外解码蛮简练的~

出0入0汤圆

发表于 2015-12-25 13:13:12 | 显示全部楼层
成本敏感的东东不好做啊

出0入0汤圆

发表于 2016-12-26 11:31:08 | 显示全部楼层
mark,寻找思路中,解码RC-6

出0入0汤圆

发表于 2017-6-22 08:16:09 | 显示全部楼层
像遥控器这种通用的、大批量生产的东西,应该有专有芯片吧?

出0入0汤圆

发表于 2017-11-11 15:02:18 | 显示全部楼层
你好, 想请教下 红外遥控器按键一直长按, 怎么判断?

出10入210汤圆

发表于 2017-11-11 20:45:03 来自手机 | 显示全部楼层
nuncle 发表于 2017-11-11 15:02
你好, 想请教下 红外遥控器按键一直长按, 怎么判断?

长按的时候,发出的“重复”编码,很好判断的。

出0入0汤圆

发表于 2017-11-12 08:18:27 | 显示全部楼层
楼主的代码很简洁明了,学习中。

出0入0汤圆

发表于 2017-11-13 13:04:45 来自手机 | 显示全部楼层
rainbow 发表于 2017-11-11 20:45
长按的时候,发出的“重复”编码,很好判断的。

楼主代码中没有连发码的判断,NEC格式编码的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 04:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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