|
回复【3楼】zhaofeng2008
最近我也在搞lanc。也是一头雾水,用逻辑分析仪录了时序。已经模拟出了时序可是就是不工作啊。。
void sync(void)
{ while(1)
{ucsr0b = 0x00;//关闭串口
ddrd_1=0; //txd为输入
delay_nus(40); //维持53us
while(pind_1==1);
break;
}
}
main()
{
sync();
ucsr0b = 0x98;//打开串口
for(d=0;d<5;d++) //发送数据
{
while (!(ucsr0a & (1<<udre0)));
udr0=com[d];
}
ucsr0b = 0x0......
-----------------------------------------------------------------------
LANC协议的第O,1字节有一个同步头是由摄像机送出的。控制协议字令需接在同步头后送给摄像机的。你采用串口输出方式没有速率是对的,可能是时序上没有吻合上,我采用外中断的方式来检测同步头,而后在中断处理中将端口变为输出方式输出指令。
#include <iom16v .h>
#include <macros.h>
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
#define key1_down ((PIND&=BIT(0))==0x00)
#define key2_down ((PIND&=BIT(1))==0x00)
#pragma interrupt_handler Int0:2
#define data_out DDRD|=BIT(2)
#define data_in DDRD&=~BIT(2)
#define lanc0 PORTD|=BIT(2)
#define lanc1 PORTD&=~BIT(2)
uint plus; // 定时器计数暂存
/*中断初始化*/
void INT0_init()
{
MCUCR|=0x01; /*任意电平变化触发中断*/
GICR=(1<<INT0); /*使能外部中断0请求*/
SREG=0x80; /*使能全局中断*/
}
/* 中断0处理子函数*/
void Int0()
{
if(PIND&=BIT(2)) //判断是否高电平触发中断 如果是定时器1开时计数
{TCCR1B=0X02;} // 4MHZ定时器8分计数 2MS-10MS 计数值1000-5000
else
{TCCR1B=0X00;plus=TCNT1; // 如是低电平 关闭计数器 并将计数值取出。计数器清零
TCNT1=0;}
}
//送给摄像机指令函数//
void commn(uchar j)
{ uchar i;
for(i=0;i<8;i++)
{
if((j>>i)&0x01) lanc1;
else lanc0;
delay_nus(23);
}
}
//送给摄像机数据函数//
void data(uchar j)
{ uchar i;
for(i=0;i<8;i++)
{
if((j>>i)&0x01) lanc1;
else lanc0;
delay_nus(23);
}
}
//识别摄像机送的同步信号并送出命令与数据函数//
void camera_com(uchar m,uchar d)
{
if(plus>=2000)
{delay_nus(23);
SREG=0x00;
data_out;
commn(m);
lanc0;
data_in;
while(PIND&=BIT(2));
delay_nus(25);
data_out;
data(d);
lanc0;
data_in;
SREG=0x80;
while(PIND&=BIT(2));
}
}
void main()
{
DDRA=0XFF; PORTA=0XFF;
DDRD=0X00; PORTD=0XFF;
INT0_init();
while(1)
{
if(key1_down)
{
camera_com(0x28,0x39);
}
else if (key2_down)
{
camera_com(0x28,0x3b);
}
}
} |
|