Mong nhận Được sự giúp đỡ của mọi người trong Forum để hoàn thiện nốt phần hiệu ứng.
--Hiệu Ứng Sóng :mô tả một điểm dao động theo hàm sin làm mặt phẳng xung quanh dao động theo gây nên cảm giác sóng.
--Thuật toán copy ở
http://www.dientuvietnam.net/ như sau :
Gọi chu kỳ sóng là T, bước sóng L, biên độ A.
Chọn một điểm trong mặt phẳng xy làm gốc, đặt tên là O
Quét tất cả mọi điểm trong mặt phẳng xy, gọi từng điểm là A
Tính khoảng cách AO theo định lý Pytago, gọi là R
Dùng công thức sóng u = A*Cos (2*PI*t/T - 2*PI*R/L)
Add từng điểm vào mảng sáng
Vs 8x8x8, L là 7, A là 3.5, tọa độ O là (3.5, 3.5), còn T là 1s. Việc lấy t ở đây dùng timer.
Code C :
HTML Code:
float L = 7; // Bước sóng
float T = 1; // Chu kỳ
float A = 3.5; // Biên độ
float xo = 3.5; // Tọa độ điểm gốc O
float yo = 3.5;
for (byte y = 0; y < 8; y++) // Quét Y
{
for (byte x = 0; x < 8; x++) // Quét X
{
float r = Sqrt(Pow(x - xo, 2) + Pow(y - yo, 2)); // Lấy bán kính, Sqrt là căn bậc 2, Pow(x, y) là x mũ y
float t = get_time(); // Lấy thời gian
byte z = (byte)(A * Cos(2*PI*t/T - 2*PI*r/L) + 3.5); // Lấy cao độ z, 3.5 là vị trí cân bằng
Add(x, y, z); // Lưu vị trí LED sáng
}
}
Phần cứng em dùng 8 con 74HC595 ĐK 64 cột và 1 con còn lại ĐK 8 lớp . muốn bật 1 cột và lớp bất kì xuất ra bit 1. Mấy Hiệu ứng Linh Tinh em viết đã chạy còn cái này thì ko. Dưới đây là code em chuyển sang cho Pic hàm Add(x,y,z) <--> Send_0xyz(x,y,z)
HTML Code:
#include <main.h>
#include <math.h>
#define rowClk PIN_D0 //Clock
#define rowDat PIN_D1 //Data
#define rowLat PIN_D2 //latch
#define colClk PIN_D3
#define colDat PIN_D4
#define colLat PIN_D5
int1 buffer_xy[64];//Mang 64 bit luu trang thai cua 64 cot
int1 buffer_z[8]; //Mang 8 Bit Luu Trang Thai Cua 8 lop
int8 x,y,z;
int8 Count,time;
#USE FAST_IO (d)
//****************************************************************************//
void interrupt_config()
{
disable_interrupts(INT_EXT); //Khong cho phep ngat ngoai hoat dong (mac dinh)
disable_interrupts(INT_RB); //Khong cho phep ngat RB hoat dong (mac dinh)
disable_interrupts(INT_CCP1); //Khong cho phep ngat CCP1 hoat dong (mac dinh)
disable_interrupts(INT_TBE); //Khong cho phep ngat TBE hoat dong (mac dinh)
disable_interrupts(INT_RDA); //Khong cho phep ngat RDA hoat dong (mac dinh)
disable_interrupts(INT_SSP); //Khong cho phep ngat SSP hoat dong (mac dinh)
disable_interrupts(INT_PSP); //Khong cho phep ngat PSP hoat dong (mac dinh)
disable_interrupts(INT_BUSCOL); //Khong cho phep ngat BUSCOL hoat dong (mac dinh)
disable_interrupts(INT_COMP); //Khong cho phep ngat COMPARATOR hoat dong (mac dinh)
enable_interrupts(GLOBAL); //Cho phep cac ngat co the hoat dong
}
void timer0_config()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT); // T_tm0=T_osc*4*256
enable_interrupts(INT_TIMER0); //Cho phep ngat tran timer0 hoat dong
}
//****************************************************************************//
// Ngat Timer 0 De lay Gia Tri Time
#INT_RTCC
void ngat_timer0(void)
{
set_timer0(2);
Count++;
if(Count==46)
{
// dinh thoi 0.5s
disable_interrupts(GLOBAL);
Count=0;
if(time==99) time=0;
else time++;
enable_interrupts(GLOBAL);
}
}
//****************************************************************************//
void Send_Oxy() //Day 64 Bit vao * IC74HC595
{
int i;
//send 64 bit vao 74HC595
for(i=0;i<64;i++)
{
output_bit(colDat,buffer_xy[i]);
delay_us(1);
output_high(colClk);
output_low(colClk);
}
// Chot xuat 64 bit ra led
output_high(colLat);
output_low(colLat);
}
void Send_Oz() //Day 8 Bit Vao IC74HC595
{
int8 i;
//
for(i=0;i<8;i++)
{
output_bit(rowDat,buffer_z[i]);
delay_us(1);
output_high(rowClk);
output_low(rowClk);
}
// Chot xuat Du Lieu ra led
output_high(rowLat);
output_low(rowLat);
}
//********************************************************************/
//Ham Bat 1 bong led co toa do (x,y,z) trong khoi
void Send_Oxyz(int8 x,int8 y,int8 z)
{
buffer_xy[x+y*8]=1;//cho bit co toa do (x,y) =1
buffer_z[z]=1; //cho bit co toa do Z =1
Send_Oxy(); //
Send_Oz(); //
}
void OFF_ALL()
{
int8 i;
for(i=0;i<8;i++)
{
buffer_z[i]=0;
}
for(i=0;i<64;i++)
{
buffer_xy[i]= 0;
}
Send_Oxy();
Send_Oz();
}
//****************************************************************************//
//Ham Song lay t Tu Timer 0
void effect_wave()
{
int8 L = 7; // Buoc song
int8 T = 1; // Chu ki
float A,xo,yo;
A = 3.5; // Bien do
xo = 3.5; // Toa do diem goc O
for ( y = 0; y < 8; y++) // Quét Y
{
for ( x = 0; x < 8; x++) // Quét X
{
float r = Sqrt(Pow(x - xo, 2) + Pow(y - yo, 2)); // Lay bán kính, Sqrt là can bac 2, Pow(x, y) là x mu y
byte z = (byte)(A * Cos(2*PI*time/T - 2*PI*r/L) + 3.5); // Lay cao do z, 3.5 là vi tri can bang
Send_Oxyz(x, y, z); // Luu vi tri LED sáng
delay_ms(1);
OFF_ALL();
}
}
}
void main()
{
interrupt_config();
timer0_config();
set_tris_d(0x00);
while(true)
{
effect_wave();
}
}
Mong Được mọi Người Giúp chỉ ra vì sao nó không chạy mặc dù code ko bị lỗi. File Code
https://docs.google.com/file/d/0B3P8...it?usp=sharing