如何用ATmega16A实现输入捕捉以及曼码解码实现?
最近刚入职,老大就给了一个项目,目的是让我接触学习(他也没指望我能完整的搞定吧,我也没那自信)
情况是这样的,我们是做酒店类控制系统的,然后一个方案上要用到别的公司(以下称为丙方)的产品,甲方当然就想我们将丙方产品的控制系统集成在一起啊(其实说白了就是山寨他们的控制模块吧,我是这样理解的)我们有试过联系丙方想要时序图(肯定不给的啦)所以老大就把这事扔给我学习了。
从示波器上看图形是有规律的(老大说很可能是曼码处理过的),然后他打算用m16单片机获取通信过程并做一个解码(这样表达没错吧,我也不是很懂)反正最终目的就是不用丙方的控制面板,将控制程序放在我们自己的面板里面。
我看了几天资料,m16的定时计数器1有输入捕捉的功能(所以我是不是应该往这个方向做)不过我还是有点不明白:我是应该用计数器的普通模式,获取占空比?然后把获得的数据归为0、1即可?(忘了说,丙方的产品用的是单线通讯)
可是这个只是没有任何操作的数据通信的情况吧(以后每个功能都要重新获取一次编码?)还有之后我们也要仿造波形输出吧(定时器1也有这个功能)
表达的有些乱,希望别介意。
恳请各位前辈特别是有这种项目经历的能提供下思路,我不奢求完全的代码什么的,只是要个思路,谢谢。
说实话我现在还是一头雾水,很多都搞不清楚,慢慢成长吧。
首先谢谢你发现我代码中的错误(笔误) 应该是DDRD
其次当PD6配置为输入后,PORTD=0只能禁止PD6上拉电阻但不能影响PD6端口电平。你老板的意思其实就是使用输入捕获来获取逻辑电平持续时间,然后自己用代码模拟出来。
可能有前辈会问我怎么会如这行的(明知自己没这基础)
只能说因缘巧合吧,公司招聘要求我怎么看都以为只是画板的,而且涉及嵌入式什么的,然后面试时没有技术在场,入职后发现公司是一种带学徒的态度,也没特别严格的要求。
在公司的感觉还是不错的,就是自己知道自己水平如何,每天都看很多文档,可是又看不懂,心里又急,有点恶性循环了,无奈
http://bbs.elecfans.com/forum.ph ... p;extra=#pid3648101
我认真看了前辈的《第十二节 高级定时器之输入捕获与红外解码》 无奈自己刚接触avr单片机,对代码也不敏感,所以有很多不明白的地方,望前辈不吝赐教。
nec初始化函数中,即代码78,79行
DDRB &=~(1<<PD6); //PD6 (ICP1 单片机第20脚) 配置为输入
PORTB|= (1<<PD6); //PD6 上拉电阻
————————————————————————————————————————
1.为什么这里是B而不是D?
2.79行能否写成 PORTD = 0?因为我想使PD6为低电平,然后上升沿触发(查资料得知avr内部没有下来电阻,那直接写成0可行不?)***********************这个我后面仔细想了下,应该用下降沿触发,所以这个不用解答了*******
————————————————————————————————————————
然后再有个问题,前辈代码中涉及nec的内容,那是前辈在已有nec时序图的情况下。
我现在这个问题就是我事先不知道丙方产品的时序图,而且数据头具体的高低电平时间也不知如何确定(示波器能获取精确的时间吗?)那这种前提下,我应该如何定位数据头的case跟后面数据的case呢?
昨天看了一个视频教程,总算明白了avr单片机I/O口寄存器配置的问题(很基础的东西,但貌似很多教程都不提及,从51转过来完全不知所以然)
DDRDx PORTx PINx I/O 上拉电阻 说明
0 0 -- 输入 无 高阻态
0 1 -- 输入 有 带上拉的输入
1 0 -- 输出 无 输出低电平
1 1 -- 输出 无 输出高电平
感谢前辈回复及指点。