打印
[AVR单片机]

听人说这里高手入云?能出来帮下忙吗?

[复制链接]
1746|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZHAOBAO51|  楼主 | 2012-7-11 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一次发贴,TLC2543+ATMEGA16+PROTEUS,寻求帮助!!环境:ICCAVR.


#include
#include


#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80

#define CLKH PORTB |=BIT1 //CLK高
#define CLKL PORTB &=~BIT1 //CLK低
#define DATAH PORTB |=BIT2 //DATA高
#define DATAL PORTB &=~BIT2 //DATA低

#define CSH PORTB |=BIT4 //CS高
#define CSL PORTB &=~BIT4 //CS低


#define uchar unsigned char
#define uint unsigned int

#define X 5


uchar zhuanhuan[24]; //采到2543的值放这里转换一下










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

//延时函数
void delay(unsigned int s){
while(s)s--;
}

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

void port_init(void)
{
PORTA = 0x00;
DDRA = 0x3f;
PORTB = 0x00;
DDRB = 0xf6;
PORTC = 0x00; //m103 output only
DDRC = 0xff; //P3口设置为输出
PORTD = 0x00;
DDRD = 0xff;
}





























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


//本程序没有使用tlc2543的EOC(转换结束标志)信号,片选一直处于选中,也可以自己加入片选信号
unsigned int tlc2543(unsigned char senddata)//这里把senddate改成recdata传递
{
unsigned int recdata = 0;
unsigned int i = 0;

recdata = 0;//接收到的转换结果数据
PORTB &= 0B11101111;//片选使能(可选)以前的CS片选是PB1那么就是0B11111101,这里的B是二进制,第二位为低的时候选中
//现在改成了PB4,那么这里要改成0B11101111
NOP();
NOP();NOP();
NOP();
for(i=0;i<12;i++)//转换12个字节 ,因为需要的是12位,所以转换12字节
{
if(senddata & 0x80)//比如说吧,SENDDATA这个值现在是0x81,那么用0x81与上0X80肯定是1,那么就执行,PB5口高电平,否则就执行PB5口低电平。
//然后,1000 0001 也就是0X81,左移1位,变成,0000 0010
//就是0000 0010 和0X81再与,得的值应该是假,那么PB5口为低,这样重复八次,就得出八个PB5口的高低电
PORTB |= 0B00000100;//以前的PB5口是DIN,现改成PB2,那么0B00100000改为0B00000100
else PORTB &= 0B11111011;//准备发送控制字,同上面一样改0B11111011
senddata <<= 1;

if(PINB & 0x08)//PB0口为高电平的话,那么recdata |= 0x01;这里的PB0为DO,那么改成现在应为PB3改为0x08
recdata |= 0x0001;
else recdata &= 0xfffe;
recdata <<= 1;//接收上次转换结果


PORTB |= 0B00000010;//时钟上升沿,这里是时钟动作,以前的时钟是PB2,现在为PB1,0B00000100改为0B00000010
NOP();NOP();NOP();NOP();//以前晶体8M
PORTB &= 0B11111101;//时钟下降沿,同上0B11111011改为0B11111101
NOP();NOP();NOP();NOP();
}

// PORTB |= 0B00000010;//片选禁止(可选)
NOP();NOP();NOP();NOP();
recdata >>= 1;
recdata &= 0x0fff;//截取低12位
return(recdata);
}

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







void main(void){


port_init();

while(1){

zhuanhuan[1]=tlc2543(0b00000000);//采到一个十二位的值,第0通道,12位选择,高位在前,无极性.
PORTC = zhuanhuan[1]>>8;//高八位从C输出
PORTD = zhuanhuan[1]&0x00ff; //低四位从D输出
delay(65535);//延时
delay(65535);
delay(65535);
delay(65535);


}

}


搞了几天一直不成功,每次输出值都不一样.希望能得到帮助,谢谢! TLC2543输出到PC和PD口.rar (187.68 KB)

相关帖子

沙发
joyme| | 2012-7-11 14:39 | 只看该作者
PORTC = zhuanhuan[1]>>8;//高八位从C输出
PORTD = zhuanhuan[1]&0x00ff; //低四位从D输出

这个写法是高四位在PORTC,低八位在PORTD,12位的分辨率,低位有些飘动也正常,你应该把问题描述得更详细点

使用特权

评论回复
板凳
ZHAOBAO51|  楼主 | 2012-7-11 15:42 | 只看该作者
你好这位朋友,不是一般的飘,得到数据完全不正常.

使用特权

评论回复
地板
joyme| | 2012-7-11 16:59 | 只看该作者
unsigned int tlc2543(unsigned char senddata)

这个函数里的时钟pin操作不对吧,你把clock操作的位置调一下试试
clk = 0;
datain 赋值;  //单片机发给TLC2543
clk = 1;
getdata = dataout;  //单片机读取TLC2543

使用特权

评论回复
5
ZHAOBAO51|  楼主 | 2012-7-11 17:20 | 只看该作者
谢谢您的回复,我 试一下.

使用特权

评论回复
6
ZHAOBAO51|  楼主 | 2012-7-11 17:23 | 只看该作者
太麻烦了,本人刚用AVR,老大能否帮我改一下?我试了好多例子都不行的,!!!!!!!111

使用特权

评论回复
7
ZHAOBAO51|  楼主 | 2012-11-12 13:31 | 只看该作者
搞好了,谢谢

使用特权

评论回复
8
jimodunanhua| | 2012-11-17 13:05 | 只看该作者
学习啦,顶

使用特权

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

本版积分规则

18

主题

24

帖子

0

粉丝