免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ady2002
打印 上一主题 下一主题

自己修改的ADC0809驱动,Godbach和版主请看看 [复制链接]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
21 [报告]
发表于 2008-11-18 16:48 |只看该作者
原帖由 ady2002 于 2008-11-18 16:32 发表
是这样的 我这个是做项目的 也就是特定的需求 AD的作用就仅仅针对这个就OK了
不需要考虑到其他的还可能使用AD的问题


不管你做什么,你把时钟中断放到AD驱动里面,就是一个错误的决定和方法。
你要明白,时钟中断可能在系统中其它地方已经初始化了,可能已经正常的跑着,你这里就是画蛇添足,反而会弄死系统。

论坛徽章:
0
22 [报告]
发表于 2008-11-18 17:29 |只看该作者
原帖由 dreamice 于 2008-11-18 16:48 发表


不管你做什么,你把时钟中断放到AD驱动里面,就是一个错误的决定和方法。
你要明白,时钟中断可能在系统中其它地方已经初始化了,可能已经正常的跑着,你这里就是画蛇添足,反而会弄死系统。

我是看到S3C2410有带4个timer  可以产生周期性的中断,刚好符合我的要求哦

要是不能在驱动中使用周期性中断的话,那timer有什么意义呢??
而且我要让驱动能一直更新的输出数据 不这么做 是在想不到别的方法
还有没有别的方法呢??

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
23 [报告]
发表于 2008-11-18 17:31 |只看该作者

回复 #22 ady2002 的帖子

timer中断拿来干什么的?你这个可要理解清楚。

论坛徽章:
0
24 [报告]
发表于 2008-11-18 17:35 |只看该作者
原帖由 dreamice 于 2008-11-18 17:31 发表
timer中断拿来干什么的?你这个可要理解清楚。

我之前做个的时候 也询问很多了 有些人说可以用时钟中断来做
晕死 现在彻底晕了
老大  我该怎么办 timer中断还真不知道用来做什么的哦

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
25 [报告]
发表于 2008-11-18 17:40 |只看该作者
原帖由 ady2002 于 2008-11-18 17:35 发表

我之前做个的时候 也询问很多了 有些人说可以用时钟中断来做
晕死 现在彻底晕了
老大  我该怎么办 timer中断还真不知道用来做什么的哦


你再把你的需求详细的写一遍出来:
时钟中断是可以完成这个功能,但不能混用AD中断。

论坛徽章:
0
26 [报告]
发表于 2008-11-18 22:31 |只看该作者
原帖由 dreamice 于 2008-11-18 17:40 发表


你再把你的需求详细的写一遍出来:
时钟中断是可以完成这个功能,但不能混用AD中断。

我现在主要做的其实是 想实现一个对汽车速度的提取。用感应器来测量汽车马达的转数,已达到汽车测速的效果。
也就是想利用传感器测出马达1s的转数。传感器输出的模拟量所以要使用ADC转换为数字量i
因为 传感器输出的是一个脉冲信号。
所以我这个驱动就是有以下的步骤:
1.能够一直循环的获取新数据i,并设置一个门限转化为0或者1,i>200,i=1,否则i=0;并用i和i-1(前一个获取到的i值)比较不同的话就累计值M加1
   因为要一直更新数据,所以我考虑使用定时中断来实现,比如定时10MS中断一下,这样就能保证数据都能被采集到
2.做一个求和平均来减小误差,比如50ms定时提取一次M,取四次,再求平均
3.还要求一个每分钟的平均值。
4.最后传输到minigui中 显示出来
2,3再应用上做比较简单,但是1在应用上做就比较麻烦,因为这个采集更新是要一直工作的,知道关机。所以觉得在用户上做就会很麻烦
不知道这么说 是否清楚哦

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
27 [报告]
发表于 2008-11-18 22:43 |只看该作者
原帖由 ady2002 于 2008-11-18 22:31 发表

我现在主要做的其实是 想实现一个对汽车速度的提取。用感应器来测量汽车马达的转数,已达到汽车测速的效果。
也就是想利用传感器测出马达1s的转数。传感器输出的模拟量所以要使用ADC转换为数字量i
因为 传感 ...



2以后的我不关心你的需求了。
方法一:
你这个可以在驱动模块设置一个内核定时器,定期去读取AD值,保存到一个全局变量里面,这样,当应用层来读的时候,这个值实际上就是不断更新的一个值,读取的频率可以根据应用需求来设定。这是一种实现方法。

方法二:
确实可以用timer中断,timer中断实际上的作用就是方法一中描述的这个定时器的作用一样。

方法三:
由应用层触发去读取AD的当前值,你这个驱动程序就得改了。要知道,你不能一直去读一个IO映射后的值——这个值没有谁来更新,那读到的值没有变化也是理所当然的了;而应该做的事,去读ADC寄存器获取ADC的值。

所以,我觉得,一个设计实现有多种方法,关键在于你具体的系统,具体的应用以及方便的扩展接口,最终选择一种合适的设计方案。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
28 [报告]
发表于 2008-11-18 22:45 |只看该作者
最后,我还是要说明一点,在你写驱动模块的时候,不要把太多应用的策略问题融合进去,这样增加了驱动设计的难度,同时也潜在的增加了你系统的“危险”——毕竟驱动是跑在内核空间的。

论坛徽章:
0
29 [报告]
发表于 2008-11-19 08:48 |只看该作者
原帖由 dreamice 于 2008-11-18 22:43 发表



2以后的我不关心你的需求了。
方法一:
你这个可以在驱动模块设置一个内核定时器,定期去读取AD值,保存到一个全局变量里面,这样,当应用层来读的时候,这个值实际上就是不断更新的一个值,读取的频率 ...


多谢 dreamice 的细心知道  学到了很多啊·~~~  昨晚那么晚还在 早上又这么早 真是牛人啊·~~ 哈哈哈

我之前也用过内核定时器,只是内核定时器不好产生周期性的中断(是不是在timer的功能函数里加一个add(timer)就可以实现周期性的,这种作法会不会很不地道),所以才改用S3C2410的timer来做的。
还想请问一下 关于我提到的最新的数据和前一个数据的对比 能不能在中断函数中实现,怎么实现保存到保存到一个全局变量里面就可以了吗??

还有最主要的问题就是 我现在使用timer0的驱动有问题,出现非法指针的错误,所以能不能麻烦dreamice仔细帮我瞧瞧  我自己看了好几天就是看不出问题在那哦

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
30 [报告]
发表于 2008-11-19 09:03 |只看该作者

回复 #29 ady2002 的帖子

没有什么不地道的,我建议你弄一个唤醒缓冲区,把定时读到的AD数值保存起来。
具体知识,自己看看书吧,顺便把它掌握牢固了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP