好学天上
发表于 2024-8-5 17:30:06
梁工 发表于 2024-8-5 16:12
时序明显不对,发数据位0时全部是高电平,这是不对的。
数据0:高电平0.9us,低电平大于等于0.35us。
数 ...
按照这个要几个nop函数呀,我看百度说12MHZ一个nop()是1微秒,可是我要延时零点几微秒叻
好学天上
发表于 2024-8-5 17:35:45
梁工 发表于 2024-8-5 16:12
时序明显不对,发数据位0时全部是高电平,这是不对的。
数据0:高电平0.9us,低电平大于等于0.35us。
数 ...
void send_L(void)
{
WS2812=0;
_nop_();
_nop_();
WS2812=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WS2812=0;
}
void send_H(void)
{
WS2812=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WS2812=1;
_nop_();
_nop_();
_nop_();
WS2812=0;
}
void rest(void)
{
WS2812=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WS2812=0;
}
void send_one_byte(unsigned char in_data)
{
unsigned char temp1=0;
unsigned char temp2=0;
unsigned char temp3=0;
unsigned char i=0;
temp1=in_data;
for(i=0;i<8;i++)//八位,循环八次
{
if(temp1&0x01)
send_H();
else
send_L();
temp1 >>= 1;//从最低位到最高位
}
}
void set_one_led(unsigned char R_data,unsigned char G_data,unsigned char B_data)
{
send_one_byte(R_data);
send_one_byte(G_data);
send_one_byte(B_data);
}
void WS2812_Write(void)
{
unsigned int i;
WS2812_Reset();
i=0;
while(1)
{
if(i==LED_ON)
{
set_one_led(RED,GREEN,BLUE);
break;
}
else
{
set_one_led(0,0,0);
i++;
}
}
}
这样写还是不行,还是全亮{:4_184:}
梁工
发表于 2024-8-5 17:51:57
好学天上 发表于 2024-8-5 17:35
这样写还是不行,还是全亮
你H和L反了,并且时间也不对。还不知道STC是单周期的?一个NOP是一个时钟。如此简单的时序:
对于12MHz,发数据1:
DIN = 1;
10个NOP;
DIN=0;
3个NOP;
对于12MHz,发数据0:
DIN = 1;
3个NOP;
DIN=0;
10个NOP
好学天上
发表于 2024-8-5 18:22:57
本帖最后由 好学天上 于 2024-8-5 18:25 编辑
梁工 发表于 2024-8-5 17:51
你H和L反了,并且时间也不对。还不知道STC是单周期的?一个NOP是一个时钟。如此简单的时序:
对于12MHz, ...
<ol class="code_ol_R87" style="list-style-position: initial; list-style-image: initial; font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);"><li style="padding-left: 5px; list-style-position: initial; list-style-image: initial; border-left: 1px solid rgb(205, 205, 205) !important;"><div class="blockcode"><blockquote>void send_L(void)
{
WS2812=1;
_nop_();
_nop_();
_nop_();
WS2812=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void send_H(void)
{
WS2812=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
WS2812=0;
_nop_();
_nop_();
_nop_();
}void send_one_byte(unsigned char in_data)
{
unsigned char temp1=0;
unsigned char temp2=0;
unsigned char temp3=0;
unsigned char i=0;
temp1=in_data;
for(i=0;i<8;i++)//八位,循环八次
{
if(temp1&0x01)
send_H();
else
send_L();
temp1 >>= 1;//从最低位到最高位
}
}
void set_one_led(unsigned char R_data,unsigned char G_data,unsigned char B_data)
{
send_one_byte(R_data);
send_one_byte(G_data);
send_one_byte(B_data);
}
void WS2812_Write(void)
{
unsigned int i;
WS2812_Reset();
i=0;
while(1)
{
if(i==LED_ON)
{
set_one_led(RED,GREEN,BLUE);
break;
}
else
{
set_one_led(0,0,0);
i++;
}
}
}
void Init(void)
{
P5M0 = 0x10;
P5M1 = 0x00;
}
void main(void)
{
Init();
WS2812_Reset();
while(1)
{
// RED=255; //红 0~255
// GREEN=0; //绿 0~255
// BLUE=0; //蓝 0~255
set_one_led(0,255,255);
set_one_led(0,0,0);
WS2812_Reset();
}
}void WS2812_Reset(void)
{
WS2812=0;
Delay_x10us(10);
}这样还是不行
好学天上
发表于 2024-8-5 19:12:53
梁工 发表于 2024-8-5 17:51
你H和L反了,并且时间也不对。还不知道STC是单周期的?一个NOP是一个时钟。如此简单的时序:
对于12MHz, ...
真的想不通{:4_184:}在下愚钝
梁工
发表于 2024-8-5 22:42:03
好学天上 发表于 2024-8-5 19:12
真的想不通在下愚钝
仔细看下W2812的手册,MSB先发的哦。
示波器看下波形正常没有。
好学天上
发表于 2024-8-6 14:22:18
梁工 发表于 2024-8-5 22:42
仔细看下W2812的手册,MSB先发的哦。
示波器看下波形正常没有。
梁工,我这个Din接的P54然后不管怎么调波形就很奇怪,然后用测了P33脚的波形就是正常的。是P54要特别设置一下吗
梁工
发表于 2024-8-6 15:44:59
好学天上 发表于 2024-8-6 14:22
梁工,我这个Din接的P54然后不管怎么调波形就很奇怪,然后用测了P33脚的波形就是正常的。是P54要特别设置 ...
用哪个脚都要设置为推挽输出。输出波形都是你的程序生成的,不会怪怪的。
ka1265
发表于 2024-8-9 21:34:58
{:4_174:}
nibinxiaoyang
发表于 2024-8-13 12:30:55
请问,大家有遇到直接下载程序烧录,灯全部亮,然后跑马是啥问题?也在跑马,但是其余的灯全部是亮白色