สอบถามการเขียนคุม LED 1/4 scan มีหลักการแบบไหนครับ

Started by anon1206, March 11, 2013, 02:35:18 PM

Previous topic - Next topic

Wiz


ขึ้นอยู่กับว่า จะต่อวงจรทั้ง 4 โมดูลเข้าด้วยกันในลักษณะไหนครับ

cascade ขา data หรือจะร่วม data แยก latch หรือร่วม clk, latch แยก data หรือจะแยกกันทุกขาก็ได้หมดครับ

ลองพิจารณาดูครับเพราะวัตถุประสงค์ของการจัดวงจรแต่ละแบบจะต่างกัน, ประหยัด i/o, สแกนเร็ว, map memory ง่าย, แยกกันซ่อมง่าย, ฯลฯ

anon1206

Quote from: Wiz on March 26, 2013, 07:38:13 PM

ขึ้นอยู่กับว่า จะต่อวงจรทั้ง 4 โมดูลเข้าด้วยกันในลักษณะไหนครับ

cascade ขา data หรือจะร่วม data แยก latch หรือร่วม clk, latch แยก data หรือจะแยกกันทุกขาก็ได้หมดครับ

ลองพิจารณาดูครับเพราะวัตถุประสงค์ของการจัดวงจรแต่ละแบบจะต่างกัน, ประหยัด i/o, สแกนเร็ว, map memory ง่าย, แยกกันซ่อมง่าย, ฯลฯ

คือผมเห็นบอร์ดที่ใช้ควบคุมของจีนถ้าต่อบอร์ด 16*32 ต่อกันไปเรื่อย ๆ ตามแนวยาวเช่น 16*64,16*128 จะใช้ร่วมกันทุกขาครับ
แต่ถ้าต่อลงมาในแนวตั้ง เช่น 32*32,32*64,32*128  จะใช้ clk,latch ร่วมกันและแยก dat เป็น 2 ขา คุมขาละ 16 แถวนะครับ

***ตอนนี้ผมจึงต่อแบบ ร่วม clk, latch แยก data นะครับ หรือพี่คิดว่าแบบไหนดีกว่าครับ***

แล้วถ้าต่อแบบที่บอก ที่ผมเข้าใจไม่ทราบว่าถูกไหมครับ

ที่ผมรู้ตอนนี้ไม่แน่ใจว่าถูกหรือป่าว
- ขา dat จะแยกกันเป็นเป็น 2 ขาคือคุมด้านบน 16*64 และด้านล่าง 16*64 รวมเป็น 32*64
- ต้องเปลี่ยนขนาดของ buffer[16][4] เป็น buffer[16][8] ใช่ไหมครับ หรือเป็น  buffer[32][8] ครับ
   และ function scandisplay ต้องแก้จาก(ลูป 4 ครั้ง ครั้งละ 8 คอลัม)เป็น (ลูป 8 ครั้ง ครั้งละ 8 คอลัม) ถูกไหมครับ
- สร้าง function byte_out(); สำหรับขา dat อีกขาใช่ไหมครับ

แล้วจะเขียนคุมขา dat 2 ขา ยังไงเพื่อจัดการกับ pixel ให้เหมือนเป็น Display ขนาด 32*64 ตัวเดียวเลยครับ

หรือพี่มีข้อแนะนำอย่างไรที่จะเขียนง่ายกว่า ขอบคณครับ

anon1206

Quote from: Wiz on March 26, 2013, 07:38:13 PM

ขึ้นอยู่กับว่า จะต่อวงจรทั้ง 4 โมดูลเข้าด้วยกันในลักษณะไหนครับ

cascade ขา data หรือจะร่วม data แยก latch หรือร่วม clk, latch แยก data หรือจะแยกกันทุกขาก็ได้หมดครับ

ลองพิจารณาดูครับเพราะวัตถุประสงค์ของการจัดวงจรแต่ละแบบจะต่างกัน, ประหยัด i/o, สแกนเร็ว, map memory ง่าย, แยกกันซ่อมง่าย, ฯลฯ

พี่ครับ ตอนนี้ผมได้ทำการต่อ led ขนาด 32*64 โดยต่อขา Latch,Clock ร่วมกันและ ขา dat แยกกัน คุมด้านบน 16*64  ด้านล้าง 16*64

ที่ผมเขียนตอนนี้คือ
- เพิ่ม led_buffer[16][8];   // อีก 1 ชุด // 16 แถว 8 คอลัม   
- เพิ่ม ฟังก์ชั่น byte_out(); // อีก 1 ชุด
- เพิ่ม ฟังก์ชั่น scandisplay(); // อีก 1 ชุด
- เพิ่ม ฟังก์ชัน Putpixel();  // อีก 1 ชุด

แต่ปัญหาคือ เหมือนจะ loop ช้ามาก ทำให้ภาพกระพิบ พอจะเขียนแบบไหนให้เร็วกว่านี้หรือเขียนในฟังก์ชั่น scandisplay(); ฟังก์ชันเดียวได้ไหมครับ
ขอคอนเซป หรือตัวอย่างหน่อยครับ ขอบคุณครับ


โค้ดทั้งหมด
#include <18f8627.h>
#include <string.h>
#fuses hs,nowdt,nolvp,noprotect,noput
#use delay(clock=  10 MHz)

#define A pin_d1 // ?? A
#define B pin_d2 //?? B

#define CK2       pin_d4 // ?? Clock
#define LT2       pin_d5 // ?? Latch
#define D2        pin_d6 // ?? dat ?????? 1

#define DAT_2     pin_b5 // ?? dat ?????? 2

#define OE        pin_d7 // ?? OE


unsigned char letter_A[6] =
{0x18,  // 0001 1000
0x24,  // 0010 0100
0x42,  // 0100 0010
0x7E,  // 0111 1110
0x42,  // 0100 0010
0x42
}; // 0100 0010

unsigned char letter_full[6] =
{0x18,  // 0001 1000
0x24,  // 0010 0100
0x42,  // 0100 0010
0x7E,  // 0111 1110
0x42,  // 0100 0010
0x42
}; // 0100 0010

unsigned char led_buffer[16][8]; // [row][column]
unsigned char led_buffer2[16][8]; // [row][column]

void PutPixel(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer[y][x / 8];
   if (px == 0)
      tmp &= ~(0x80 >> (x % 8));   //
   else
      tmp |= (0x80 >> (x % 8));   //

   led_buffer[y][x / 8] = tmp;
}

void PutChar(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<6; j++)
   {
      bt = letter[j];
      for (i=0; i<8; i++)
      {
         PutPixel(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}
//===================== PutPixel2 &  PutChar2 ========================
void PutPixel2(unsigned char x, unsigned char y, unsigned char px)
{
   unsigned char tmp;
   
   tmp = led_buffer2[y][x / 8];
   if (px == 0)
      tmp &= ~(0x80 >> (x % 8));   //
   else
      tmp |= (0x80 >> (x % 8));   //

   led_buffer2[y][x / 8] = tmp;
}

void PutChar2(unsigned char x, unsigned char y, unsigned char *letter)
{
   unsigned char i, j, bt;

   for (j=0; j<6; j++)
   {
      bt = letter[j];
      for (i=0; i<8; i++)
      {
         PutPixel2(x + i, y + j, bt & 0x80);
         bt <<= 1;
      }
   }
}


void ClearDisplay(void)
{
   memset(led_buffer, 0x00, sizeof(led_buffer));
}

void ClearDisplay2(void)
{
   memset(led_buffer2, 0x00, sizeof(led_buffer2));
}


//==================== byte_out  =======================
void byte_out(char buffer)
{
  char loop;
  for(loop=0;loop<8;loop++){
      if((buffer&0x80)==0x80)
      {//b10000000
         output_low(D2);
      }
      else {
         output_high(D2);
      }
      buffer <<=1;
      output_high(CK2);
      output_low(CK2);
     
  }
}
//================= byte_out2 ======================
void byte_out2(char buffer2)
{
  char loop2;
  for(loop2=0;loop2<8;loop2++){
      if((buffer2&0x80)==0x80)
      {//b10000000
         output_low(DAT_2);
      }
      else {
         output_high(DAT_2);
      }
      buffer2 <<=1;
      output_high(CK2);
      output_low(CK2);
  }
}

void select_138(int seen)
{
   if(seen==0 )
   {
     output_high(A);
     output_high(B);
   }
    if(seen==1 )
   {
     output_low(A);
     output_low(B);
   }
    if(seen==2 )
   {
     output_high(A);
     output_low(B);   
   }
    if(seen==3 )
   {
     output_low(A);
     output_high(B);   
   }
}
//======================= scandisplay ============================
void scandisplay(void)
{   
int k,j,i,l;
   for (k=0; k<4; k++)
      {
         output_high(OE);
         select_138(k); 
         
         for (j=0; j<8; j++)  // ??? 8 ????? ??????? 8 ?????
        {     
            for (i=0; i<4; i++) 
            {
             l = led_buffer[(3 - i) * 4 + k][7 - j]; 
              byte_out(l);
            }
         }
       output_high(LT2);
       output_low(LT2);
       output_low(OE);           
      }     
}
//======================== scandisplay2 =================================
void scandisplay2(void)
{   
int k,j,i,l;
   for (k=0; k<4; k++)
      {
         output_high(OE);
         select_138(k); 
         
         for (j=0; j<8; j++)   // ??? 8 ????? ??????? 8 ?????
        {     
            for (i=0; i<4; i++) 
            {
             l = led_buffer2[(3 - i) * 4 + k][7 - j]; 
              byte_out2(l);
            }
         }         
       output_high(LT2);
       output_low(LT2);
       output_low(OE);           
      }     
}

void main(void)
{
   set_tris_b(0x00);

   ClearDisplay();
   ClearDisplay2();
    PutChar(0, 0, letter_A);
    PutChar2(0, 0, letter_full);

   while(true)
   { 
      scandisplay();
      scandisplay2();
   }
}


Wiz

Quoteแต่ปัญหาคือ เหมือนจะ loop ช้ามาก ทำให้ภาพกระพิบ พอจะเขียนแบบไหนให้เร็วกว่านี้หรือเขียนในฟังก์ชั่น scandisplay(); ฟังก์ชันเดียวได้ไหมครับ
ขอคอนเซป หรือตัวอย่างหน่อยครับ ขอบคุณครับ

เบื้องต้นแก้ง่าย ๆ ด้วยการตัด delay ทิ้งตรงฟังก์ชั่น Clock_COL() และ Latch_COL() น่าจะทำให้เร็วขึ้นได้มากแล้วครับ

ถ้ายังไม่พอก็ลองรวมฟังก์ชั่น byte_out(); กับ byte_out2(); ดูครับ ลองสังเกตจุดร่วมและจุดต่างของทั้งสองฟังก์ชั่นดู

anon1206

Quote from: Wiz on March 29, 2013, 11:38:43 PM
Quoteแต่ปัญหาคือ เหมือนจะ loop ช้ามาก ทำให้ภาพกระพิบ พอจะเขียนแบบไหนให้เร็วกว่านี้หรือเขียนในฟังก์ชั่น scandisplay(); ฟังก์ชันเดียวได้ไหมครับ
ขอคอนเซป หรือตัวอย่างหน่อยครับ ขอบคุณครับ

เบื้องต้นแก้ง่าย ๆ ด้วยการตัด delay ทิ้งตรงฟังก์ชั่น Clock_COL() และ Latch_COL() น่าจะทำให้เร็วขึ้นได้มากแล้วครับ

ถ้ายังไม่พอก็ลองรวมฟังก์ชั่น byte_out(); กับ byte_out2(); ดูครับ ลองสังเกตจุดร่วมและจุดต่างของทั้งสองฟังก์ชั่นดู

โอเครครับ ตอนนี้หายกระพริบแล้วครับ โดยการตัด delay ทั้ง 2 ฟังก์ชันออก

*** แล้วผมจะทำให้มันเลื่อนจากขวาไปซ้ายยังไงหรอครับ ***

Wiz

Quote from: anon1206 on March 30, 2013, 01:52:07 AM

โอเครครับ ตอนนี้หายกระพริบแล้วครับ โดยการตัด delay ทั้ง 2 ฟังก์ชันออก

*** แล้วผมจะทำให้มันเลื่อนจากขวาไปซ้ายยังไงหรอครับ ***

หาข้อมูลเพิ่มเติมเรื่อง pointer ครับ