BASIC4MCU | 질문게시판 | ws2812 코드 재업로드합니다. +잔상 사진
페이지 정보
작성자 ParkKH 작성일2021-06-07 19:38 조회8,517회 댓글5건첨부파일
본문
ESP-01에서 1부터 증가된 값을 data로 받아보는 테스트 중입니다.
값은 잘 받아오나 사진과 같은 잔상들이 데이터를 받아올때마다 발생합니다.
댓글 5
조회수 8,517master님의 댓글
master 작성일
fnd1_in() 이 함수는 어느 헤더파일에 들어있을까요?
누락된 코드 없이 모두 첨부하세요
ParkKH님의 댓글
ParkKH 작성일
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=15862
이 글의 압축파일에 헤더와 라이브러리 폴더내에 있습니다!
master님의 댓글
master 작성일
#include <io.h>
#include <delay.h>
#include <ds1302.h>
#include <ws2812.h>
#include <string.h>
#asm
.equ __ds1302_port=0x0B
.equ __ds1302_io=5
.equ __ds1302_sclk=6
.equ __ds1302_rst=7
.equ _fnd_port=0x08
.equ _fnd1_io=1
.equ _fnd2_io=0
.equ _fnd3_io=4
.equ _fnd4_io=3
.equ _dot_io=2
#endasm
char r[]={0xff,0xff,0xff,0x00,0x00,0x4b,0x2a,0x00}; //빨 주 노 초 파 남 보 (무지개색)
char g[]={0x00,0x8c,0xff,0x80,0x00,0x00,0x00,0x00};
char b[]={0x00,0x00,0x00,0x00,0xff,0x82,0x66,0x00};
char hour,min,sec;
char str[50],rx_ch,rx_cnt=0;
int up,down,count;
unsigned long data,data1,data2;
float a,c;
//
interrupt [USART_RXC] void usart_rx_isr(void){
rx_ch=UDR0;
data=((data&0xFFFFFF)<<8)|rx_ch;
if(++rx_cnt>=4){ data1=data/100; data2=data%100; rx_cnt=0; }
}
//
void main(void){
unsigned char red,green,blue,white=0;
bit state=0,d=0;
unsigned long data2=0;
char i;
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
DDRC=0x1f;
UCSR0A=2; UCSR0B=0x90; UBRR0L=16; //band 115200
rtc_init(0,0,0);
#asm("sei");
while (1){
down=100;
for(up=0;up<=100;up++){ //7개색 숨쉬듯이 변화
//rtc_get_time(&hour,&min,&sec);
if(up!=0)down--;
a=up/100.0; c=down/100.0;
if(state==0){red=(r[count]*c)+(r[count+1]*a); green=(g[count]*c)+(g[count+1]*a); blue=(b[count]*c)+(b[count+1]*a);}
if(state==1){red=(r[count+1]*c)+(r[count]*a); green=(g[count+1]*c)+(g[count]*a); blue=(b[count+1]*c)+(b[count]*a);}
if((sec%10==0)||(sec%10==2)||(sec%10==4)||(sec%10==6)||(sec%10==8))d=1; else d=0;
fnd1_in(0,0,0,0,0); //fnd에 색과 표시값 보내줌
fnd2_in(red,green,blue,white,data1);
fnd3_in(red,green,blue,white,data2/10);
fnd4_in(red,green,blue,white,data2%10);
dot_in(0,0,0,0,0);
delay_ms(10);
}
if(state==0)count++; //빨~보까지 색 변한 후
if(count==6)state=1;
if(count==0)state=0;
if(state==1)count--; //보~빨까지 색 변환
}
}
통신속도는 문제가 없다면 가능한 보레이트를 높이는 것이 좋습니다.(115200으로 변경)
32바이트를 전송하지 않고 4바이트를 전송하는 것으로 변경 했습니다.
master님의 댓글
master 작성일
ws2812로 만든 FND인가보죠?
위처럼 변경해서도 잔상이 발생한다면 데이터를 자주 전송하지말고 적당히 간격을 주면서 전송하세요
ParkKH님의 댓글
ParkKH 작성일
네 ws2812로 만든 FND 시계입니다.
선생님의 도움으로 잔상이 아주 없어지진 않았지만 발생하는 빈도가 크게 줄어들었습니다.
데이터를 저런식으로 받을수도 있다는것을 또 하나 배워갑니다. 정말 감사합니다^^