打印

【现场直播】一个数字温控仪表的实现(能显示了)

[复制链接]
楼主: 原野之狼
手机看帖
扫描二维码
随时随地手机跟帖
21
comelon| | 2009-12-17 10:04 | 只看该作者 回帖奖励 |倒序浏览
看热闹!:)

使用特权

评论回复
22
yewuyi| | 2009-12-17 11:46 | 只看该作者
嘿嘿,SVN收不收费?

免费的版本管理软件哪里有?!

使用特权

评论回复
23
一朝成名| | 2009-12-17 11:50 | 只看该作者
嘿嘿,SVN收不收费?

免费的版本管理软件哪里有?!
yewuyi 发表于 2009-12-17 11:46


开源的,免费~~linux下的
windows也可以装server,不过我没搞过,问小狼吧
客户端windows下也有~

使用特权

评论回复
24
yewuyi| | 2009-12-17 11:53 | 只看该作者
想用VSS,但不知道能否免费!?

使用特权

评论回复
25
一朝成名| | 2009-12-17 12:34 | 只看该作者
话说这么多年了,还真没用过收费的东西哈哈~~~~

使用特权

评论回复
26
原野之狼|  楼主 | 2009-12-17 16:52 | 只看该作者
白天去了趟少管所 现在接着写~

使用特权

评论回复
27
原野之狼|  楼主 | 2009-12-17 16:54 | 只看该作者
本帖最后由 原野之狼 于 2009-12-17 17:43 编辑

回复一些提问:
通讯部分再说 我慢慢写
外扩32KRAM是想做一些复杂点的程序
SVN是免费的
VSS不免费的 MS的东西咋可能免费呢 除非你使用DB

使用特权

评论回复
28
原野之狼|  楼主 | 2009-12-17 17:35 | 只看该作者
本帖最后由 原野之狼 于 2009-12-17 17:38 编辑

六、详细设计之硬件篇
    硬件上比较简单的,我一步一步讲,不仅讲我是怎么做的,还要讲我为什么要这么做。
    6.1、MCU部分
    使用ATMEGA64单片机,此单片机资源还是比较丰富的。从收据手册上摘录一段如下:
Features
• High-performance, Low-power AVR® 8-bit Microcontroller
• Advanced RISC Architecture
– 130 Powerful Instructions – Most Single Clock Cycle Execution
– 32 x 8 General Purpose Working Registers + Peripheral Control Registers
– Fully Static Operation
– Up to 16 MIPS Throughput at 16 MHz
– On-chip 2-cycle Multiplier
• Non-volatile Program and Data Memories
– 64K Bytes of In-System Reprogrammable Flash
Endurance: 10,000 Write/Erase Cycles
– Optional Boot Code Section with Independent Lock Bits
In-System Programming by On-chip Boot Program
True Read-While-Write Operation
– 2K Bytes EEPROM
Endurance: 100,000 Write/Erase Cycles
– 4K Bytes Internal SRAM
– Up to 64K Bytes Optional External Memory Space
– Programming Lock for Software Security
– SPI Interface for In-System Programming
• JTAG (IEEE std. 1149.1 Compliant) Interface
– Boundary-scan Capabilities According to the JTAG Standard
– Extensive On-chip Debug Support
– Programming of Flash, EEPROM, Fuses, and Lock Bits through the JTAG Interface
• Peripheral Features
– Two 8-bit Timer/Counters with Separate Prescalers and Compare Modes
– Two Expanded 16-bit Timer/Counters with Separate Prescaler, Compare Mode, and
Capture Mode
– Real Time Counter with Separate Oscillator
– Two 8-bit PWM Channels
– 6 PWM Channels with Programmable Resolution from 1 to 16 Bits
– 8-channel, 10-bit ADC
8 Single-ended Channels
7 Differential Channels
2 Differential Channels with Programmable Gain (1x, 10x, 200x)
– Byte-oriented Two-wire Serial Interface
– Dual Programmable Serial USARTs
– Master/Slave SPI Serial Interface
– Programmable Watchdog Timer with On-chip Oscillator
– On-chip Analog Comparator
• Special Microcontroller Features
– Power-on Reset and Programmable Brown-out Detection
– Internal Calibrated RC Oscillator
– External and Internal Interrupt Sources
– Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby
and Extended Standby
– Software Selectable Clock Frequency
– ATmega103 Compatibility Mode Selected by a Fuse
– Global Pull-up Disable
• I/O and Packages
– 53 Programmable I/O Lines
– 64-lead TQFP and 64-pad MLF
• Operating Voltages
– 2.7 - 5.5V for ATmega64L
– 4.5 - 5.5V for ATmega64
• Speed Grades
– 0 - 8 MHz for ATmega64L
– 0 - 16 MHz for ATmega64
    我要用到的资源主要有:
    JTAG调试:便于快速的找出错误,以前公司穷买不起仿真器,所以俺都是一遍遍的下载看现象调试,很费劲,当然也总结了一套调试的方法,以后有机会再讲这个。今年自己失业后冒着挨饿的风险买了个JTAG仿真器,初次使用,用着感觉很良好,再也不用瞎子摸象了。建议新手们买一个,老手也可以买一个的,呵呵。
    XRAM接口:能够扩展外部RAM,原来俺在PC上搞编程,所以鄙人喜欢大RAM大FLASH,当然这不好,成本是蹭蹭地上去了,不过用来练练软件技术也是不错的。既然要扩展,那肯定就少不了锁存器和存储芯片了。存储芯片使用的是常用的CY62256,这没什么好说的。锁存器用的是74AHC573,为什么要用这个呢?原因有二,第一,HC系列芯片速度慢,当MCU在16M时钟下运行会有问题的(其实也能用,但是手册上讲要用AHC系列,所以咱还是乖点吧~);第二,573的管脚排列比373更有规律,便于布线。另外地址线是打乱的,也是为了好布线。这部分的原理图和PCB如下:

图4 MCU和存储器接口的原理图

图5 MCU和存储器接口的PCB走线
    PWM:用来实现模拟电压(或电流)输出。
    EEPROM、TIMER、IO:这没什么好说的。

使用特权

评论回复
29
原野之狼|  楼主 | 2009-12-17 17:58 | 只看该作者
6.2 显示部分
    根据需求部分描述,本系统采用了两个五位显示窗口,那么就是十位数码管,另外加上四个LED。俺使用动态扫描的方法,可以节约几个锁存器件。
   驱动芯片采用两片74HC595。其中一片作为段驱动。另外一片作为位驱动,只能驱动8个位,实际上需要11个位,所以剩下的3个位有MCU直接驱动。这部分的原理图如下:
   
图6 显示部分原理图一

图7 显示部分原理图二

使用特权

评论回复
30
原野之狼|  楼主 | 2009-12-17 18:18 | 只看该作者
本帖最后由 原野之狼 于 2009-12-17 18:22 编辑

6.3 DS18B20部分
   采用两线制来工作。手册上提供的电路是这样的,MCU和18B20通讯的时候采用4.7K上拉电阻的方式供电,而当18B20进行温度转换的时候采用MOS关上拉来进行供电,但是俺看国内基本上都是只用一个上拉电阻来搞定。试验证明,只用一个上拉电阻也是行的,我通常使用1K做上拉,如果采用4.7K做上拉可能在高温区会出错。
   6.4 按键部分
   采用动态扫描的方式来获取按键事件。电路图很简单:
   
图8 按键部分原理图

   6.5 电源部分
   采用变压器供电,然后再经过78XX系列稳压器进行稳压,有两组电源,一组供给数字系统,一组供给模拟部分,两个地层单点连接。电路图也很简单:

图9 电源部分原理图

    关于硬件部分就先说这么多,鄙人硬件方面比较弱,欢迎各位批评指正。详细的图纸还得整理,因为以上截图均来自于于另外一个地方,但是俺编程的时候都得靠它了。

使用特权

评论回复
31
原野之狼|  楼主 | 2009-12-17 21:01 | 只看该作者
七、详细设计之软件篇
      做软件设计的时候最忌讳不规划就敲键盘编码了,这种代码质量一般不会太高。如果是一个大型软件,没有规划的话我无法想象直接编码是怎么个样子。当然对于这点鄙人做得也不好,有时候也是把那些软件工程的理论抛之脑后然后信手敲来。
      软件工程的那些理论比较繁杂,我就不说了,也说不好。还是各位自己悟去吧。我主要给推荐一个工具,那就是微软的VISIO,一个用于画各种图表的东东,有框图,有流程图等等,各位慢慢发掘。另外还有一个工具,RATIONAL ROSE,搞面向对象的时候可以玩玩,可惜俺不怎么懂这个玩意儿。下面贴一个图,想象一下如果这个状态迁移图不记录下来的话直接去敲键盘编码是件多么费脑细胞的事情,而且以后还无据可查。

图10 使用VISIO的一个示例

使用特权

评论回复
32
mantianbingxue| | 2009-12-17 21:18 | 只看该作者
学习了

使用特权

评论回复
33
原野之狼|  楼主 | 2009-12-17 22:25 | 只看该作者
本帖最后由 原野之狼 于 2009-12-17 22:29 编辑

7.1 软件平台介绍
    俺习惯用source insight编辑软件,用gcc编译器,在MS自带的CMD窗口下用命令行调用gcc,用winavr通过JTAG进行硬件级仿真调试,截取一些图片来占篇幅,呵呵~

图11 硬件以及仿真器

图12 编辑工具

图13 编译工具

图14 仿真界面

使用特权

评论回复
34
程序匠人| | 2009-12-17 23:14 | 只看该作者
VISIO 是不错的软件

使用特权

评论回复
35
原野之狼|  楼主 | 2009-12-18 15:27 | 只看该作者
王大哥说的有道理,谢谢支持~

使用特权

评论回复
36
原野之狼|  楼主 | 2009-12-18 15:34 | 只看该作者
7.2 C和C++混合编程
      这个很简单,只要在C的头文件中加上几句代码就是了。那就是:
 
#ifdef __cplusplus
extern "C" {
#endif

//do something here

#ifdef __cplusplus
}
#endif

    还有在makefile文件中也需要添上和C++编译有关的东西,在稍后上传的代码中有具体实现。
    当然,我这里说的也忒简单了,还有更深的内容在接下来的篇章中叙述。这里叙述的比较简单,是因为在7.3小结中会用到这些简单内容。

使用特权

评论回复
37
原野之狼|  楼主 | 2009-12-18 15:59 | 只看该作者
本帖最后由 原野之狼 于 2009-12-18 16:07 编辑

7.3 点亮数码管
    这人好面子,东西也好面子,先得有点靓的东西装点下门面吧,呵呵,其实还是人好面子,关东西鸟事?
    OK!废话少扯!
    接下来我们要实现:
    (1) 点亮所有能亮的东西。
    (2) 维持一秒。
    (3) 在主显示窗显示 “-21IC”,在副显示窗显示“VER1.0”。
    无图无真相,先看实际效果:
   
图15 全部点亮

图16 版本信息

使用特权

评论回复
38
原野之狼|  楼主 | 2009-12-18 16:06 | 只看该作者
接下来就该贴代码了。
7.3.1 74HC595驱动部分
     在这里用了两片595,共用移位时钟和所存时钟,详细介绍在代码里头有,俺就不重复了。
 
/************************************************************
FileName: hc595.h
Author: 原野之狼
Version :V1.0      
Date: 2009.12.17
Description:
  1 Be care of that the two hc595s are share of the shift clk & latch clk,but the dat line is not share.
     First make the dat line of the two hc595s ready,
     then just shift it through the shift clk,when 8 bits are done,latch it through the latch clk.
History:
      <author>      <time>      <version >      <desc>

************************************************************/
#ifndef _H_HC595_H_
#define _H_HC595_H_
#include "type.h"
#ifdef __cplusplus
extern "C" {
#endif
//some define of the shift clk io
#define PORT_SHCP PORTE
#define DDR_SHCP DDRE
#define BIT_SHCP 5
//some define of the latch clk io
#define PORT_STCP PORTE
#define DDR_STCP DDRE
#define BIT_STCP 4
//set & reset the shift clk
#define SET_SHCP PORT_SHCP|=(0x01<<BIT_SHCP)
#define RST_SHCP PORT_SHCP&=(~(0x01<<BIT_SHCP))
//set & reset the latch clk
#define SET_STCP PORT_STCP|=(0x01<<BIT_STCP)
#define RST_STCP PORT_STCP&=(~(0x01<<BIT_STCP))
//some define of the dat line,it's about the 1# hc595 which is used for segment driver
#define PORT_DAT1 PORTE
#define DDR_DAT1 DDRE
#define BIT_DAT1 2
#define SET_DAT1 PORT_DAT1|=(0x01<<BIT_DAT1)
#define RST_DAT1 PORT_DAT1&=(~(0x01<<BIT_DAT1))
//some define of the dat line,it's about the 2# hc595 which is used for bit driver
#define PORT_DAT2 PORTE
#define DDR_DAT2 DDRE
#define BIT_DAT2 3
#define SET_DAT2 PORT_DAT2|=(0x01<<BIT_DAT2)
#define RST_DAT2 PORT_DAT2&=(~(0x01<<BIT_DAT2))
//delay time slot
#define DELAY595 do{\
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");\
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");\
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");\
}while(0)
//this can genarate a positive pulse at the shift clk pin of the two hc595s
#define SH_POSITIVE_PULSE do{\
RST_SHCP;\
DELAY595;\
SET_SHCP;\
DELAY595;\
} while(0)
//this can genarate a negtive  pulse at the latch clk pin of the two hc595s
#define LT_NEGATIVE_PULSE do{\
RST_STCP;\
DELAY595;\
SET_STCP;\
DELAY595;\
}while(0)

void init_595(void);
void driver_595(UINT8 dat1,UINT8 dat2);
#ifdef __cplusplus
}
#endif
#endif


 
/************************************************************
FileName: hc595.c
Author: 原野之狼
Version :V1.0      
Date: 2009.12.17
Description:

History:
      <author>      <time>      <version >      <desc>

************************************************************/
#include "includes.h"

/***********************************************************
Description:
  intial the port
Modify Record:

***********************************************************/
void init_595(void)
{
SET_SHCP;
DDR_SHCP |= (0x01 << BIT_SHCP);

SET_STCP;
DDR_STCP |= (0x01 << BIT_STCP);
SET_DAT1;
DDR_DAT1 |= (0x01 << BIT_DAT1);

SET_DAT2;
DDR_DAT2 |= (0x01 << BIT_DAT2);
}
/***********************************************************
Description:
  driver the two hc595s
  
Input:
  dat1:data of the 1# hc595
  dat2:data of the 2# hc595
Modify Record:

***********************************************************/
void driver_595(UINT8 dat1,UINT8 dat2)
{
UINT8 i;

for (i = 0; i < 8; i++)
{
  if (dat1&0x80)
  {
   SET_DAT1;
  }
  else
  {
   RST_DAT1;
  }
  
  if (dat2&0x80)
  {
   SET_DAT2;
  }
  else
  {
   RST_DAT2;
  }
  
  SH_POSITIVE_PULSE;
  dat1 <<= 0x01;
  dat2 <<= 0x01;
}

LT_NEGATIVE_PULSE;
}

使用特权

评论回复
39
piter_tan| | 2009-12-18 16:27 | 只看该作者
:D支持一下!晚上再来看连载

使用特权

评论回复
40
韩秋婷| | 2009-12-18 16:49 | 只看该作者
硬件设计不合理
实现楼主的功能几毛钱就能搞定了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则