搜索
bottom↓
回复: 38

【STM8手持示波仪】软件设计讨论

[复制链接]

出0入0汤圆

发表于 2009-3-24 19:41:47 | 显示全部楼层 |阅读模式
我的初步构思软件分为三层

1、应用层:波形的显示、波形相关参数计算显示、人机交互及功能设置(触发方式、采样率、量程设置)

2、驱动层:液晶显示驱动、ADC采样(应该用TIM1触发ADC采样吧)、按键驱动、串口驱动(便于调试)、定时器

3、STM8固件库层

还不太成熟,请大家讨论,还望有相关经验的人能指点一二。

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

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

出0入0汤圆

发表于 2009-3-24 21:53:55 | 显示全部楼层
能不能让ADC自由采样,由定时中断信号来读取ADC的转换值.

出0入0汤圆

 楼主| 发表于 2009-3-24 23:39:02 | 显示全部楼层
你的意思是ADC连续采样吗?这样不方便控制采样率吧?

出0入0汤圆

发表于 2009-3-25 09:45:03 | 显示全部楼层
我个人建议从顶向下设计,先把各个屏幕定义一下,然后定义每个屏幕之间的跳转和事件。


基于状态机的软件开发 (原文件名:StateMachine.GIF)

出0入0汤圆

 楼主| 发表于 2009-3-25 14:52:47 | 显示全部楼层
ghost2
哈哈,我也是打算用状态机来开发。
但上面你给的图不是为这个项目设计的吧?

出0入0汤圆

发表于 2009-3-25 14:56:55 | 显示全部楼层
【4楼】 ifree64
>>> ghost2
>>> 哈哈,我的意思也是用状态机来开发。
>>> 但上面你给的图不是为这个项目设计的吧?

这个图不是本项目的,我还没这么快入手。:)
状态机框架结构上比较清晰,也不是很耗资源,利于分模块开发

出0入0汤圆

发表于 2009-3-25 15:07:21 | 显示全部楼层
能不能像用AVR那样,有定时器中断自动触发ADC转换,ADC中断就是读出AD值?主程序就是状态机运行?

出0入0汤圆

发表于 2009-3-25 15:29:35 | 显示全部楼层
【6楼】 ZealotNH 发仔
>>> 能不能像用AVR那样,有定时器中断自动触发ADC转换,ADC中断就是读出AD值?主程序就是状态机运行?
ADC本身需要时间,放在中断里面不是很合适。
建议时间中断里触发ADC,然后ADC转换结束中断里获取转换结果

出0入0汤圆

发表于 2009-3-25 15:47:28 | 显示全部楼层
是ADC 设置时 设置成 T0或T1触发ADC转换。ADC转换结束中断程序把ADC值读出标识状态,并设置下次的转换通道 等等。
不是在中断中执行ADC单次传换。
例如这样,M48的程序

//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 500.1uSec
// actual value: 500.000uSec (0.0%)
void timer0_init(void)
{
TCCR0B = 0x00; //stop
TCNT0 = 0x00; //set count
OCR0A=0x47;
OCR0B=0x47;
TCCR0A = 0x03;
TCCR0B = 0x0B; //start timer
}

//ADC initialize
// Conversion time: 90uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
// ADMUX = 0x47;  //select adc input 0
ADMUX = AD_CH[AD_CH_P];
ACSR  = 0x80;
ADCSRB = 0x04;        //定时器0溢出转换
ADCSRA = 0xAF; //0b1010 1111
}

#pragma interrupt_handler adc_isr:22
void adc_isr(void)
{
unsigned int T=AD_ADD;
unsigned char CT;
//num_disp2(ADC>>2);
T=T+ADC;
AD_ADD=T;
CT=ADC_coute;
CT=CT>>1;
if(!CT)
{AD_CH_P_PASS=AD_CH_P;
  if(AD_CH_P==7) AD_CH_P=0;
  else AD_CH_P++;
  ADMUX=AD_CH[AD_CH_P];
  CT=0x10;
  sbi(SYS_RUN_state,ADOK);}
ADC_coute=CT;
}

出0入42汤圆

发表于 2009-3-25 15:54:57 | 显示全部楼层
STM8有外部触发


(原文件名:未命名.JPG)

出0入42汤圆

发表于 2009-3-25 15:55:46 | 显示全部楼层
ADC_ETR就是外部触发信号输入

出0入0汤圆

发表于 2009-3-25 16:05:44 | 显示全部楼层
Internal TGRO trigger from TIM1。把TIM1 设成200K频率。
我什么资料都未看~

出0入0汤圆

 楼主| 发表于 2009-3-25 16:30:06 | 显示全部楼层
STM8的定时器太强大了,比起以前熟悉的ATMEGA16来说,简直是强大太多了。但是也复杂多了,数据手册上说明的好像有点乱,我还没有完全吃透。

我的想法是用TIM1来触发ADC转发,ADC转换结束后产生中断,在中断中将ADC转换结果存到缓冲区中。为了效率ADC选择左对齐,只读高字节放弃第字节,因为192X64液晶没有那么高的分辨率。缓冲区存满后在调用显示子程序送显。

出0入0汤圆

 楼主| 发表于 2009-3-25 16:50:32 | 显示全部楼层
STM8S208RB看上去ADC时钟可以设置到6MHz,转换时间2.33us,这样应该可以达到400K的采样率。

出0入0汤圆

发表于 2009-3-25 17:43:03 | 显示全部楼层
【12楼】 ifree64

这个我倒觉得可以探讨一下

我的想法是尽量保留信息量,显示屏的数据跟实际数据不要混淆

这样在暂停采集数据以后,可以通过调节量程看到更细致的数据

不过,这样做的话,资源需求比较大,程序流程走得复杂一些,不知道会不会影响ADC的速度?

出0入0汤圆

发表于 2009-3-25 17:46:02 | 显示全部楼层
【14楼】 dvhome
-------------------
硬件上是不是可以采用双CPU的方案,一个专用于采集数据,一个用于计算显示?

出0入0汤圆

发表于 2009-3-25 18:48:51 | 显示全部楼层
硬件上是不是可以采用双CPU的方案,一个专用于采集数据,一个用于计算显示?

--------
这样CPU间需要高速度数据传输,用什么方法,并行?串行?

出0入0汤圆

发表于 2009-3-25 19:42:20 | 显示全部楼层
楼上的方法是个好方法,感觉比较好.一个MPU就相当于ADC+FIFO.
数据传输的话,用并行的吧.速度快,控制容易.

出0入0汤圆

 楼主| 发表于 2009-3-25 19:51:18 | 显示全部楼层
是否用2个CPU要慎重,我也思考过用2个CPU,因为是在2个CPU之间进行采样数据的传递,这样做有没有真的减轻显示cpu或者采样cpu数据处理的负担?

我的意思是采样的cpu将数据传递给LCD和将数据传递给另一个cpu有区别吗?

出0入0汤圆

 楼主| 发表于 2009-3-25 20:02:28 | 显示全部楼层
to【14楼】 dvhome
这样在暂停采集数据以后,可以通过调节量程看到更细致的数据

不是很理解,暂停采集数据后,如何调节量程看到更细致的数据?是指如果信号很小的话,也就是采样数据很小的话,将数据乘以一定的比例再显示吗?
如果是这个意思,只要在高速采样的时候,单片机来得及在中断中将数据保存起来,那么保留10位的采样结果也没有关系。

关于性能我的简单计算,不知对不对,大家指正:
6MHzADC采样时,一次ADC转换用掉14个ADC时钟,如果CPU时钟24MHz的话,一次ADC转换用掉了14*4=56个CPU时钟。如果用中断来读取采样结果,中断的现场保护和恢复时间为9+9=18个CPU时钟,还剩38个CPU时钟用于其他的处理,这个时间是否够?

出0入0汤圆

发表于 2009-3-25 20:03:19 | 显示全部楼层
感觉没多少,数据采集是硬件完成的。数据读出只需要不多的时间。cpu间通讯也是需要时间的。
除非数据采集的cpu也处理数据。

出0入0汤圆

发表于 2009-3-25 20:15:13 | 显示全部楼层
数据读出不需要很多时间,可是LCD的显示,其他按键的响应,数据的判断,会需要不少时间的.

出0入0汤圆

发表于 2009-3-25 23:28:35 | 显示全部楼层
数据处理用的时间最多,如果做个均方根 8位的CPU够忙了。
做过市电128个点的均方根 用M16 16M。1602显示要把驱动拆散,程序才能正常运行。
液晶也要很多时间。
按键时间可以忽视。

出0入0汤圆

发表于 2009-3-26 01:35:51 | 显示全部楼层
苍天啊,晚上打的大长篇居然发送失败,没了,唉……

重新再来


【15楼】 smallsnail 燕 青

我的看法跟 【18楼】 ifree64 一样,我认为没有必要使用两个MCU,这样软件、硬件都会更复杂,而实际性能并没有增强。


【19楼】 ifree64
是的,大概就是这么个意思

我的想法是,在程序架构里面,把采样数据和显示数据分离开来。采样数据是直接保存原始的数据,显示数据根据设置的参数将采样数据进行坐标压缩或拉伸变换,然后再显示。这样会不会是画蛇添足了??

出0入0汤圆

发表于 2009-3-26 09:11:39 | 显示全部楼层
TO【23楼】 dvhome

把采样数据和显示数据分离开来。采样数据是直接保存原始的数据,显示数据根据设置的参数将采样数据进行坐标压缩或拉伸变换,然后再显示。这样会不会是画蛇添足了??
<BR >
这样做好,CPU应该忙得过来。

出0入0汤圆

发表于 2009-3-26 09:32:22 | 显示全部楼层
我同意ZealotNH 发仔的意见,可以加个STM32的片子72M的用来做计算,两个片子通过SPI口通信,STM8采样好之后就把采样数据发给STM32,STM32算好再把值传给STM8,也就是STM8当主,STM32当从(让STM8当主就是有点怪啊),这样计算的时间就省下来了,要么用两片STM8,一个当主,做计算和采样,另一个STM8当从,主要作显示和按健什么的,也是通过SPI通信

出0入0汤圆

发表于 2009-3-26 09:55:43 | 显示全部楼层
【25楼】 myworkmail
我是不赞成双CPU的,只是没表态。

出0入0汤圆

发表于 2009-3-26 09:57:49 | 显示全部楼层
还是用两个STM8吧!用STM32与STM8,而且让STM8当主,说不过去啊!

出0入0汤圆

发表于 2009-3-26 10:36:13 | 显示全部楼层
建议用两个STM8.一个用做ADC+FIFO,另一个处理和显示数据.这样的话,存储深度也就增加了.

出0入0汤圆

发表于 2009-3-26 11:09:20 | 显示全部楼层
硬件、软件复杂程度都增加,成本也增加,功耗也增加

仅仅是增加存储深度,这样也太划不来了


其实只要软件上分时处理好,一个STM8可以完成所有的工作了

出0入0汤圆

发表于 2009-3-26 11:24:26 | 显示全部楼层
如果用一片STM8,所能达到的采样率是不可能到芯片极限的.即便能够达到的话,会有很多时间片不能被采样到.所以如果用两片的话,对于性能来说,不是一般的提高.
因为STM8的IO比较多,所以采用并行的方式,数据传输的速度可以大大提高.同时,软件的复杂程度可以降低很多.

出0入0汤圆

 楼主| 发表于 2009-3-26 11:40:29 | 显示全部楼层
关于是否采用两片stm8,我觉得我们可以先做一下实验,让stm8以最大ADC速度采样,然后送LCD显示(我以为真正占用cpu资源的就这两个任务),看一个stm8是否忙得过来。

另外我还是对采用2片stm8能否提高效率保持怀疑,一个stm8仅仅是adc采样然后将采样到的数据用并行的方式发送给另一个stm8,与将采样到的数据直接送lcd显示相比,是不是要快很多?stm8没有外部数据总线,那么要通过并行方式发送和接收数据只能用软件的方式模拟,而这个和用软件方式将数据传递给LCD是不是效率差不多?

出0入0汤圆

发表于 2009-3-26 12:54:08 | 显示全部楼层
因为在显示的时候,并不是直接把拿来的数据显示到LCD上,还要进行处理,比如是否满足触发条件,采样率的情况,数据的计算等等.所以,还是用两片比较好.

出0入0汤圆

发表于 2009-3-26 13:15:03 | 显示全部楼层
【32楼】 sadf123


因此除了FIFO深度以外,其他方面,一片跟两片STM8做出来的效果是基本一样的

关键是看软件怎么处理的问题

关键在于ADC中断不是连续不断一直占用MCU的时钟。
有空余时间的。

这是做这个项目的基本前提。不然的话,即使用两片STM8也没有办法做(如果要保持数据完整性)

出0入0汤圆

发表于 2009-3-30 15:33:36 | 显示全部楼层
今天收到套件了,准备干活,ifree64,ghost2,你们这个程序大概分成几个部分,程序架构是怎么样的?每个人做什么?不是你们都分好了吧,显示都开始做了,那我做ADC吧怎么样?我以前主要是做硬件的,软件不怎么做,做的不好的地方还请你们多多指教

出0入0汤圆

发表于 2009-3-30 15:38:25 | 显示全部楼层
ifree64 ghost2 dvhome,你们最好确定一个总的流程图,这样每个人做的时候,心理就有数了,该怎么做,怎么留接口。

出0入0汤圆

 楼主| 发表于 2009-3-31 19:15:52 | 显示全部楼层
回myworkmail
对于软件的总流程我目前也拿不太准,现在还处于一个摸索阶段。

出0入0汤圆

发表于 2009-3-31 19:19:33 | 显示全部楼层
【36楼】 ifree64  
参考一下魏坤的那个流程!

出0入0汤圆

发表于 2009-3-31 19:36:13 | 显示全部楼层
我上一个我从前做的程序供参考,环境:M8+CVAVR

点击此处下载 ourdev_430905.txt(文件大小:12K) (原文件名:dso-ks0108.txt)

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

本版积分规则

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

GMT+8, 2024-4-24 07:31

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

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