关键词:AM-209M 16画面分割器 AT89C55
目前,在电视台、银行、商场、仓库等场所常常需要对多路视频信号进行实时监测、处理。而视频画面分割器正好可将多路视频信号合成显示在一个画面上,是视频监测系统的核心部分。
本文介绍的基于AM-209M芯片的视频多画面分割器具有以下特点:
·可同时监测16路视频信号;
·具有多画面和画中画、画外画显示功能;
·具有画面盲检测功能;
·具有时间、位图及字幕显示功能;
·可以通过按键现场控制,也可以通过远程RS-485接口来进行控制;
·可以随时更新和保存系统配置,可改变系统功能和技术参数;
·系统稳定可靠,实时处理,对掉电、死机等异常现象具有复位功能。
整个系统包括硬件和软件两部分,其中硬件包括编码、数字视频处理、解码和单片机控制等。
1 系统组成
16画面分割器由16路视频解码、多画面处理、视频编码以及AT89C55系统控制、人机接口等部分组成。图1所示是一个16画面分割器的组成框图。图中,视频输入1~16是系统的复合视频输入信号(CVBS)或分离视频S-VIDEO信号,这些信号通过视频解码器SAA7113(A/D)可转换成标准的CCIR656 YUV 4:2:2格式数据。视频多画面处理器AM-209M主要用来对视频解码器SAA7113的输出信号进行混合处理,并将处理后的信号送入视频编码器SAA7121(D/A),以将其还原成视频模拟信号CVBS送显示器输出。
2 视频信号处理
2.1 视频编码
SAA7113数字视频解码器用来把复合视频输入信号CVBS或分离视频信号S-VIDEO解码成标准ITU 656 YUV 4:2:2格式的8位数据,SAA7113支持NTSC、PAL制式,可自动监测50Hz、60Hz场频信号,并可在PAL制式和NTSC制式下自动转换。芯片内部有亮度、色调、色饱和度控制电路,并提供有I2C总线接口,本系统通过I2C总线配置SAA7113。
系统由16片SAA7113组成16路视频输入通道。并将AT89C55单片机的P1[0:7]分别连接到16片SAA7113的SDA引脚,每个IO线连接两个SAA7113(SAA7113芯片有两个I2C总器件地址,当26脚悬空时,地址为0x48;当26脚通过一个3.3kΩ电阻上拉到3.3V时,器件地址为0x4A)。解码数据输出端VPO[7:0]接在视频画面分割芯片AM-209M的Camera_n_vdin [7:0]数据线上,n∈(1,2...,8),同时将通道1~8解调数据输出接在主片(master)上,通道9~16解码数据输出接在从片(slave)上。
2.2 多画面处理芯片AM-209M
AM-209M是一种带有记录、运动检测和回放等功能的多画面实时处理芯片,其主要特点如下:
·支持CCIR 656YUV 4:2:2编解码数据格式;
·支持多画面、画中画、画外画处理模式;
·字符、位图可编程显示;
·支持NTSC、PAL、SECAM视频信号;
·单芯片可进行9通道画面实时显示(30桢/秒),两芯片可连接16通道画面并实现实时显示(30桢/秒);
·两个独立数据输出通道:监视和记录道;
·有画面物体移动检测功能;
·外部字体可通过嵌入式字体RAM(64字符)进行编程;
·监视输入盲检测功能;
·通道信息的存取和控制通过8位并行数据接口来实现。
AT89C55单片机通过并口向AM-209M发送控制命令,以改变当前的输出状态。AM-209M芯片有2个16Mbit SDRAM芯片接口,一个用做显示数据缓存,一个用做记录缓存。同时芯片内部还有SDRAM读写操作控制逻辑,因而无需外部控制。有两个编码芯片接口,每个芯片接口都包含8个数据线和1位clock信号线,输出则是多个视频输入混合处理后的CCIR 656格式数据。其内部结构框图如图2所示。
b.基于两片AM-209M的主从式结构
当用AM-209M实现16画面分割器时,可用两芯片组成16个输入通道以构成主从式结构,主片的slave管脚接地,从片的slave管脚接VCC,主片的记录通道信号线rec_vdout[7:0]连接到从片监视信号线mon_vdout[7:0],主片1的监视输出通道mon_vdout[7:0]作为视频画面分割器的监视输出,从片的记录输出通道rec_vdout[7:0]作为分割器的记录输出。主从芯片的运动检测信号motion_intr可以共同连接到AT89C55单片机的P3.2脚以作为外部中断INT0输入。场同步中断信号mpout则可共同连接到P3.3以作为外部中断INT1输入。其它信号线的连接方法见图3所示。两片AM-208M最多可组成16个画面。速度为30帧/秒,基本能满足实时播放要求。
2.3 视频编码
SAA7121是视频编码芯片,主要功能是把标准YCbCr(CCIR 656)或者MPEG格式数据编码成复合视频输入信号(CVBS)或分离视频信号S-VIDEO。SAA7121支持NTSC-M、PAL B/G和子标准,并具有Y、C和CVBS三个信号的数模转换器。基本编码函数由副载波生成、彩色调制和同步信号内插组成。SAA7121提供有I2C总线接口,可按主动方式或从动方式工作。本系统通道I2C接口来对SAA7121进行配置。
3 单片机控制电路
基于单片机的控制电路如图4所示。该电路主要完成以下功能:与PC机串行通信 以完成命令和数据传输;通过8位并行接口读写AM-209M;通过I2C总线读写SAA7113和SAA7121;保存、更新系统配置数据;通过键控功能及键盘命令切换系统的当前状态。
本系统所选用的AT89C55是Atmel公司的8位CMOS单片机,该芯片与MCS-51系列单片机兼容,并带20K字节的片内Flash程序存储器和256字节的内部数据存储器及三个16位定时器。
系统接口电路主要由MAX488(RS-485收发器)构成。因此RS-485标准不仅与RS-232兼容,而且适合远距离数据传输。
系统键盘有8个按键,通过串行移位74LS164芯片与AT89C55单片机相连。P2.4是按键LED指示信号,P2.5是74LS164串行移位时钟信号,P2.6是键盘输出信号,P2.7是键盘输入判断信号。系统初始化时,P2.4为1,LED处于熄灭状态,P2.5、P2.6都为0,QA-QH为0状态,此时P2.7的输入状态为1。系统键控原理图如图5所示。
图5
4 软件设计
根据单片机控制功能的要求,该系统软件由主程序和串口中断子程序两部分组成,主程序流程图如图6所示。该软件的编程重点是:视频编解码及画面分割处理初始化;键控及菜单显示程序;PC命令的判断和执行;更新系统配置及对数据的保存等。
4.1 访问AM-209M
单片机AT89C55和AM-209M芯片的信号连接关系是:单片机的P0.0~P0.7和AM-209M的8位并行数据接口mdata[0:7]相连;P2.0和AM-209M片选信号相连;P2.1则连到写使能信号线wren;P2.2连至地址使能信号线adem;P2.3和读使能信号线rden相连;INT1和场同步中断信号mpout相连。图4给出了这些信号线的连接方法,下面给出的是对AM-209M的字节写程序(并口控制的C程序):
#define AM209_NOP(); _nop_();_nop_();
#define MDATA_BUS P0 //AM-209M数据总线
sbit MCSB_AM209=P2^0; //AM-209M片选
sbit WREN_AM209=P2^1; //写使能
sbit ADEN_AM209=P2^2; //地址锁存使能
sbit RDEN_AM209=P2^3; //读使能
void Byte_wr_am209(unsigned char am209_addr,unsigned char am209_data)
{
EA=0;
MDATA_BUS=0xff;
ADEN_AM209=0;
WREN_AM209=1;
AM209_NOP();
MCSB_AM209=0; //AM209M芯片使能
MDATA_BUS=am209 addr; //发送地址
AM209_NOP();
ADEN_AM209=1;
AM209_NOP();
ADEN_AM209=0;
AM209_NOP();
MDTA_BUS=am209 data; //写入数据
AM209_NOP();
WREN_AM209=0;
AM209_NOP();
WREN_AM209=1;
AM209_NOP();
MCSB_AM209=1;
AM209_NOP();
EA=1;
}
4.2 与PC的串行通信
PC机与单片机通信的数据格式有视频画面命令格式和时间调整命令格式两种。视频画面命令格式为:桢头+命令字+命令地址+校验和;时间调整命令数据格式为:桢头+命令字+秒+分+时+日+星期+月+年+校验和。所有数据均为十六进制,其中时间显示为24小时制,采用两字节BCD码。SUM为SUM字节之前所有字节的累加和,为单字节,不计溢出。
在单片机串口中断子程序中,可根据接收到的命令长度来判断是否接收到一个完整的命令格式。接收到一个完整命令格式则设置串口接收标志为1。并根据这个标志位进入主程序中的PC命令处理程序,同时由接收到的命令号来识别PC发送的各种命令。如:视频画面命令格式中命令字如果是0X16,则在监视器上显示输出16画面。此外,依据接收到的校验和可以判断接收PC数据的正确性,防止对分割器的误操作。该系统的波特率为9600bps,单片机的定时器2设定在自动重装方式2。
4.3 键控程序
有键按下时,P2.7变为0。P2.6发送串行数据0XFE到74LS164,若此时P2.7输入仍为0,则表示SW1键已按下(见图5);否则0XFE左移1位(即0xFD),若P2.7输入仍为0,则表示SW2键已按下;依此类推…,否则0XFE左移7位(即0X7F),若此时P2.7输入为0,则表示SW8键按下。左读取键值并释放按键后,系统会点亮LED以指示键按下。例如,当SW1按下再释放后,P2.6发送数据0XFE,此时P2.4置为0,将点亮D501以指示SW1按下。键盘扫描子程序如下:
//键盘扫描子程序,键值保存在key_value中
sbit led_on=P2^4; //LED点亮使能,低有效
sbit key_clk=P2^5; //串行移位时钟
sbit shift_data=P2^6; //移位数据输入
sbit scan_data=P2^7; //键扫描数据输入
void Key_read_service()
{
uchar temp,temp1,temp2;
uchar i,j;
Key_flag=0; //键标志清零
scandata=1;
led_on=1; //关闭LED
for(i=0;i<8;i++) //74LS164并行输出置为0
{
shift_data=0;
_nop_();
key_clk=0;
_nop_();
key_clk=1;
}
if(scandata= =0)
{ //有键按下
temp=0xfe;
for(j=0;j<8;j++) //发送8个数据字节
{
temp1=temp;
temp2=~temp;
for=(i=0;i<8;i++)//串行移位1个字节
{
if(temp1 & 0x80==0x80)
shift_data=1;
else
shift_data=0;
_nop_();
key_clk=0;
_nop_();
key_clk=1;
}
delay_10ms();//延时10ms去抖
if(scandata==0)//再次判断是否按键?
{ //键有效
key_value=temp2;//存储值
key_flag=1;//置键有效标志位
break;
}
temp2=temp2<<1;//不是当前键按下
temp=~temp2; 按下,左移一位判断下一个键
}
}
}