ifree64 发表于 2009-3-24 19:41:47

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

我的初步构思软件分为三层

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

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

3、STM8固件库层

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

ywl0409 发表于 2009-3-24 21:53:55

能不能让ADC自由采样,由定时中断信号来读取ADC的转换值.

ifree64 发表于 2009-3-24 23:39:02

你的意思是ADC连续采样吗?这样不方便控制采样率吧?

ghost2 发表于 2009-3-25 09:45:03

我个人建议从顶向下设计,先把各个屏幕定义一下,然后定义每个屏幕之间的跳转和事件。

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427789.GIF
基于状态机的软件开发 (原文件名:StateMachine.GIF)

ifree64 发表于 2009-3-25 14:52:47

ghost2
哈哈,我也是打算用状态机来开发。
但上面你给的图不是为这个项目设计的吧?

ghost2 发表于 2009-3-25 14:56:55

【4楼】 ifree64
>>> ghost2
>>> 哈哈,我的意思也是用状态机来开发。
>>> 但上面你给的图不是为这个项目设计的吧?

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

ZealotNH 发表于 2009-3-25 15:07:21

能不能像用AVR那样,有定时器中断自动触发ADC转换,ADC中断就是读出AD值?主程序就是状态机运行?

ghost2 发表于 2009-3-25 15:29:35

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

ZealotNH 发表于 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;
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;
CT=0x10;
sbi(SYS_RUN_state,ADOK);}
ADC_coute=CT;
}

my_avr 发表于 2009-3-25 15:54:57

STM8有外部触发

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_427903.JPG
(原文件名:未命名.JPG)

my_avr 发表于 2009-3-25 15:55:46

ADC_ETR就是外部触发信号输入

ZealotNH 发表于 2009-3-25 16:05:44

Internal TGRO trigger from TIM1。把TIM1 设成200K频率。
我什么资料都未看~

ifree64 发表于 2009-3-25 16:30:06

STM8的定时器太强大了,比起以前熟悉的ATMEGA16来说,简直是强大太多了。但是也复杂多了,数据手册上说明的好像有点乱,我还没有完全吃透。

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

ifree64 发表于 2009-3-25 16:50:32

STM8S208RB看上去ADC时钟可以设置到6MHz,转换时间2.33us,这样应该可以达到400K的采样率。

dvhome 发表于 2009-3-25 17:43:03

【12楼】 ifree64

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

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

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

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

smallsnail 发表于 2009-3-25 17:46:02

【14楼】 dvhome
-------------------
硬件上是不是可以采用双CPU的方案,一个专用于采集数据,一个用于计算显示?

ZealotNH 发表于 2009-3-25 18:48:51

硬件上是不是可以采用双CPU的方案,一个专用于采集数据,一个用于计算显示?

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

ywl0409 发表于 2009-3-25 19:42:20

楼上的方法是个好方法,感觉比较好.一个MPU就相当于ADC+FIFO.
数据传输的话,用并行的吧.速度快,控制容易.

ifree64 发表于 2009-3-25 19:51:18

是否用2个CPU要慎重,我也思考过用2个CPU,因为是在2个CPU之间进行采样数据的传递,这样做有没有真的减轻显示cpu或者采样cpu数据处理的负担?

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

ifree64 发表于 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时钟用于其他的处理,这个时间是否够?

ZealotNH 发表于 2009-3-25 20:03:19

感觉没多少,数据采集是硬件完成的。数据读出只需要不多的时间。cpu间通讯也是需要时间的。
除非数据采集的cpu也处理数据。

ywl0409 发表于 2009-3-25 20:15:13

数据读出不需要很多时间,可是LCD的显示,其他按键的响应,数据的判断,会需要不少时间的.

ZealotNH 发表于 2009-3-25 23:28:35

数据处理用的时间最多,如果做个均方根 8位的CPU够忙了。
做过市电128个点的均方根 用M16 16M。1602显示要把驱动拆散,程序才能正常运行。
液晶也要很多时间。
按键时间可以忽视。

dvhome 发表于 2009-3-26 01:35:51

苍天啊,晚上打的大长篇居然发送失败,没了,唉……

重新再来


【15楼】 smallsnail 燕 青

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


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

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

ZealotNH 发表于 2009-3-26 09:11:39

TO【23楼】 dvhome

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

myworkmail 发表于 2009-3-26 09:32:22

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

ZealotNH 发表于 2009-3-26 09:55:43

【25楼】 myworkmail
我是不赞成双CPU的./emotion/em077.gif,只是没表态。

smallsnail 发表于 2009-3-26 09:57:49

还是用两个STM8吧!用STM32与STM8,而且让STM8当主,说不过去啊!

sadf123 发表于 2009-3-26 10:36:13

建议用两个STM8.一个用做ADC+FIFO,另一个处理和显示数据.这样的话,存储深度也就增加了.

dvhome 发表于 2009-3-26 11:09:20

硬件、软件复杂程度都增加,成本也增加,功耗也增加

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


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

sadf123 发表于 2009-3-26 11:24:26

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

ifree64 发表于 2009-3-26 11:40:29

关于是否采用两片stm8,我觉得我们可以先做一下实验,让stm8以最大ADC速度采样,然后送LCD显示(我以为真正占用cpu资源的就这两个任务),看一个stm8是否忙得过来。

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

sadf123 发表于 2009-3-26 12:54:08

因为在显示的时候,并不是直接把拿来的数据显示到LCD上,还要进行处理,比如是否满足触发条件,采样率的情况,数据的计算等等.所以,还是用两片比较好.

dvhome 发表于 2009-3-26 13:15:03

【32楼】 sadf123


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

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

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

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

myworkmail 发表于 2009-3-30 15:33:36

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

myworkmail 发表于 2009-3-30 15:38:25

ifree64 ghost2 dvhome,你们最好确定一个总的流程图,这样每个人做的时候,心理就有数了,该怎么做,怎么留接口。

ifree64 发表于 2009-3-31 19:15:52

回myworkmail
对于软件的总流程我目前也拿不太准,现在还处于一个摸索阶段。

smallsnail 发表于 2009-3-31 19:19:33

【36楼】 ifree64
参考一下魏坤的那个流程!

ywl0409 发表于 2009-3-31 19:36:13

我上一个我从前做的程序供参考,环境:M8+CVAVR

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

反正就是看个流程吧,相关的头文件就不需要了.
页: [1]
查看完整版本: 【STM8手持示波仪】软件设计讨论