Atmega328P Datasheet 18. I/O Ports 1

Started by tha, August 25, 2019, 09:42:42 AM

Previous topic - Next topic

tha

เรื่องภาษาซีที่แสดงเป็น %d หรือ\f หรืออื่นๆ ก็ดูเอาที่นี่ก็ได้ ก็ขอขอบคุณคุณครูพนัสที่เขียนเว๊บให้ได้ศึกษามา ณ ที่นี้ด้วยครับ
https://sites.google.com/site/cprogramingbypanus/kar-saedng-phllaphth/printf1

tha

เดี๋ยวจะลองจอ GLCD5110 ดูนะ อ่านคู่มือว่าเราสามารถตั้งเป็น 5V ก็ได้ ก็ต้องศึกษาเพิ่มเติมอีกสักหน่อย
เดี๋ยวจะลอง keypad ด้วย มี ET-MINI KEY 4x4 อยู่ ลองเส็ร์จกูเกิ้ลหาคู่มือมาดูนะ จะลองศึกษาหาวิธีก่อน เอาอันไหนก่อนดีหล่ะ

tha

คราวนี้มาลองบอร์ด ET-BASE AVR EASY32U4 เข้ากับจอ GLCD5110 ดูบ้าง จอ GLCD5110 ใช้กับไฟ 3.3V ใช่ไหม เราก็ต้องให้บอร์ดของเราใช้ไฟ 3.3V ด้วย แต่ว่าเมื่อดูที่กราฟคุณสมบัติ หน้านี้ http://www.electoday.com/index.php/topic,15827.96.html จะเห็นได้ว่า crytal 16MHz มันเร็วเกินไปถ้าบอร์ดใช้ไฟ 3.3V ผมจะไม่เปลี่ยน crytal แต่จะใช้วิธีหาร clock prescaler เอา ดู 13.11. System Clock Prescaler แถวนี้ http://www.electoday.com/index.php/topic,15827.80.html เมื่อหารแล้วก็จะได้ clock = 8MHz ซึ่งไม่เร็วเกินไปถ้าบอร์ดใช้ไฟ 3.3V
Quote
    CLKPR = 0x80;          // set CLKPCE to 1 while set CLKPS to 0
    CLKPR = 0x01;          // set CLKPCE to 0 while set CLKPS to 1
                          // to prescaler with 2 to divide clock 16Mhz to 8Mhz
    for( w=0; w<5; w++ )
     {
         asm volatile ("nop" :: );   // No operation for 5 cycle
       }
แต่ก่อนที่จะให้บอร์ดไปใช้ไฟ 3.3V ขณะที่บอร์ดยังใช้ไฟ 5V อยู่ เราต้องแก้ fuse bits brow out detection จาก 4.3V ให้เป็น 2.6V ก่อน ไม่งั้น เมื่อบอร์ดไปใช้ไฟ 3.3V แล้ว บอร์ดจะไม่ทำงาน เพราะไฟมันต่ำกว่า brow out detection 4.3V



คราวนี้ก็ใช้ไฟ 3.3V ได้ โดยเอาจัมเปอร์เลือกไฟระหว่างไฟจาก usb หรือไฟจากไอซี u3 ออก แล้วเอาไฟจาก power supply 3.3V ภายนอกเสียบเข้าที่พินกลางแทน ส่วนพิน GND ก็เสียบเข้ากราวน์ถึงกัน ก็เป็นอันใช้ได้ บอร์ดสามารถใช้ไฟ 3.3V



ส่วนตัวโปรแกรม GLCD5110.h ผมเอาตัวอย่างของ Inex ของบอร์ด stm32 มาโม ต้องขอขอบคุณมา ณ ที่นี้ด้วยครับ แต่ตัวอักษร font มันไปจองที่ ram กิน ram ไปประมาณ 500 ไบต์เลย ก็สามารถทำงานได้ มีโปรแกรมตัวอย่าง

http://www.mediafire.com/file/afrqy7qw3xqeb6r/GLCD5110_32u4_1.rar/file

แต่ถ้าเอา font ไปจองใน flash rom แล้วจะไม่ทำงาน เดี๋ยวผมจะเช็คโปรแกรมดูก่อนว่าเป็นเพราะอะไร


tha

ลองดูนี่เป็นตัวอย่างครับ https://github.com/LittleBuster/avr-nokia5110 ว่าจะจอง font ไว้ที่ flash rom ยังไงถึงจะทำงานได้ เอามาให้ดูก่อนไว้พรุ่งนี้เช็คต่อ วันนี้รู้สึกจะตึงๆแล้วต้องพักสักหน่อยครับทุกท่าน

tha

อธิบายโค้ดสักหน่อย GLCD5110_32u4.h โปรแกรมนี้จะไม่ใช้ spi จะใช้ขาพิน(จะแก้ให้ไปใช้ขาไหนก็ได้)มาทำให้ได้สัญญานตามรูป



หลักๆก็อยู่ที่นี่ ส่วนจุดอื่นก็ใช้โปรแกรมของเขา ก็จนปัญญาที่จะไล่เหมือนกัน เราเอามาใช้ไม่จำเป็นต้องลงลึกอย่างนั้นก็ได้เดี๋ยวจะไม่เหลือสมองไปดูจุดอื่น  :-X

void lcdSend ( unsigned char data, LcdCmdData cd )        // โปรแกรมย่อยส่งข้อมูลครั้งละไบต์
{
   int j,data_in;
    GLCD_SCE_Port &= ~(1<<GLCD_SCE_PIN);           // ดึงขา SCE ให้เป็น 0 ก่อน
    if ( cd == LCD_DATA )                                                // เช็คว่าข้อมูลเป็นคำสั่งหรือดาต้า
    {
         GLCD_DC_Port |= (1<<GLCD_DC_PIN);  // ถ้าเป็นดาต้าก็ให้ขา DC เป็น 1      
    }
    else
    {
         GLCD_DC_Port &= ~(1<<GLCD_DC_PIN);   // ถ้าเป็นคำสั่งก็ให้ขา DC เป็น 0
    }
      data_in = data;
    for ( j = 0; j <8; j++ )                    // วนไป 8 รอบ เพื่อส่งข้อมูลไป 8 บิท
    {
           GLCD_SCK_Port &= ~(1<<GLCD_SCK_PIN);  // ให้สัญญานนาฬิกา SCK เป็น 0 ก่อน
         if ((data_in & 0x80)!=0)                                                // ส่งบิทบน MSB ไปก่อน เช็คว่าบิท 7 เป็น 1 หรือเป็น 0
         {
                 GLCD_SDIN_Port |= (1<<GLCD_SDIN_PIN); //ถ้าเป็น 1 ก็ให้ขา SDIN เป็น 1
         }
         else
         {
                 GLCD_SDIN_Port &= ~(1<<GLCD_SDIN_PIN); //ถ้าเป็น 0 ก็ให้ขา SDIN เป็น 0
         }
      data_in=data_in<<1;   // shift left ข้อมูลไปหนึ่ง ให้บิท 6 ไปเป็นบิท 7 ไล่ไปทีละบิท เพื่อเช็คและส่งต่อไป
      GLCD_SCK_Port |= (1<<GLCD_SCK_PIN); // คราวนี้ให้ขาสัญญานนาฬิกา SCK เป็น 1 ให้ข้อมูลที่ขา SDIN เป็นผล
   }                                                                         // วนกลับไปส่งข้อมูลจนครบ 8 บิท
   GLCD_SCE_Port |= (1<<GLCD_SCE_PIN);        // เมื่อครบ 8 บิทแล้ว ก็ให้ขา SCE เป็น 1 ครบส่งข้อมูล 1 ไบต์
}
/*-------------------------------------

หลักๆมีอยู่เท่านี้ เป็นยังไงงงไหม ไม่ต้องใช้ spi เราจะแก้ไปใช้ขาไหนก็ได้แล้วแต่สะดวก เพียงแก้ที่ define ขาเท่านั้นครับ

tha

ลองจ่ายไฟแล้ววัดกระแสของ LED ของจอ GLCD5110 มีติดอยู่ 3 ดวงขาดไปดวง วัดกระแสได้ 6mA ถ้าติดทั้ง 4 ดวงก็คงจะ 8mA เท่านั้น พอไปดู Electrical Characteristics ของ 32u4 พบว่า DC Current per I/O Pin . . . . . . . . . . . . . . . . . . 40.0mA ก็เหลือเฟือ ก็เดี๋ยวจะเอาขา I/O ขาหนึ่งขับหลอด LED ของจอเลย

ปล. เป็นอย่างไรกันบ้างครับ เอาเรื่องจิตใจบ้าง ธรรมะสักข้อนะ ปธาน 4 เพียรละในสิ่งที่ไม่ดี เพียรเสริมสร้างสิ่งที่ดี เราจะได้เจริญๆ
http://www.84000.org/tipitaka/dic/d_item.php?i=156

tha

คราวนี้ก็มาทำโปรแกรมให้ font เอามาเก็บไว้ที่ flash rom ก็แกะมาจากตัวอย่างเขานั่นแหละ ต้องขอขอบคุณเขาด้วยครับ ก็มาแก้ที่ไฟล์ GLCD_32u4_1.h ดังนี้นะ
1. #include <avr/pgmspace.h>    ถ้าเราจะทำงานกับ flash rom
2. แก้ตรงจุดนี้ ประกาศให้ font เก็บไว้ที่ flash rom
Quote
//static const unsigned char FontLookup [][5] =
static const unsigned char FontLookup [][5] PROGMEM =
3. แก้ที่จุดนี้อีกเวลาอ่าน flash rom
Quote
for ( i = 0; i < 5; i++ )
    {
        //LcdCache[LcdCacheIdx++] = FontLookup[ch - 32] << 1;
       LcdCache[LcdCacheIdx++] = pgm_read_byte(&FontLookup[ch - 32]) << 1;
    }
มาเพิ่มไฟ Backlight อีก โดยเอาพิน PE6 ขับ มีตัวอย่าง
http://www.mediafire.com/file/16db0orq01f4ti2/GLCD5110_32u4_2.rar/file

ตอนโปรแกรมด้วย mk-II ก็ใช้กับไฟ 3.3V ได้เลย เราเอาถ่าน 2 ก้อนมาใช้ยกไปไหนมาไหนได้เลย แต่ยังไม่ได้ลองนานๆเพราะต้องประหยัดถ่านไฟครับ  :)




tha

พรายกระซิบบอกให้แก้ตรงจุดนี้ให้เป็น 0xC0 ด้วย ผมอ่านคู่มือก็ยังงงอยู่ ลองคำนวณจากสูตรนี้ V = 3.06 + (VOP6 to VOP0) x 0.06
V = 3.06 + (0x40)x0.06   -> V = 3.06 +(64x0.06) -> V = 6.9
หมายถึงมันอัฟไฟจาก 3.3V ไปเป็น 6.9V ภายในเหรอ งง แต่มันก็ไม่เกินที่เขากำหนดไว้ที่ 8.5V ก็น่าจะไม่มีปัญหาอะไร
Quote
//lcdSend( 0xC8, LCD_CMD );  // Set LCD Vop (Contrast).
   lcdSend( 0xC0, LCD_CMD );  // Set LCD Vop (Contrast).