最新日志

发表于:2008-7-20 10:46:05
标签:DS1820  温度  

0

DS18(B)20

 

1       概述

 

 

软件主程序文件

      main.c

 

软件子程序文件

ds18b20.h  DS18B20温度传感器头文件

delay.h    延时头文件

 

 

 

 

2 各程序模块描述

2.1主程序名main();

 

主程序通过和温度传感器通讯,计算和判断被测机子内的温度和指定的范围进行比较,

落在范围之内不报警,范围之外报警。其中恢复临界温度值小于报警临界温度值,以

免临界状态下频繁报警和恢复。

 

流程如下:

2.2ds18b20.h头文件模块主要任务是读取温度传感器的温度转换数据,并返回调用主程序,流程如下:

 

2.3 delay.h 主要用于产生μsms“延时标准”,由调用程序决定延时系数。

  流程简单,但此处用C语言编写的话最好实测其延时时间。可以在主程序中编写一段产生一方波的程序来测量“延时标准”。DS18(B)20单总线时序要求还是挺严格的。

 

3.源程序

 在调试过程当中针对不能直观的看到温度测量数值,在程序中加入了232串口通信程序,方便调试查看(该电路没有设计显示接口),对DS18(B)20的其它应用场合具有一定的参考价值。

下面是Keil C51 下DS18(B)20的C语言头文件,也可以修改为AVR的应用:

///designed by hsz///
///all rights reserved//
#include <reg51.h>
#include <delay.h>
#include <intrins.h>

sbit DQ="P1"^7;
#define set()   {DQ=1;}//{DDRB|=(1<<PB0);PORTB|=(1<<PB0);}//PB0éè???aê?3?×′ì?£?ê?3?1
#define clear()   {DQ=0;}//{DDRB|=(1<<PB0);PORTB&=~(1<<PB0);}//PB0éè???aê?3?×′ì?£?ê?3?0
#define read()   (DQ)//(PINB&(1<<PB0))//DDRB&=~(1<<PB0);//PB0éè???aê?è?×′ì?£??áPB0??
unsigned char ds18_start(void);
void ds18_send(unsigned char);
unsigned char ds18_readchar(void);
//---------------------------------------------------------------------------------------
/*void Init_DS18B20(void)
{
if(ds18_start()==0)//?′??
{ds18_send(0xcc);//ì?1yROM?¥??
//ds18_send(0x4e);//éè??D′?£ê?
//ds18_send(0x64);//éè?????èé??T100?è
//ds18_send(0x8a);//éè?????è???T-10?è
//ds18_send(0x7f);//12?????裨??�?
}
}*/
//----------------------------------------------------------------------------------------
char Read_ds18b20()
{
unsigned char th,tl;
char temp="0";
if(ds18_start())//3?ê??ˉê§°ü?ò·μ??0
return '\0';
//ds18_start();
ds18_send(0xcc);//ì?1yROM?¥??
ds18_send(0x44);//???ˉ×a??
_delay_ms(200);//?ó3ù1s
ds18_start();//???e
ds18_send(0xcc);//ì?1yROM?¥??
ds18_send(0xbe);//?áè??Y′??÷êy?Y£?9×??ú
tl=ds18_readchar();//?è?áμí8??
th=ds18_readchar();//?ù?á??8??
ds18_start();//?áê??áè?oó??μ?êy?Y
///----------------------------DS18B20------------------------------------//
/*
tl&=0xF0;//è?μí×??úμ???????
tl>>=4;//
temp=th;
temp&=0x07;//è???×??úμ?μí3??
temp<<=4;//
temp|=tl;
if((th&0xF8)==0xF8)//?o???è?μêy
temp=(-temp);
*/
///--------------------------DS1820--------------------------------------//
tl>>=1;//è?μí×??úμ???7??
temp=tl;
if(th==0xFF)//?o???è?μêy//DS1820
temp*=(-1);/////????·?±??ê1?è
///------------------------------------------------------------------//
return temp;
}
//---------------------------------------------------------------------
unsigned char ds18_start(void)
{
unsigned char i,flag;//?¨ò?3?ê??ˉ3é1|±ê??
flag=1;
i=100;
set()
_nop_();
clear()//×ü????à­£?3?ê??ˉ?aê?
_delay_us(45);//×ü??±£3?μíμ???480-960us????//45-80???????éò?
set()//×ü??à­??
_nop_();//?áó|′e£?15-60usoó
_nop_();
while(i--)
{
 if(!read())
 {flag=0;//μ?μ?′ó?ú?ìó|
 _delay_us(25);
 break;}//480us//μèμ?ó|′eμíμ????áê?
}
set()
return(flag);
}
//----------------------------------------------------------------------------
void ds18_send(unsigned char i)
{
unsigned char j="8";
for(;j>0;j--)
{clear()///?è??0£?oí????×?oóμ???1??o?2úéúê±????
_nop_();
_nop_();
_nop_();
_nop_();//10us
if(i&0x01)/// ×?μí??£?è??a1£??ò??1
set()
_delay_us(7);//45us
set()//×?±????ˉ??ò???D′ê±????
i>>=1;
}//end for
set()
}
//-----------------------------------------------------------------------------
unsigned char ds18_readchar(void)
{
unsigned char i="0",j=8;
for(;j>0;j--)
{
i>>=1;
set()
_nop_();//2us
clear()
_nop_();//2us//ê±????′óóú1us
set()
_nop_();//2us
_nop_();//2us
_nop_();//2us
_nop_();//2us
//_nop_();//2us
if(read())
i|=0x80;//?è?óê?μ?ê?μí??
_nop_();//2us
_nop_();//2us
_delay_us(7);//40us//45us
}//end for
return i;
}
//----------------------------------------------------------------------------

以下是本人以前汇编源程序,带232串口通信,对多点温度采集有点参考价值:

;;;;designed by hsz 20050710;;;
;;;;all rights reserved;;

SCLK bit P3.2
SDA  bit P3.3
LED  bit P3.5
TXPC bit P3.1
RXPC bit P3.0
EEADD EQU 21H
WRITADD EQU 22H
DATANUM EQU 23H
TRUENUM EQU 20H
TEMPER_L EQU 26H
TEMPER_H EQU 25H
TEMPER_NUM EQU 24H
DQ BIT P3.4

ORG 0000H
AJMP BEGIN
ORG 0003H;INT0
RETI
ORG 000BH;T0
RETI
ORG 0013H;INT1
RETI
ORG 001BH;T1
RETI
ORG 0023H;COM
AJMP serialport
;RETI
ORG 002BH;T2
RETI
ORG 0100H
BEGIN:
MOV SP,#5FH
MOV IE,#00H;1??ùóD?D??
CLR LED;??ê?μ?ááò???
ACALL DELAY
MOV A,#0FFH
MOV P1,A
MOV P3,A
;CLR RXIR ;oìía?óêü??3?ê??ˉμíμ???
CLR C
MOV A, #00H
MOV R0,#7FH;PC BUF
MOV R1,#20H;IR BUF
MOV R2,#00H;PC COUNT
MOV R3,#00H
MOV R4,#00H;IR COUNT
mov TMOD,#20H ;T1: 1¤×÷?£ê?2
mov TL1,#0FDH
mov TH1,#0FDH ;3?ê??ˉ2¨ì??꣨2???±í£?
CLR ET1
SETB TR1 ;T1?aê?1¤×÷
mov SCON,#50h ;Standard UART settings
mov PCON,#00h ;9600bps
SETB ES ;?a′??ú?D??
CLR TI
CLR RI
;SETB REN ;?êDí?óê?
SETB EA;?êDí×ü?D??

LCALL TEMP_CONFIG

MOV A,#'H'
MOV SBUF,A
JNB TI,$
CLR TI

MOV A,#'I'
MOV SBUF,A
JNB TI,$
CLR TI
;************************************************
MAIN:
setb es
CLR RI
MOV A, #00H
MOV R0,#7FH;PC BUF
MOV R2,#00H;PC COUNT
MOV R3,#00H
MOV R4,#00H
JNB RI,$
NOP
CLR RI
MOV A,@R0
CJNE A,#0C0H,MAIN;?o3??úá?·¢?í??pc£?·??òí?3??ú?óê?
NEXT1:
DEC R0
JNB RI,$
NOP
CLR RI
MOV A,@R0
CJNE A,#0FFH,MAIN
NEXT2:
DEC R0
JNB RI,$
NOP
CLR RI
MOV A,@R0
CJNE A,#68H,MAIN;;;;??í·ê?±e
RECEIVE:
DEC R0;;′?′¢??????ò?
INC R2;;??êy?óêüμ?μ?óDD§êy?Y??êy
JNB RI,$
NOP
CLR RI
MOV A,@R0
CJNE A,#4FH,RECEIVE
DEC R0
INC R2;;??êy?óêüμ?μ?óDD§êy?Y??êy
JNB RI,$
NOP
CLR RI
MOV A,@R0
CJNE A,#4BH,RECEIVE
DEC R2;;?óê?μ??áê?·??á?à??2′?£???????2
DEC R2
CLR ES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHECK:   MOV A,R2;??′?êy?Yê±D£?é×?oí?áê?·?óé??′?3ìDò±?éí2úéú
   MOV TRUENUM,R2

   MOV A,R0
   MOV R1,A;???òμ1êyμú3??×??ú£??′??êyD£?é×?
   INC R1
   INC R1
         MOV A,@R1
         MOV DATANUM,A
         CJNE A,TRUENUM,MAIN;?D??′??íà′μ?×??úêyê?·??yè·£?2??yè·?ò?a?ú
NOP
CLR F0
mov 26h,#00h
mov 25h,#00h
LCALL GET_TEMPER
MOV R0,#TEMPER_L
LCALL SEND
LCALL DELAY

LCALL TEMPER_COV
MOV DATANUM,#02H
MOV R0,#TEMPER_NUM
LCALL SEND
LCALL DELAY


MOV 37H,#00H
CLR A
MOV C,F0
RLC A
MOV 37H,A
MOV R0,#37H;#TEMPER_NUM
LCALL SEND
LJMP MAIN

GET_TEMPER:
SETB DQ
BCD:
LCALL INIT_1820
JB F0,S22
LJMP BCD
RET

S22:LCALL DELAY1
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA:
LCALL INIT_1820
JB F0,ABC
LJMP CBA
ABC:LCALL DELAY1
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#0BEH;;;;;;;;;;?á?ú2???′??÷?üá?
LCALL WRITE_1820
LCALL READ_1820
RET

INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R7,#3;;;;;;;;;;256*2=512us;;òa?ó480--960usμíμ??·
TSR1:MOV R6,#107
DJNZ R6,$
DJNZ R7,TSR1
SETB DQ
NOP
NOP
NOP;;;;;;;;;;;;;;;;;;;;12M ADD A NOP
MOV R7,#25H;#3CH;60US??μ???
TSR2:
JNB DQ,TSR3;;60-240US
DJNZ R7,TSR2
LJMP TSR4
TSR3:;SETB FLAG1
SETB F0
LJMP TSR5
TSR4:;CLR FLAG1
CLR F0
LJMP TSR7
TSR5:MOV R7,#00H;#117;256*2=512us;;;;;ds1820?ìó|?áéùòa480us
TSR6:DJNZ R7,TSR6
TSR7:SETB DQ
RET

WRITE_1820:
MOV R6,#8
CLR C
WR1:CLR DQ
MOV R7,#5;;;12M USE #6
DJNZ R7,$
CLR C
RRC A
MOV DQ,C
MOV R3,#21;;;;;;;12M USE #23
DJNZ R3,$;;;;;;±£3?μíμ????áéù15us
SETB DQ
NOP
DJNZ R6,WR1
SETB DQ
RET

/*TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1;??éá??è? °?????±ê??acc.3=0 éá  acc.3=1 ??
INC TEMPER_NUM

TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM;????μí???′?eà′
MOV TEMPER_NUM,A
LCALL BIN_BCD
RET
*/
TEMPER_COV:
MOV A,TEMPER_H
CJNE A,#0FFH,TMA1
CLR 01H
LJMP TMMA1
TMA1:SETB 01H
LJMP TMMA2
TMMA1:MOV A,TEMPER_L
CPL A
MOV TEMPER_L,A
TMMA2:
MOV A,TEMPER_L
CLR C
RRC A
MOV TEMPER_NUM,A
/*
MOV A,#00H
RLC A
ORL A,#00011000B
MOV TEMPER_XIAO*/
LCALL BIN_BCD
RET

BIN_BCD:
MOV DPTR,#TEMPER_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET

TEMPER_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H
DB 90H,91H,92H,93H,94H,95H,96H,97H,98H,99H

READ_1820:
MOV R4,#2
MOV R1,#TEMPER_L;#26H;;;êy?Yμí×??ú·??ú36h£???×??ú·??ú35h
RE00:
MOV R2,#8
RE01:
CLR C
SETB DQ;;;;;;;?áéù±£3?1us;;;BUS CAN BE LOW AFTER READ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ;;;;;;;?áéù±£3?1us
MOV R3,#8;;;;;;12M USE #9
DJNZ R3,$;;;;;15us?ú2é?ù×ü??êy?Y
MOV C,DQ;;;;;;;;;;2é?ùêy?Y
MOV R3,#21;;;;45us?ó3ù;;;;12M USE #23
DJNZ R3,$
RRC A
DJNZ R2,RE01;;;;;;;μí8??êy?Y
MOV @R1,A
DEC R1
DJNZ R4,RE00;;;;;;;??8??êy?Y
RET

SEND:
 CLR TI
 SETB ES
MOV A,#0C0H;??′?êy?Yê±?eê?×?óé??′?3ìDò±?éí2úéú
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#0FFH
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#68H
MOV SBUF,A
JNB TI,$
CLR TI
   ;MOV R0,#7CH;???òêy?Y??
        MOV A,@R0
   MOV R3,DATANUM;?′?ú??′??­?·?Déù′?D£?é×?
   DEC R3
   MOV R4,#00H
     CJNE R3,#00H,REPEAT;;;??óDóDD§êy?Y
    AJMP TAIL  ;;;ì?·¢?í???2
REPEAT: MOV SBUF,A
         DEC R0
   INC R4 
       MOV A,@R0;μ?μ?pc?o3???μ?êy?Y
       JNB TI,$
         NOP
         CLR TI
         DJNZ R3,REPEAT

TAIL:INC R4;;;;óDD§êy?Y??êy?óD£?é×?1
MOV A,R4;??′?êy?Yê±D£?é×?oí?áê?·?óé??′?3ìDò±?éí2úéú
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#'O';;?áê?·?
MOV SBUF,A
JNB TI,$
CLR TI
MOV A,#'K'
MOV SBUF,A
JNB TI,$
CLR TI
clr es
RET

serialport:
       CLR EA
WAIT:  JB TI,SENDIR
       JB RI,RECIR;RI==1μ??°??á?RI2¢ì?×a
         SETB EA
       RETI
RECIR: MOV A,SBUF
   MOV @R0,A  ;oìíaêy?Y?o3???
         CPL LED
   SETB EA
         RETI
SENDIR:  CPL LED     
     SETB EA
     RETI

TEMP_CONFIG:
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#4EH
LCALL WRITE_1820
MOV A,#64H;;;;;;;é??T±¨?ˉ100
LCALL WRITE_1820
MOV A,#8aH;;;;;;;???T±¨?ˉ-10
LCALL WRITE_1820
MOV A,#7FH;;;;;;;;;;;;;;;;;;12sbit   #1fh 8BIT
LCALL WRITE_1820
NOP
NOP
RET

DELAY:MOV R7,#00H
MIN:DJNZ R2,YS500
RET
YS500:LCALL YS500US
LJMP MIN
YS500US:MOV R6,#00H
DJNZ R6,$
RET
DELAY1:MOV R7,#20H
DJNZ R7,$
RET

END

点击此处查看原文 >>

系统分类: 单片机   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(68)
发表于:2008-5-21 18:41:02
标签:AVR  GCC  

0

那恼人的MakeFile

AVR Studio 4后的版本支持了GCC的,高手用了多说好,惹的我好生羡慕,于是下载AVR Studio 413b528和WINAVR 20070525来用,按网站上写的步骤新建工程后,界面果然爽,很像VC++。没想到抄了个例子老编译不出来,NO RULE FOR TRAGET ,NEED BY...   按照大虾们说的Makefile不是在工程属性里设置就好了吗?!感觉被骗。。。

整了半天原来AVR Studio 4 只支持英文路径名,把我原来的“\**工程\很NB的单片机\**”改成英文路径名就好了,晕,白费看这么多大虾的讲解。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(144)
发表于:2008-4-22 20:47:28
标签:单片机  TLC1543  1602  

0

AT89C52+1602+TLC1543续

 

2.3 显示程序部分描述:程序名display(); 显示部分主要硬件为MDL16168D,物理上是16字单行,逻辑上是8字两行。内部RAM如图4所示。

 

 点击看大图

                                                               4

 

显示一串字符串的程序lcdwda(uchar ,uchar*);程序流程如下:

点击看大图

5x表示从液晶屏的第x个字开始显示。

最后P1口置高是为了避免和TLC1543采样冲突。

 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(253)
发表于:2008-4-20 9:04:07
标签:AD转换  单片机  1602  1543  

0

AT89C52+1602+TLC1543

点击下载电路

 

 

点击看大图

2 各程序模块描述

2.1主程序名main();

 

主程序通过循环采样每一个通道,计算和判断每一个通道和指定的范围进行比较,

落在范围之内不报警,范围之外报警。其中恢复范围略小于报警范围,以免临界

状态下频繁报警和恢复。

 

流程如下:

2.2  AD转换描述:程序名TLC1543。由TLC1543芯片作AD转换,使用TLC1543A0-A7八路采样通道(具体对应关系见电路图),TLC1543通过SPI接口和单片机进行通讯。TLC1543SPI通讯的时序如下:

点击看大图

相应的流程图如下:

4位地址ADDRESS和前4位上次采样的结果通过程序TLC1543的子程序void sendport(uchar data sampleport);完成,后六位上次采样结果通过程序TLC1543的子程序void receivesix(void);完成。

       为保证采样的准确性,程序TLC154310次采样结果进行平均值滤波。通过程序TLC1543的子程序uint caculate(uchar data sampleport);完成平均值滤波并返回平均值。

////**************************************************************************//////////

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(441)
发表于:2008-3-27 18:48:42
标签:AVR  接口  SRAM  XMEM  

0

AVR XMEMORY1

点击开大图

HC573和HC373功能差不多,管脚排列不同。另外DATASHEET中明确指出:

由于XRAM 接口的工作速度很高,当系统的工作条件高于8 MHz @ 4V 和4 MHz @ 2.7V
时要注意小心选择地址锁存器。此时典型的老式74HC 系列锁存器已经无法满足要求了。
XRAM接口与74AHC系列的锁存器相兼容。当然,其他满足时序要求的锁存器也是可以使
用的。

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类:    |    来源: 整理

评论(0) | 阅读(393)
发表于:2008-3-25 19:12:25
标签:无标签

0

评论(0) | 阅读(241)
发表于:2008-3-23 17:55:52
标签:AVR  Internet  

0

当粘贴板用下

基于AVR单片机多任务嵌入式Internet系统设计

 

1 引言

    目前,嵌入式系统已经广泛渗透到人们的工作、生活中。从家用电器、信息终端、手持通信设备到仪器仪表、制造工业、过程控制等领域,嵌入式设备已随处可见。另一方面,近几年来Internet技术的飞速发展给嵌入式应用带来了新的契机,在未来嵌入式系统中应用Internet技术具有很大的优势。

    目前嵌入式Internet技术的实现主要有下面三种方式 

    第一种方式是EMIT技术,采用支持TCP/IP协议的高性能服务器作为网关(emGateway, 嵌入式设备通过RS-232RS-485或者CAN总线等与网关服务器连接,间接通过服务器网关连接Internet。经过多年的发展EMIT技术已经在工业设备的网络化中得到了广泛的应用。但该技术也存在着以下的缺点:由于需要使用高性能的网关服务器,再加上emGateway网关的使用需要缴纳相应的版税,从而使得成本很高;而且网关和设备之间需要专门布线,在嵌入式设备比较分散的情况下极为不便,通信的距离、速度都受到一定的限制。

    第二种方式是采用硬件协议栈芯片进行网络连接,比如Seiko公司的S7600,嵌入式MCU通过接口对其进行控制以达到Internet通信的目的,这时软件只需要增加一段和协议栈芯片通信的接口程序即可,因此开发难度小、周期短。其缺点是系统的硬件成本非常高,而且由于使用的是硬件协议栈,扩展不灵活。

    第三种方式是在嵌入式MCU上用软件实现TCP/IP协议栈,然后通过网络接口芯片连接Internet。在这种方式中由于使用了软件协议栈使得嵌入式MCU本身具有了Internet通信能力,从而省去了高性能网关和硬件协议栈芯片,因此成本非常低,而且扩展起来非常方便灵活,再配上小型嵌入式实时操作系统的支持,就可以实现性价比很高的嵌入式多任务Internet平台。但是要在资源有限的16位甚至8位单片机上实现复杂的操作系统和网络协议栈有一定难度,但近年来随着单片机处理速度的不断提高和内部资源的不断扩展,再加上小型的实时操作系统和网络协议栈的相继推出,使得利用单片机来实现低成本嵌入式多任务网络平台成为可能。

    基于以上背景,本文就来介绍应用在研究课题“低码率视频信号的网络传输”系统中的一种基于AVR单片机的多任务嵌入式网络系统软硬件平台的设计。

2 硬件平台设计

   
考虑到以太网接入方式技术成熟、可靠性高、通信速度快和成本低的优点,本系统的硬件平台采用单片机加以太网接口控制芯片组成。由于操作系统和协议栈需要用到大量的数据存储器,因此需要外扩RAM存储器。为了提高通信性能,单片机与以太网接口芯片之间采用并行总线扩展方式进行连接,接口芯片和外部的RAM存储器统一编址。本系统采用了可编程GAL器件ATF16V8进行地址译码,这样不仅可以充分利用地址资源,而且只需要修改ATF16V8的源程序即可实现地址的改变,提高了系统的扩展能力。系统的硬件平台的原理框图如图1所示。

点击看大图

                                      1:硬件平台系统框图
 
   
单片机选用高性能的AVR单片机ATmega128AVRATMEL公司结合了成熟的51系列和PIC系列单片机的优点而推出的高性能8位单片机,具有以下特点 

性价比高: AVR单片机内部集成了810位的ADCPWME2PROMWDTRTC等,具有了片上系统(SOC)的雏形,大幅度降低了系统的整体体积和成本。  速度快:AVR单片机采用了先进的RISC体系架构,大多数指令可以在一个时钟周期内完成,理论上速度可以达到1MIPS/MHz。而且具有只需要两个时钟周期的硬件乘法器。

接口丰富:AVR单片机除可以进行并行扩展外,还具有USARTSPII2C串行总线。

ISP&IAP:其内部的可擦写FLASH存储器不仅可以进行在线下载,而且具有片上的BOOT程序实现在应用可编程,真正实现同时读写操作。

开发方便:AVR是第一款真正为C语言开发设计的单片机,具有多种编译器。而且具有JTAG接口,可以进行在线调试。

低功耗:AVR单片机具有六种睡眠模式,可以最大程度的降低系统的功耗。

    
以太网接口控制芯片采用Realtek公司生产的以太网接口控制器RTL8019AS  ,其10M处理能力对于本课题需要的码率为4Mbps视频流的网络传输来说完全满足要求。另外8019AS片内集成了16KByteRAM用作发送和接收的缓冲区,对其访问可以使用远程DMA方式,从而大幅提高接口的通信能力。需要注意的是,由于ATmega128数据总线是8位,RTL8019ASIOCS16B引脚应当下拉接地以选择8位总线方式,而且JP引脚要接高电平以选择跳线模式。

    地址译码采用的是ATF16V8,具体是把MCU地址线的高8位作为16V8的译码输入,16V83位输出作为译码片选输出:低端RAM32KB)、高端RAM32KB)和8019AS的片选。由于8019AS的地址空间仅需要32Byte,而且与高端RAM的地址重叠,为了给RAM分配尽可能多的地址空间,为8019AS分配顶部的256Byte,而把剩余的地址空间全部分配给RAM。上述译码的CUPL描述如下:

CS_RAM_L = ! A15;

CS_RAM_H = A15 & ! (A14 & A13 & A12 & A11 & A10 & A9 & A8);

CS_8019 = A15 & A14 & A13 & A12 & A11 & A10 & A9 & A8;

3 操作系统移植 

    uC/OS-II是一个专门为中小型嵌入式应用设计的抢占式的实时操作系统内核,具有源代码公开、移植性好、可裁减、可固化、实时性和安全稳定性高的特点  ,非常适合本系统的应用。uC/OS-II的系统框图如图2所示。

uC/OS-II与硬件平台无关的代码文件:UCOS_CORE.CUCOS_II.C
 
uC/OS-II
配置代码文件:INCLUDES.H OS_CFG.H
 
 
 
                    
                                           
2uC/OS-II的系统框图
 


uC/OS-II

    在设计之初就充分考虑了移植性,移植起来非常方便。从图2可以看出,与移植有关的只有3个文件:OS_CPU.HOS_CPU_C.COS_CPU_A.S

    1个文件是OS_CPU.H,其中主要定义了一些与编译器有关的数据类型、堆栈的生长方向、临界代码区的保护方式。需要说明的是uC/OS-II中临界代码区的保护方式有3种,本设计采用第3种,即在进入临界区之前把CPU状态寄存器SREG的内容保存到一个局部变量cpu_sr中,在退出临界区之后再还原SREG,这样做的好处是临界区保护不会对SREG产生影响。其中SREG的保存和返回函数必须由汇编语言来写,放在OS_CPU_A.S文件中。

    2个文件OS_CPU_C.C中主要是任务堆栈初始化函数OSTaskStkInit(),任务创建时调用此函数来初始化任务的堆栈结构。该函数一开始把传入的任务函数的指针存放到硬件堆栈的栈顶,看上去就像该函数在执行过程中发生了中断一样(低字节在先),这样返回后就可以从新的任务开始执行了。需要特别注意的是,在这个函数中必须把CPU状态寄存器SREG的值设为0x80,也就是全局中断使能,否则系统将崩溃。

    最后一个文件OS_CPU_A.S是一个汇编源文件,主要定义了6个汇编函数。首先是临界区保护用到的SREG保存和恢复函数。然后定义的是OSStartHighRdy()函数,它只在系统启动时由OSStart()函数调用一次,所做的工作主要是让系统从最高优先级的任务开始执行,实现的方法和后面要介绍的OSCtxSw()函数相似。OSCtxSw()函数实现的是任务级的切换,首先把当前的任务的状态保存到其任务控制块TCB中,然后把当前优先级最高的任务的TCB中的内容加载到工作寄存器中,这样函数返回后就可以从此任务开始执行了。接下来的OSIntCtxSw()函数实现的是中断级的任务切换,它和OSCtxSw()函数的唯一不同是它是在中断中调用的,因此不需要保存工作寄存器的内容,剩下的和任务级的切换过程完全一样。最后一个定义的是节拍时钟的中断服务子程序,在这个函数中的开始要令中断欠套全局变量加1,并且调用时钟管理函数OSTimeTick(),中断退出时调用系统提供的中断退出函数OSIntExit()。

4 网络平台设计

    LwIP是一套专门为嵌入式系统设计的源码开放的轻型协议栈,最新版本是LwIP1.1.0LwIP在保持TCP/IP协议基本要求的前提下,通过层与层之间共享内存,避免了许多繁琐的复制处理,这样做虽然破坏了严格的分层思想,但却大幅度地节省了代码和数据存储空间,因此非常适合嵌入式应用。与其他轻型协议栈不同的是,LwIP不仅支持一般的网络协议,比如UDP协议、DHCP协议、PPP协议等,而且还支持多网络接口、IPv6和标准API 

                       

                                      3LwIP运行机制

4.1 LwIPuC/OS-II上的移植

    针对uC/OS-IIAVRICC编译器,LwIP的移植只需要编写arch文件夹下的3个文件——cc.hsys_arch.hsys_arch.c。其中cc.h中有与CPU和编译器有关的定义,包括数据结构和大小端存储方式等。其中关键代码区的保护用uC/OS-II中的相应函数替换一下即可。剩下的两个与操作系统有关的文件是移植工作的重点。

    为了增强移植性,LwIP专门把和操作系统有关的数据结构和函数放在一起组成操作系统封装层,为诸如定时、进程同步和消息传递等操作系统服务提供统一的接口,移植时仅需针对不同的操作系统来实现特定的操作系统封装层,这些是由sys_arch.hsys_arch.c实现的。其中sys_arch.h主要定义与操作系统相关的数据结构——信号量、邮箱和进程号,这些在uC/OS-II中都有对应的实体,要注意的是LwIP中的邮箱对应于uC/OS-II中的消息队列。

    sys_arch.c中要实现和操作系统有关函数的定义,包括系统的初始化以及信号和邮箱的操作——创建、删除、投递和等待,这些功能只需要用uC/OS-II中相应的函数进行重新封装即可。另外,TCP/IP协议栈中需要许多定时器的功能,这在LwIP中是用sys_timeout结构体队列和相应的函数实现的  。每个sys_timeout