Electoday 2025

ไมโครคอนโทรลเลอร์ => AVR and Arduino => Topic started by: tha on August 25, 2019, 09:42:42 AM

Title: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 25, 2019, 09:42:42 AM
18. I/O-Ports

18.1. Overview(ภาพรวม)

ทุก AVR ports มีฟังก์ชัน Read-Modify-Write ที่แท้จริง เมื่อใช้เป็น general digital I/O ports. นี้หมายความว่าทิศทางของขาหนึ่งของ port สามารถถูกเปลี่ยน โดยปราศจากการเปลี่ยนทิศทางของขาอื่น ๆโดยไม่ได้ตั้งใจ ด้วยคำสั่ง SBI(set bit) และ CBI(clear bit). เช่นเดียวกันกับเมื่อเปลี่ยน drive value (ถ้ากำหนดเป็น output) หรือการเปิด/ปิดการใช้งานของ pull-up resistors (ถ้ากำหนดเป็น input). แต่ละ output buffer แต่ละตัวมีลักษณะของการไดรฟ์แบบสมมาตรกัน ด้วยมีทั้งความสามารถในการดึงลงกราวน์(sink)และเป็นแหล่งจ่ายไฟ(source)ที่สูง. pin driver นี้มีความแข็งแรงเพียงพอที่จะไดรฟ์ LED displays ได้โดยตรง. ทุกพิน (port pins) มี pull-up resistors ที่เลือกได้เป็นรายขาไป ด้วยแหล่งจ่ายไฟที่มีความต้านทานที่คงที่. ทุกพิน(I/O pins) มี protection diodes ทั้ง VCC and Ground ดังแสดงในรูปต่อไปนี้.

(https://i.imgur.com/juMQ3dZ.png)

รีจีสเตอร์และบิททั้งหมดที่อ้างอิงในบทนี้ถูกเขียนในรูปแบบทั่วไป. ตัวพิมพ์เล็ก "x" หมายถึงตัวอักษรสำหรับ port นั้นๆ, และตัวพิมพ์เล็ก "n" หมายถึง bit number นั้นๆ อย่างไรก็ตามเมื่อใช้ register หรือ bit กำหนดลงใน program, รูปแบบที่แน่นอนต้องถูกใช้ ตัวอย่างเช่น PORTB3 สำหรับ bit no. 3 ในเอกสารนี้โดยทั่วไปอ้างเป็น PORTxn.

I/O memory address locations ถูกจัดสรรสำหรับแต่ละ port หนึ่งแห่งสำหรับ Data Register – PORTx, Data Direction Register – DDRx, และ Port Input Pins – PINx. Port Input Pins I/O location สามารถอ่านได้เพียงอย่างเดียว ขณะที่ Data Register และ  Data Direction Register ทั้งอ่าน/เขียนได้. อย่างไรก็ตามการเขียน '1' ไปยังบิตหนึ่งใน PINx Register จะทำให้เกิดการสลับ(toggle)ในบิทที่ตรงกันใน Data Register. นอกจากนี้บิท Pull-up Disable – PUD bit ใน MCUCR จะปิดการใช้งานฟังชั่น pull-up ของทุกพินในทุก ports เมื่อเซทบิทนี้ให้เป็น"1".

การใช้ I/O port เป็น Digital I/O ทั่วไป ถูกอธิบายในส่วนถัดไปนี้ "Ports as General Digital I/O"  พิน(port pins)โดยมากแล้วใช้ร่วมกันกับหน้าที่ทางเลือกอื่น (alternate functions อย่าง usart, spi i2c) สำหรับอุปกรณ์ต่อพ่วงต่างๆ บน mcu นี้. แต่ละ alternate function เกี่ยวข้องกับพิน(port pin)อย่างไร ถูกอธิบายใน Alternate Port Functions section ในบทนี้.  โปรดดูในบทเป็นรายโมดูลไป(usart, spi i2c) สำหรับการคำอธิบายที่ครอบคลุมทั้งหมดของ alternate functions

การเปิดใช้งาน alternate function ของบางพิน( port pins) ไม่มีผลกระทบต่อการใช้งานพินอื่นๆใน port นี้ที่ใช้เป็น general digital I/O.

ปล. จำไม่ได้แล้ว เลยเริ่มใหม่เลย แน่นดี หมู่นี้ครึ้มฟ้าครึ้มฝน ถึงไม่มีแอร์ก็พอจะไปได้
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 25, 2019, 09:54:08 AM
ดูรถกระบะในยูทูปมากไปหน่อย มันเลยขึ้นแทรกโฆษณา ford ranger ในหน้านี้เลย ยุคเทคโนโลยี่มันดีไหมนี่ ทำคนตกอยู่ในความอยากตลอดเลย ต้องดิ้นรนหาเงินไปสิ อยากได้นี่ ทุกข์หรือสุขกันแน่เนี้ย มันดาบสองคมไหมนี่ จะเอาเงินไปทำอะไรนักหนาหล่ะเจ้ากูเกิ้ล ติงๆไว้ว่าคิดถูกไหม
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 26, 2019, 09:18:58 AM
18.2. Ports เป็น General Digital I/O
ports นี้เป็นพอร์ตอินพุทเอ๊าพุทสองทิศทาง (bi-directional I/O ports) พร้อมด้วยทางเลือก pull-ups ภายใน. รูปต่อไปนี้แสดงการอธิบายหน้าที่ของ I/O-port pin อันหนึ่ง, ในที่นี้เรียกว่า Pxn.

(https://i.imgur.com/lxh4RoJ.png)

หมายเหตุ: 1. WRx, WPx, WDx, RRx, RPx, and RDx ใช้ร่วมกันทุก pins ภายใน port เดียวกัน. clkI/O, SLEEP, and PUD ใช้ร่วมกันทุก ports.

ปล. ลองไล่การทำงานของวงจรได้หรือเปล่า ไม่น่าจะยากนะ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 26, 2019, 10:27:48 AM
จะลองอธิบายดู ยากเหมือนกันอธิบาย

ดูที่ตัว pull-up ก่อนว่าเป็นยัง ก็จะเป็นว่า
          บิท pud (pull-up disable) ต้องเป็น "0"
          DDR data direction register ต้องเป็น "0" (เป็นอินพุท)
          PORT data register ต้องเป็น "1"
ถึงจะ pull-up ของบิทนั้นทำงานใช่ไหม

ดูที่ตัว D-flipflop ตัวบน เป็น DDRx (data direction register) ควบคุมการเป็น input หรือ output ใช่ไหม
   ถ้าใน data bus บิทนี้เป็น "1" มา พร้อมกับมีสัญญาน WDx (Write DDRx) ก็จะมีสัญญานออกที่ Q เป็น "1" ไป ทำให้เกตเปิด เป็น output ใช่ไหม
   แต่ถ้าใน data bus บิทนี้เป็น "0" มา พร้อมกับมีสัญญาน WDx (Write DDRx) ก็จะมีสัญญานออกที่ Q เป็น "0" ไป ทำให้เกตปิด เป็น input ใช่ไหม
   แล้วก็มีเกตสำหรับ Read DDR โดยเมื่อมีสัญญาน RDx (Read DDRx) ทำให้ค่าบิทนี้มาอยู่บน data bus ทำให้เราสามารถเช็คทิศทางของพินได้ว่าเป็น input หรือ output

ดูที่ตัว D-flipflop ตัวถัดมา เป็น PORT (data register) ควบคุมบิทนี้ให้เป็น "0" หรือ "1" เมื่อเป็น output ใช่ไหม
   ถ้าใน data bus บิทนี้เป็น "1" มา พร้อมกับมีสัญญาน WRx (Write PORTx) ก็จะมีสัญญานออกที่ Q เป็น "1" ไป ทำให้ output บิทนี้เป็น "1" (output high) ใช่ไหม
   แต่ถ้าใน data bus บิทนี้เป็น "0" มา พร้อมกับมีสัญญาน WRx (Write PORTx) ก็จะมีสัญญานออกที่ Q เป็น "0" ไป ทำให้ output บิทนี้เป็น "0" (output low) ใช่ไหม
   ถ้าใน data bus บิทนี้เป็น "1" มา พร้อมกับมีสัญญาน WPx (Write PINx Register) บิทนี้ก็จะ toggle ใช่ไหม ลองไล่ดูอธิบายยาก
   แล้วก็มีการอ่านค่าบิทนี้กลับมาที่ data bus เมื่อมีสัญญาน RRx (Read PORTx Register)

แล้วมาดูที่ D-flipflop สองตัว (Synchronizer) เป็น PINx (Port Input Pin)
   เมื่อสัญญาน clkio เป็น "1" แล้วกลับไปเป็น "0" อีกที สัญญานของพินนี้ถึงจะออกมาจาก Synchronizer ใช่ไหม ดูจะงงๆหน่อย ไม่รู้เหตุผลว่าเขาทำแบบนี้ทำใม แล้วเมื่อมีสัญญาน RPx (Read PORTx Pin) ค่าของพินนี้ถึงจะอ่านไปสู่ data bus ใช่ไหม
   ส่วน sleep อะิบายไม่ถูกนะ คงจะมีผล เมื่อเราเให้เข้าสู่โหมด sleep แล้วปิดบิทนี้เพื่อประหยัดพลังงาน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 26, 2019, 11:05:01 AM
Synchronizer  สัญญาน clkio เป็น "0" แล้วกลับไปเป็น "1" อีกที สัญญานของพินนี้ถึงจะออกมาจาก Synchronizer หรือเปล่า ไปดู d-flipflop ตัวบนมา น่าจะเป็นแบบนี้นะ ผิดอยู่ไม่รู้ท่านใดบอกมา ขอบคุณครับ มีพรายกระซิบบอกนี่แน่นอนจริงๆ  ;D
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 26, 2019, 11:33:30 AM
ค่าของพินที่อ่านได้ ก็จะไม่ใช่ค่าของพินขณะนั้นทันทีสิใช่ไหม ก็เป็นค่าที่หน่วงช้าไป 1 clock (clkio) สิใช่ไหม สงัสยพรายกระซิบบอกมาอีกแล้ว เอ๊ะไม่รู้เขาออกแบบมาแบบนี้ทำใม เพื่อแก้ปัญหาอะไร อ่านไปต่อข้างหน้าจะมีคำอธิบายไว้ไหม ลองอ่านดูไปก่อนก็ได้นะครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 27, 2019, 08:15:29 AM
18.2.1. Configuring the Pin ( การกำหนดค่า Pin)

แต่ละพิน(port pin) ประกอบด้วย 3 register bits: DDxn, PORTxn, และ PINxn. ดังแสดงใน Register Description หน้า 100, DDxn bits ถูกเข้าถึงที่ DDRx I/O address, PORTxn bits ที่ PORTx I/O address, และ PINxn bits ที่ PINx I/O address.
DDxn bit ใน DDRx Register จะเลือกทิศทางของ pin นี้. ถ้า DDxn ถูกเขียนเป็น '1', Pxn ถูกกำหนดเป็น output pin. ถ้า DDxn ถูกเขียนเป็น '0', Pxn ถูกกำหนดเป็น input pin.

ถ้า PORTxn ถูกเขียนเป็น '1' เมื่อ pin นั้นถูกกำหนดเป็น input pin, pull-up resistor จะถูกเปิดใช้งาน. เพื่อเปลี่ยน pull-up resistor เป็นปิดใช้งาน, PORTxn ต้องถูกเขียนเป็น '0' หรือ pin นั้นต้องถูกกำหนดเป็น output pin. port pins จะเป็น tri-stated เมื่อ reset condition ทำงาน, ถึงแม้ว่าสัญญานนาฬิกาไม่ได้รันอยู่ก็ตาม.

ถ้า PORTxn ถูกเขียนด้วย '1' เมื่อ pin นั้นถูกกำหนดเป็น output pin, port pin นั้นจะถูกขับให้เป็นสูง(ให้เป็น1). ถ้า PORTxn ถูกเขียนด้วยลอจิก "0" เมื่อ pin นั้นถูกกำหนดเป็น output pin, port pin นั้นจะถูกขับให้เป็นต่ำ(ให้เป็น 0).

18.2.2. Toggling the Pin (การสลับค่า PIN)

การเขียน '1' ไปยัง PINxn จะสลับค่าของ PORTxn, โดยเป็นอิสระจากค่าของ DDRxn. คำสั่ง SBI(set bit instruction) สามารถถูกใช้สลับค่าของหนึ่ง bit เดี่ยวใน a port .

18.2.3. Switching Between Input and Output(การสวิทช์ระหว่าง  Input และ Output)

เมื่อสวิทช์ระหว่าง tri-state ({DDxn, PORTxn} = 0b00) และ output high ({DDxn, PORTxn} = 0b11), สถานะระหว่างกลางอย่างใดอย่างหนึ่ง pull-up enabled {DDxn, PORTxn} = 0b01) หรือ output low ({DDxn, PORTxn} = 0b10) ต้องเกิดขึ้น. โดยปกติ, pull-up enabled state เป็นที่ยอมรับอย่างสมบูรณ์ในฐานะ a highimpedance environment จะไม่สังเกตเห็นความแตกต่างระหว่าง strong high driver และ pull-up. หากไม่เป็นเช่นนั้น, บิท PUD bit ใน the MCUCR Register สามารถถูกเซทเพื่อปิดใช้งานl pull-ups ทั้งหมดในทุก ports.

การสวิทช์ระหว่าง input with pull-up และ output low จะเกิดปัญหาเดียวกัน. ผู้ใช้ต้องใช้ tri-state ({DDxn, PORTxn} = 0b00) หรือ  output high state ({DDxn, PORTxn} = 0b11) เป็นขั้นตอนกลาง

ตารางต่อไปนี้แสดงรวบยอด control signals สำหรับ pin value.

(https://i.imgur.com/hXykItG.png)

ปล. ช่วงนี้มีของเก่าอยู่ เลยได้เยอะหน่อย เดี๋ยวจะลองโปรแกรมมีสวิทช์แล้วใช้การ pull-up ดู
เดี๋ยวจะลองลง CodeVision AVR v3.14 ดู มีอยู่ในนี้แหละ สงสัยพรายกระซิบบอกมาอีกแล้ว แต่ไม่ทำโปรเจ็คในนี้หรอกนะ จะทำใน AVR Studio 4 นะเพราะเป็นตัวฟรี
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 27, 2019, 09:44:10 AM
http://www.mediafire.com/file/ttp7mrzsintlyj7/Switch_1.rar/file (http://www.mediafire.com/file/ttp7mrzsintlyj7/Switch_1.rar/file)
ตัวอย่างนี้เป็นตัวอย่างสวิทช์ปุ่มกด ใช้ตัวต้านทานภายนอกพูลอัฟนะครับ รูปแบบก็เป็นแบบมาตรฐาน ก็เอาตัวอย่างมาจากในหนังสือไมโครฯ AVR

http://www.mediafire.com/file/mbi83k30j5apuy7/Switch_pull-up.rar/file (http://www.mediafire.com/file/mbi83k30j5apuy7/Switch_pull-up.rar/file)
ตัวอย่างนี้เป็นตัวอย่างสวิทช์ปุ่มกด ใช้การพูลอัฟภายในแล้วนะครับ อย่าลืมถอดตัวต้านทานภายนอกพูลอัฟออกด้วยหล่ะ


ปล. Codevision ผมลงตัวทดลองใช้ Evaluation นะ http://www.hpinfotech.ro/cvavr-download.html (http://www.hpinfotech.ro/cvavr-download.html) ได้ 4Kbytes แต่คอมไพล์เป็นภาษา Assembly ให้ด้วยใช่ไหม ดูแล้วเล่นยากอยู่ ค่อนข้างยุ่งยาก ลงไปก่อนเผื่อได้ใช้ครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 27, 2019, 01:42:33 PM
เราลองมาทำกดปุ่มสวิทช์แล้วปล่อย ไฟจะวิ่งไปทีละดวง ใช้ PB0 เป็นอินพุทสวิทช์พร้อม internal pull-up ไม่ต้องใช้ตัวต้านทาน pull-up ภายนอก ส่วนไฟ LED ก็ใช้ PD0-7 มีท่านใดบอกมาอีกเนี้ย ก็ค่อนข้างที่จะไวเลย ช่วยกันคิดนะ ขอบคุณ

มีโปรแกรมตัวอย่าง
http://www.mediafire.com/file/1yz1ksgpt14n6hv/Switch_2.rar/file (http://www.mediafire.com/file/1yz1ksgpt14n6hv/Switch_2.rar/file)

มีแท๊บเล็ตแล้วก็มีภาพมายืนยัน ว่าทำงานได้จริง ไม่ได้หลอก  ;D

https://www.youtube.com/v/nqGyP_bubmQ

ปล. มือใหม่เพิ่งจะถ่าย มีอะไรต้องปรับปรุงบ้างก็บอกมานะ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 27, 2019, 02:34:37 PM
ลองทำอีกตัวอย่างนะ ใช้สวิทช์สองตัว PB0 เปิด PB1 ปิด พร้อม internal pull-up ไม่ต้องใช้ตัวต้านทาน pull-up ภายนอก เปิดปิดไฟ LED 8 ดวง ดูยังไม่สมบูรณ์ดี ก็ลองเอาไปโมกันนะครับ

มีโปรแกรมตัวอย่าง
http://www.mediafire.com/file/o3dlx9jc739eww9/Switch_3.rar/file (http://www.mediafire.com/file/o3dlx9jc739eww9/Switch_3.rar/file)

https://www.youtube.com/v/45P_Pft-1Ck

ปล. ชักจะคล่องแล้วกับการโพสต์ลงยูทูบ วันนี้พอก่อนนะ หรือจะเอาตัวอย่างอะไรก็บอกมาครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 28, 2019, 08:27:49 AM
ไหนๆก็ว่ากันถึง switch แล้วนะ ใครเจอปัญหาการ debounce บ้าง ลองเสิร์จหาในเน็ตเจออันนี้น่าสนใจ แต่ดูออกจะยากหน่อย มีง่ายกว่านี้ไหม เอามาลงกันหน่อย เดี๋ยวจะลองศึกษาตัวนี้ก่อนนะ ค่อนข้างยาก แต่ก็สามารถนำไปใช้ได้ถ้าเข้าใจมัน จะศึกษาตัวนี้นะวันนี้

https://www.avrfreaks.net/forum/tutsofthard-button-debouncing-software (https://www.avrfreaks.net/forum/tutsofthard-button-debouncing-software)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 28, 2019, 09:36:10 AM
ผมเสิร์จคำว่า AVR switch debounce code ครับ อันนี้ก็ดูง่ายดี 
https://www.avrfreaks.net/forum/switch-debounce-code?page=all (https://www.avrfreaks.net/forum/switch-debounce-code?page=all)

Quote
// ---------- In header file ----------
#define KEY_UP         6
#define KEY_DN         7

// Pins
#define KEY_PINS       PIND

// Macros
#define KEY_DN_PRESS   (~(KEY_PINS) & (1<<KEY_DN))
#define KEY_UP_PRESS   (~(KEY_PINS) & (1<<KEY_UP))

// ---------- In main file ----------
int8_t read_keys(void) {
   if(KEY_UP_PRESS) {
      _delay_ms(10);
      while(KEY_UP_PRESS);      // Wait for key to be released
      _delay_ms(10);
      return 1;
   }
   if(KEY_DN_PRESS) {
      _delay_ms(10);
      while(KEY_DN_PRESS);
      _delay_ms(10);
      return -1;
   }
   else return 0;
}

ปล.  ท่านใดบอกมาอีกหล่ะ เอาตัวอย่างไหนดี ผมจะลองทำที่ตัวอย่างแรกก่อนนะ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 28, 2019, 11:06:29 AM
ได้แล้ว switch debounce สวิทช์เดียว ใส่สวิทช์ที่ PB0 ใช้ pull-up ภายใน ไม่ต้องต่อตัวต้านทาน pull-up ภายนอก หลอด LED ก็ต่อที่ PD0 เวลากดสวิทช์แล้วหลอด LED ก็จะ toggle ต้องกดสวิทช์ค้างไว้ วนถึง 4 รอบๆละ 10ms ครับ

http://www.mediafire.com/file/da6q49ww6mqlsme/Switch_Debounce_1.rar/file (http://www.mediafire.com/file/da6q49ww6mqlsme/Switch_Debounce_1.rar/file)

มาดูตรงไหนยากบ้าง ตรงนี้จะงงหน่อย ก็ไม่มีอะไร ก็อาน PINB มาทั้ง 8 บิท ถ้าเรากดสวิทช์ PB0 อยู่ ค่าที่ได้ของ PINB0 ก็จะเป็น "0" คราวนี้พอกลับบิท ค่าที่ได้ก็จะเป็น "1" คราวนี้ก็มา AND กับ "1" shift left ไป PB0 (PB0 มีค่าเท่าไหร่ก็ไปดูที่ไฟล์ iom328p.h ใช่ไหม ตำแหน่งที่อยู่ผมก็จะบอกไว้ในโปรแกรมแล้ว) "1" กับ "1" AND กัน ก็ได้เท่ากับ "1" เมื่อสวิทช์ถูกกด ก็ไม่เท่ากับ "0" ก็ไม่เท่ากับ "0" ทางด้านขวา ก็ถูกก็เป็น "1" current_state ก็จะเป็น "1' เมื่อสวิทช์ถูกกดใช่ไหม
Quote
   // Check if button is high or low for the moment
   uint8_t current_state = (~BUTTON_PIN & BUTTON_MASK) != 0;

Quote
// Variable to tell main that the button is pressed (and debounced).
// Main will clear it after a detected button press.
volatile uint8_t button_down;
เจอข้อผิดพลาดของตัวเองแล้ว เพราะไม่ได้เล่นมานานเลยลืม global variable มันต้องประกาศตัวแปรเป็น volatile ใช่ไหม มันถึงจะเห็นได้ทั้งโปรแกรมย่อยทั้งเมนโปรแกรม คือบีบอัด(project->configuration options->optimization = -Os) ก็จะเห็นตัวแปรอยู่ได้ทั้งเมนโปรแกรมทั้งโปรแกรมย่อย ก็สามารถทำงานได้

Quote
static inline void debounce(void)
ส่วนโปรแกรมย่อย static inline void นี้ไม่รู้ว่าทำใมต้องประกาศแบบนี้ ท่านใดทราบช่วยอธิบายหน่อย
ส่วนตัวแปร static ก็เป็นตัวแปรที่จะเก็บค่าไว้ ถึงแม้ออกจากโปรแกรมย่อยไปแล้วก็ตาม

ปล. โปรแกรมที่ผ่านมา ก็ถือว่าผิดบานเลย ที่ไม่ประกาศตัวแปร global variable ให้เป็น volatile แล้วก็ถึงจะบีบอัดได้  (project->configuration options->optimization = -Os) code size ก็จะลดลงมาเยอะเลย ไปลองแก้ที่ผ่านๆมากันนะ ข้าน้อยลืมจริงๆ  :'(
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 29, 2019, 10:11:46 AM
ลองเสิร์จ "avr switch debounce code" กับ "bit_is_clear avr example" ก็ได้ตัวอย่างนี้มา เดี๋ยวจะลองทำตามตัวอย่างนะ
https://www.micahcarrick.com/avr-tutorial-switch-debounce.html (https://www.micahcarrick.com/avr-tutorial-switch-debounce.html)
http://mlab.taik.fi/paja/?p=422 (http://mlab.taik.fi/paja/?p=422)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 29, 2019, 10:50:35 AM
ไม่ได้อ่านหรอก  ;D ดูผ่านๆเอาก็พอจะเดาได้ เขียนอย่างนี้มันกิน flash เยอะเหมือนกัน กับแค่สวิทช์เดียวกับ led หลอดเดียว กินตั้ง 3926 byte นี้ขนาด optimze แล้ว มีตัวอย่างให้ดูครับ

http://www.mediafire.com/file/ffuhcz3fnircfb3/switch_debounce_2.rar/file (http://www.mediafire.com/file/ffuhcz3fnircfb3/switch_debounce_2.rar/file)

_BV(bit) ก็ไปดูที่ๆเขา define ไว้แล้วใน sfr_defs.h ก็ included ใน io.h ตอนที่เรา include avr/io.h. ที่หัวโปรแกรม ก็จะอยู่ใน C:\WinAVR-20100110\avr\include\avr ลองไล่เช็คดูครับ (bit_is_clear() ก็อยู่ใน sfr_defs.h เหมือนกัน

Quote
#define _BV(bit) (1 << (bit))

Quote
#define bit_is_clear(sfr, bit) (!(_SFR_BYTE(sfr) & _BV(bit)))

ก็ลองทำความเข้าใจดู เดี๋ยวผมจะลองทำแบบ code ปกติที่เคยทำนะ จะดูว่า code size มันจะลดลงมั๊ย
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 29, 2019, 11:29:32 AM
เจอปัญหา code size ใหญ่แล้ว เราไม่ต้องสร้างฟังชั่น delay_ms() เราสามารถใช้ฟังชั่น _delay_ms() ของไฟล์ delay.h ได้เลยโดยตรงได้เลย คราวนี้ code size จาก 3926 byte ก็ลดลงมาเหลือ 248 byte เอง

http://www.mediafire.com/file/t8t1ishaurxdgaj/switch_debounce_3.rar/file (http://www.mediafire.com/file/t8t1ishaurxdgaj/switch_debounce_3.rar/file)

fuse bit ตอนนี้เซทไว้เท่าไหร่กันแล้ว ของผม
             EXTENDED = 0xFC
             HIGH         = 0xDB
             LOW          = 0xDF
ชักจะลืมๆแล้ว พอเข้าที่แล้วก็ไม่ได้เปลี่ยนมานาน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 29, 2019, 01:18:50 PM
ลองทำ 2 สวิทช์(PB0, PB1) 2 หลอด led(PD0, PD1) ดู ก็สามารถทำได้

http://www.mediafire.com/file/fjdb02eo0gmhos8/switch_debounce_4.rar/file (http://www.mediafire.com/file/fjdb02eo0gmhos8/switch_debounce_4.rar/file)

https://www.youtube.com/v/o9IgQkpc-4Y

ปล. เอาเรื่องจิตใจบ้าง ธรรมะวันละนิดครับ อนุสติ 10 สิ่งที่ควรนึกระลึกถึงเป็นประจำ ก็จะทำให้จิตใจเราดีงาม มีสติมีปํญญา มีสุขขึ้น
      http://www.84000.org/tipitaka/dic/d_item.php?i=335 (http://www.84000.org/tipitaka/dic/d_item.php?i=335)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 30, 2019, 12:08:21 PM
18.2.4. Reading the Pin Value(การอ่านค่า Pin Value)
เป็นอิสระจากการเซทของบิท Data Direction bit DDxn, port pin สามารถถูกอ่านผ่านทางบิท PINxn Register bit. ดังแสดงใน Ports as General Digital I/O, บิท PINxn Register bit และ preceding(ก่อนหน้า) latch ประกอบเป็น a synchronizer. นี่เป็นสิ่งจำเป็นเพื่อหลีกเลี่ยงการเปลี่ยนแปลงได้ถ้า physical pin เปลี่ยนค่าใกล้กับขอบของ internal clock, แต่มันก็ทำให้เกิดการ delay ขึ้นด้วย รูปต่อไปนี้แสดงแผนภาพเวลาของการซิงโครไนซ์เมื่ออ่านค่าพินจากภายนอก. maximum and minimum propagation(การแพร่กระจาย) delays ถูกแสดงเป็น tpd,max และ tpd,min ตามลำดับ

(https://i.imgur.com/eP0c39j.png)

ปล. ดูที่วงจรและ timing diagram จะเห็นได้ว่า clkio เปลี่ยนจาก "1" เป็น "0" ก่อน ถึงจะรับค่าพินภายนอกเข้ามากลาง synchronizer พอ clkio เปลี่ยนจาก "0" เป็น "1' อีกที ถึงจะได้ค่า PINxn แล้วถึงอ่านออกไปอีกที
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 30, 2019, 01:08:09 PM
พิจารณาที่ clock period เริ่มต้นสั้นๆหลังจากขอบขาลงแรกของ system clock. The latch จะปิดเมื่อ the clock เป็นดึงลงต่ำ(ขอบขาลง), และจะเปิดเผยเมื่อ  clock ขึ้นสูง(ขอบขาขึ้น), ดังแสดงเป็นส่วนแรงเงาของ "SYNC LATCH" signal. signal value จะถูก latched(ค้าง) เมื่อ system clock ลงต่ำอีก. มันจะ clocked เข้าไปยัง PINxn Register ที่ขอบขาขึ้น (the succeeding positive clock edge).ดังแสดงโดยสองลูกศรของ tpd,max และ tpd,min, การเปลี่ยนผ่านของสัญญานหนึ่งครั้งบน pin จะถูกทำให้ล่าช้าไประหว่าง ½ และ 1½ system clock period ขึ้นอยู่กับ time of assertion

เมื่ออ่านค่า a software assigned pin value กลับ, a nop instruction ต้องถูกใส่เข้าไปดังแสดงในรูปต่อไปนี้. คำสั่ง out จะเซท "SYNC LATCH" signal ที่ขอบขาขึ้นของ  clock. ในกรณีนี้,  delay tpd ที่ผ่าน synchronizer คือ 1 system clock period

(https://i.imgur.com/e9F2w8f.png)

ปล. เวลาใช้คำสั่ง out port ไป จะอ่านกลับทันทีไม่ได้ ต้องใช้คำสั่ง NOP ดีเลย์ไว้ก่อน 1 system clock period ให้มันผ่าน synchronizer เสียก่อน ถึงจะอ่าน PINxn กลับมาได้ ถึงจะได้ค่าที่ตรง
ปล. วันนี้เย็นฝนตกก็ไปได้เรื่อยๆ ตามทันกันไหม เอาเรื่องจิตใจกันบ้างนะ มาภาวนากัน นานไปก็จะจำได้ มันก็จะ้เป็นคุณธรรมประจำใจเรา แล้วชีวิตเราก็จะดีขึ้น ไม่ต้องรอให้ใครมาสั่งจิตเสียเงินเสียทองไปเปล่าๆ                                                             
https://www.gotoknow.org/posts/247404 (https://www.gotoknow.org/posts/247404)
ผมก็ภาวนาอยู่ ก็เกิดผลดี อย่างข้อที่ 14 ทำให้ผมศึกษาอะไรละเอียดขึ้น ไม่เร่งรีบโดยที่ไม่รู้ไม่ศึกษาเหมือนแต่ก่อน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on August 31, 2019, 09:33:05 AM
ตัวอย่าง code ต่อไปนี้แสดงวิธีการเซท port B pins 0 and 1 high(เป็นสูง), 2 and 3 low(เป็นต่ำ), และกำหนด port pins จาก 4 ถึง 7 เป็น input พร้อมทั้งกำหนด pull-ups ไปยัง port pins 6 และ 7. ค่าพินที่ได้ถูกอ่านกลับมาอีกครั้ง แต่ตามที่กล่าวไว้ก่อนหน้านี้, คำสั่ง nop ถูกเพิ่มเข้ามาเพื่อให้สามารถอ่านค่ากลับคืนมาได้ ทันทีที่เพิ่งที่กำหนดถึงพินบางพิน (some of the pins).

(https://i.imgur.com/TA2vzqh.png)

หมายเหตุ: 1. สำหรับ assembly program, สองรีจีสเตอร์ชั่วคราวถูกใช้เพื่อย่อเวลาน้อยจาก pull-ups ถูกเซทบน pins 0, 1, 6, และ 7, จนกระทั่งบิท direction ถูกเซทอย่างถูกต้อง, กำหนด 2 และ 3 เป็น "0" (low) และกำหนดบิท 0 และ 1.ใหม่ให้เป็น "1" (strong high drivers)

(https://i.imgur.com/BiVjMcs.png)
(https://i.imgur.com/F3hlnQX.png)

มีตัวอย่าง แต่จะไม่เหมือนเลย เพราะพิน PB6, PB7 ของเราถูกใช้เป็นขา crystal ไปเสียแล้ว
http://www.mediafire.com/file/2gguc5r10zhr9mm/io%25282%2529.rar/file (http://www.mediafire.com/file/2gguc5r10zhr9mm/io%25282%2529.rar/file)

โปรแกรมนี้ผลที่ได้คือ หลอด LED PD0, PD1, PD4, PD5 จะติด (PD0, PD1 กำหนดเป็น output และให้เป็น "1" ส่วน PD2, PD3  กำหนดเป็น output และให้เป็น "0" ส่วน PD4, PD5 กำหนดเป็น input และกำหนดให้ pull-up ก้จะมีสัญญานเป็น "1" อยู่ที่พิน)
แต่พอลองเอาคำสั่ง NOP ออก คือไม่ได้ delay ให้มันผ่าน synchronizer ก่อน ค่าที่ได้ก็จะเพี้ยนไปตลอดเลยเมื่อเราลอง reset ใหม่
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 01, 2019, 09:30:35 AM
18.2.5. Digital Input Enable and Sleep Modes
ตามที่แสดงในรูปของ General Digital I/O, digital input signal สามารถถูกต่อลงกราวด์ที่อินพุทของ Schmitt Trigger. signal ที่แสดงเป็น SLEEP ในรูปนั้น ถูกเซทโดย MCU Sleep Controller ใน Power-down mode, Power-save mode และ Standby mode เพื่อหลีกเลี่ยงการกินพลังงานที่สูง ถ้าบาง input signals ถูกปล่อยลอย (floating), หรือมี analog signal level ใกล้ถึง VCC/2.

SLEEP ถูกข้ามผ่านไปสำหรับ port pins ที่เปิดใช้งานเป็น external interrupt pins. ถ้า external interrupt request ไม่ถูกเปิดใช้งาน, SLEEP ยังทำงานกับ pins เหล่านี้ได้อีกด้วย. SLEEP ยังถูกข้ามผ่านโดย alternate functions ต่างๆ ดังอธิบายใน Alternate Port Functions section ในบทนี้อีกด้วย

ถ้า logic high level เกิดขึ้นบน asynchronous external interrupt pin ที่กำหนดเป็น "Interrupt on Rising Edge, Falling Edge, หรือ Any Logic Change on Pin" ในขณะที่ external interrupt นั้นไม่ถูกเปิดใช้งาน, corresponding(ที่ตรงกัน) External Interrupt Flag จะถูกเซท เมื่อกลับคืนมาทำงานใหม่ต่อจาก Sleep Mode ที่กล่าวมาข้างต้น, เนื่องจากการจับยึดกับ sleep mode เหล่านี้สร้าง requested logic change.

ปล. ดูวงจรประกอบ ก็จะเห็นว่า sleep จะ clamp พินลงกราวน์ เว้นแต่พินนั้นถูกกำหนดเป็น external interrupt pin หรือ alternate functions (อย่าง usart, spi, i2c, timer)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 01, 2019, 10:59:13 AM
18.2.6. Unconnected Pins (พินไม่ได้ถูกต่อใช้งาน)
หากพินไม่ได้ถูกใช้ แนะนำให้ตรวจสอบให้แน่ใจว่าพินเหล่านี้มี a defined level(มีระดับเป็น "1" หรือ "0" หรือเปล่า) ถึงแม้ว่า digital input ส่วนใหญ่ถูกปิดการใช้งานใน deep sleep mode ดังที่อธิบายไว้ข้างต้น การปล่อย input ลอยควรหลีกเลี่ยง เพื่อลดการกินกระแสในโหมดอื่นๆทั้งหมดที่ digital input ถูกเปิดการใช้งาน (Reset, Active mode and Idle mode).

วิธีที่ง่ายที่สุดเพื่อให้แน่ใจใน a defined level ของพินที่ไม่ได้ใช้ คือการเปิดใช้งาน internal pull-up ในกรณีนี้ pull-up จะถูกปิดการใช้งานในระหว่างการรีเซ็ต ถ้า low power consumption ในระหว่างการรีเซ็ตมีความสำคัญ แนะนำว่าให้ใช้ external pull-up หรือ pull-down การต่อพินที่ไม่ได้ใช้ถึง Vcc หรือ GND โดยตรงไม่ควรทำ เนื่องจากจะทำให้กระแสมากเกินไป หากมีการกำหนดพินโดยไม่ได้ตั้งใจเป็น output

ปล. วันหยุดนี่หยุดกันหรือเปล่าท่าน ผมว่างๆไม่เครียดไม่ร้อนก็แปลไปเรื่อยๆ ไม่มีอะไรจะทำ ไม่รู้ตามกันทันไหม อันไหนไม่ค่อยจะได้ใช้ก็จะไม่ยกตัวอย่างนะ
เอาธรรมะสักข้อนะ เอาเรื่องจิตใจบ้าง สุขทุกข์อยู่ที่จิตใจ ใช่สิ่งเสพภายนอก มาภาวนาธรรมะกัน สร้างคุณธรรมขึ้นในจิตใจเรา แล้วเราก็สุขขึ้น มีชีวิตที่ดีขึ้นด้วย
http://www.84000.org/tipitaka/dic/ (http://www.84000.org/tipitaka/dic/)
http://www.84000.org/tipitaka/dic/d_item.php?i=139 (http://www.84000.org/tipitaka/dic/d_item.php?i=139)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 02, 2019, 09:03:20 AM
18.3. Alternate Port Functions (ฟังชั่นทางเลือกอื่นของขาพอร์ต)
port pin ส่วนใหญ่มี alternate function นอกเหนือจากการเป็น general digital I/Os. รูปต่อไปนี้แสดงให้เห็นว่า port pin control signals จากรูป Figure 18-2 (ที่ดูง่ายๆ) สามารถข้ามผ่าน(แทนที่)โดย alternate function ได้อย่างไร overriding signals อาจไม่ปรากฎในทุก port pin แต่รูปนี้แสดงเป็นคำอธิบายทั่วไปที่สามารถใช้ได้กับทุก port pin ใน AVR microcontroler family

(https://i.imgur.com/0FdTfIU.png)

Note :  1. WRx, WPx, WDx, RRx, RPx, and RDx ใช้ร่วมกันทุก pins ภายใน port เดียวกัน clkI/O, SLEEP, and PUD ใช้ร่วมกันทุก ports สัญญานอื่นๆทั้งหมดเป็นของเฉพาะสำหรับแต่ละพิน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 03, 2019, 09:32:20 AM
ตารางต่อไปนี้สรุปรวมฟังชั่นของ overriding signals. ดัชนี pin และ port จากรูป Figure 14-5 จะไม่แสดงในตารางนี้ overriding signals ถูกสร้างขึ้นภายในโมดูลที่มี alternate function

(https://i.imgur.com/7079euF.png).

DVOE : ถ้า signal นี้ถูก set,  pull-up enable ถูกควบคุมโดย PUOV signal. ถ้า signal นี้ถูก cleared, pull-up ถูก enabled เมื่อ
           บิท {DDxn, PORTxn, PUD} = 0b010.

PVOV : ถ้า PUOE ถูก set, pull-up ถูก enabled/disabled เมื่อ PUOV ถูก set/cleared, โดยไม่คำนึงถึงการเซทของบิท DDxn,
           PORTxn, and PUD Register bits.

DDOE : ถ้า signal นี้ถูก set, Output Driver Enable ถูกควบคุมโดย DDOV signal. ถ้า signal นี้ถูก cleared, Output driver ถูก
           enabled โดยบิท DDxn Register bit.

DDOV : ถ้า DDOE ถูก set, Output Driver ถูก enabled/disabled เมื่อ DDOV ถูก set/cleared, โดยไม่คำนึงถึงการเซทของบิท
            DDxn Register bit.

PVOE : ถ้า signal นี้ถูก set และ Output Driver ถูก enabled, port value ถูกควบคุมโดย PVOV signal. ถ้า PVOE ถูก cleared,
           และ Output Driver ถูก enabled, port Value ถูกควบคุมโดยบิท PORTxn Register bit.

PVOV : ถ้า PVOE ถูก set, port value ถูก set ไปยัง PVOV, โดยไม่คำนึงถึงการเซทของบิท PORTxn Register bit.

DIEOE : ถ้าบิทนี้ถูกเซท Digital Input Enable ถูกควบคุมโดย DIEOV signal. ถ้า signal นี้ถูก cleared, Digital Input Enable ถูก
            กำหนด(ตัดสิน)โดยถูกควบคุมโดย MCU state (Normal mode, sleep mode).

DIEOV : ถ้า DIEOE ถูก set, Digital Input ถูก enabled/disabled เมื่อ DIEOV ถูก set/cleared, โดยไม่คำนึงถึง MCU state
            (Normal mode, sleep mode).

DI : นี้คือ Digital Input ไปยัง alternate functions. ตามรูป signal ถูกต่อเข้ากับ output ของ Schmitt Trigger แต่ก่อน
       synchronizer. นอกจากว่า Digital Input ถูกใช้เป็นแหล่งจ่ายสัญญาณนาฬิกา(clock source), module ที่มี alternate
       function จะใช้ synchronizer ของตัวเอง

AIO : นี้คือ Analog Input/output to/from alternate functions. signal ถูกต่อโดยตรงเข้ากับ pad, และสามารถใช้ได้สองทิศทาง

ปล. ที่สำคัญก็มี DI ที่ต่อไปยัง alternate function กับ AIO ที่เป็น Analog ส่วนตัวอื่นมีไหมนี่ ผมไล่เช็คที่ไฟล์ iom328p.h ใน C:\WinAVR-20100110\avr\include\avr แล้วก็ยังหาบิทกับรีจีสเตอร์เหล่านี้ไม่เจอเลย ลองช่วยกันหาดูนะ ท่านๆ  :P
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 03, 2019, 10:04:54 AM
ลองไล่ไปในไฟล์ io.h ที่เรา include ไปที่หัวโปรแกรมนั่นแหละ ว่า include ไฟล์ไหนเข้าไปอีก ไล่ไปจนให้สุดซอยเลยนะ ว่ามีบิทหรือรีจีสเตอร์เหล่านี้อยู่มั๊ย ถ้าไม่มีก็เขียนโปรแกรมที่เกี่ยวกับบิทนี้ไม่ได้เพราะโปรแกรมมันจะไม่รับรู้ ก็จะ build ไม่ผ่านครับ  :o
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 03, 2019, 10:16:45 AM
ที่ผมดู iom328p.h ก่อนก็เพราะเรา include io.h เข้าไว้ที่หัวโปรแกรมนั่นแหละ แล้วตอนเราสร้าง new project เราเลือกไมโครฯ เบอร์ ATmega328p ใช่ไหม นั่นแหละมันถึง include ไฟล์ iom328p.h

ภายในไฟล์ io.h ก็จะ include ไปตรงจุดนี้ครับ
Quote
#elif defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
#  include <avr/iom328p.h>
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 03, 2019, 11:27:46 AM
เห็นแล้ว overriding signal สำหรับ alternate function ดูในตารางต่อๆมา มันคงจะเซทจากภายในว่าเราให้พินนั้นเป็น alternate function อะไร ก็ดูได้ตามตาราง แต่ก็ยังงงกับเครื่องหมายบวกกับจุดในตารางอยู่
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 04, 2019, 09:03:55 AM
บทย่อยดังต่อไปนี้อธิบาย alternate function แบบย่อ สำหรับแต่ละ port และความสัมพันธ์ของ overriding signals กับ alternate function อ้างอิงถึง alternate function description สำหรับรายละเอียดเพิ่มเติม

18.3.1. Alternate Functions of Port B
   Port B pins ที่มี alternate functions ถูกแสดงในตารางข้างล่างนี้ :

(https://i.imgur.com/l9gTZ7S.png)

alternate pin configuration มีดังต่อไปนี้:

• XTAL2/TOSC2/PCINT7 – Port B, Bit 7
   – XTAL2: Chip clock Oscillator pin 2. ถูกใช้เป็น clock pin สำหรับ crystal Oscillator หรือ Low-frequency crystal Oscillator. เมื่อถูกใช้เป็น clock pin, pin นี้ไม่สามารถใช้เป็น I/O pin.
   – TOSC2: Timer Oscillator pin 2. ถูกใช้เพียงถ้า internal calibrated RC Oscillator ถูกเลือกเป็น chip clock source, และ asynchronous timer ถูกเปิดการใช้งานโดยการเซทที่ถูกต้องในรีจีสเตอร์ ASSR. เมื่อบิท AS2 ใน ASSR ถูกเซท (1) และบิท EXCLK ถูกเคลียร์ (0) เพื่อเปิดการใช้งานการให้สัญญานนาฬิกาแบบ asynchronous ของ Timer/Counter2 โดยใช้ Crystal Oscillator, pin PB7 ถูกตัดออกจาก port, และกลายมาเป็น inverting output ของ Oscillator amplifier. ในโหมดนี้, crystal Oscillator ถูกต่อเข้ากับพินนี้, และพินนี้ไม่สามารถถูกใช้เป็น I/O pin.
   – PCINT7: Pin Change Interrupt source 7.  PB7 pin สามารถใช้ทำเป็น external interrupt source.
ถ้า PB7 ถูกใช้เป็น clock pin, DDB7, PORTB7 and PINB7 จะอ่านได้เป็น 0 ทั้งหมด.

• XTAL1/TOSC1/PCINT6 – Port B, Bit 6
   – XTAL1: Chip clock Oscillator pin 1. ถูกใช้สำหรับทุก chip clock sources ยกเว้น internal calibrated RC Oscillator. เมื่อถูกใช้เป็น clock pin, pin นี้ไม่สามารถใช้เป็น I/O pin.
    – TOSC1: Timer Oscillator pin 1. ถูกใช้เพียงถ้า internal calibrated RC Oscillator ถูกเลือกเป็น chip clock source, และ asynchronous timer ถูกเปิดการใช้งานโดยการเซทที่ถูกต้องในรีจีสเตอร์ ASSR. เมื่อบิท AS2 ใน ASSR ถูกเซท (1) เพื่อเปิดการใช้งานการให้สัญญานนาฬิกาแบบ asynchronous ของ Timer/Counter2 โดยใช้ Crystal Oscillator, pin PB6 ถูกตัดออกจาก port, และกลายมาเป็น inverting output ของ Oscillator amplifier. ในโหมดนี้, crystal Oscillator ถูกต่อเข้ากับพินนี้, และพินนี้ไม่สามารถถูกใช้เป็น I/O pin.
    – PCINT6: Pin Change Interrupt source 6.  PB6 pin สามารถใช้ทำเป็น external interrupt source.
ถ้า PB6 ถูกใช้เป็น clock pin, DDB6, PORTB6 and PINB6 จะอ่านได้เป็น 0 ทั้งหมด.

ปล. ขา TOSC1,2 ถูกใช้เมื่อเราใช้ internal calibrated RC Oscillator เป็น system clock แล้วเราก็ต่อ 32.768kHz watch crystal เข้ากับ 2 ขานี้ เพื่อให้ clock กับ Timer/Counter2 ใช่ไหม ส่วนบิท AS2 และ EXCLK ก็ดูที่รีจีสเตอร์ ASSR ของ Timer/Counter2 หน้า 213 ดูเรื่อง clock 13.9. Timer/Counter Oscillator ที่ http://www.electoday.com/index.php?topic=15827.80 (http://www.electoday.com/index.php?topic=15827.80) ด้วย ต้องรอให้ถึง Timer/Counter2 ก่อนนะถึงจะอธิบายรายละเอียด หรือจะลองทำด้วย ไม่แน่ใจ ช่วยกันทำนะท่านๆ  :)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 05, 2019, 09:04:30 AM
• SCK/PCINT5 – Port B, Bit 5
   – SCK: Master Clock output, Slave Clock input pin สำหรับ SPI channel. เมื่อ SPI ถูก enable เป็น Slave, พินนี้ถูกกำหนดเป็นอินพุทโดยไม่คำนึงถึงการเซทของ DDB5. เมื่อ SPI ถูก enable เป็น Master, data direction ของพินนี้ถูกควบคุมโดย DDB5. เมื่อพินนี้ถูก force โดย SPI ให้เป็นอินพุท, pull-up ยังคงสามารถถูกควบคุมโดยบิท PORTB5 bit.
   – PCINT5: Pin Change Interrupt source 5. The PB5 pin สามารถใช้ทำเป็น external interrupt source.

• MISO/PCINT4 – Port B, Bit 4
   – MISO: Master Data input, Slave Data output pin สำหรับ SPI channel. เมื่อ SPI ถูก enable เป็น Master,  พินนี้ถูกกำหนดเป็นอินพุทโดยไม่คำนึงถึงการเซทของ DDB4. เมื่อ SPI ถูก enable เป็น Slave, data direction  ของพินนี้ถูกควบคุมโดย DDB4.  เมื่อพินนี้ถูก force โดย SPI ให้เป็นอินพุท, pull-up ยังคงสามารถถูกควบคุมโดยบิท PORTB4 bit.
   – PCINT4: Pin Change Interrupt source 4. The PB4 pin สามารถใช้ทำเป็น external interrupt source.

• MOSI/OC2A/PCINT3 – Port B, Bit 3
   – MOSI: SPI Master Data output, Slave Data input สำหรับ SPI channel. เมื่อ SPI ถูก enable เป็น Slave, พินนี้ถูกกำหนดเป็นอินพุทโดยไม่คำนึงถึงการเซทของ DDB3. เมื่อ SPI ถูก enable เป็น Master, data direction ของพินนี้ถูกควบคุมโดย DDB3. เมื่อพินนี้ถูก force โดย SPI ให้เป็นอินพุท, pull-up ยังคงสามารถถูกควบคุมโดยบิท PORTB3 bit..
   – OC2A: Output Compare Match output. The PB3 pin สามารถใช้ทำเป็น external output สำหรับ Timer/Counter2 Compare Match A.  PB3 pin ต้องถูกกำหนดเป็น output (DDB3 set '1') เพื่อทำหน้าที่ฟังชั่นนี้. OC2A pin ยังเป็น output pin สำหรับ PWM mode timer function อีกด้วย
   – PCINT3: Pin Change Interrupt source 3. The PB3 pin สามารถใช้ทำเป็น external interrupt source.
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 05, 2019, 10:09:19 AM
• SS/OC1B/PCINT2 – Port B, Bit 2
   – SS: Slave Select input. เมื่อ SPI ถูก enable เป็น Slave, พินนี้ถูกกำหนดเป็นอินพุทโดยไม่คำนึงถึงการเซทของ DDB2. เมื่อเป็น Slave, SPI ถูกทำให้ทำงานเมื่อพินนี้ถูกขับลงต่ำ("0").  เมื่อ SPI ถูก enable เป็น Master, data direction ของพินนี้ถูกควบคุมโดย DDB2. เมื่อพินนี้ถูก force โดย SPI ให้เป็นอินพุท, pull-up ยังคงสามารถถูกควบคุมโดยบิท PORTB2 bit...
   – OC1B: Output Compare Match output. PB2 pin  สามารถใช้ทำเป็น external output สำหรับ Timer/Counter1 Compare Match B.  PB2 pin ต้องถูกกำหนดเป็น output (DDB2 set '1') เพื่อทำหน้าที่ฟังชั่นนี้. OC1B pin ยังเป็น output pin สำหรับ PWM mode timer function อีกด้วย
   – PCINT2: Pin Change Interrupt source 2. PB2 pin สามารถใช้ทำเป็น external interrupt source.

• OC1A/PCINT1 – Port B, Bit 1
   – OC1A: Output Compare Match output. PB1 pin สามารถใช้ทำเป็น external output สำหรับ Timer/Counter1 Compare Match A.  PB1 pin ต้องถูกกำหนดเป็น output (DDB1 set '1') เพื่อทำหน้าที่ฟังชั่นนี้. OC1A pin ยังเป็น output pin สำหรับ PWM mode timer function อีกด้วย
   – PCINT1: Pin Change Interrupt source 1. The PB1 pin สามารถใช้ทำเป็น external interrupt source.

• ICP1/CLKO/PCINT0 – Port B, Bit 0
   – ICP1: Input Capture Pin. PB0 pin สามารถทำหน้าที่เป็น Input Capture Pin สำหรับ Timer/Counter1.
   – CLKO: Divided System Clock. divided system clock สามารถจ่ายออกไปบน PB0 pin. divided system clock จะถูกจ่ายออกถ้า CKOUT Fuse ถูกโปรแกรมโดยไม่คำนึงถึงการเซทของบิท PORTB0 and DDB0 มันจะจ่ายออกในระหว่างที่รีเซทอีกด้วย.
   – PCINT0: Pin Change Interrupt source 0. The PB0 pin  สามารถใช้ทำเป็น external interrupt source.

ตารางด้านล่างนี้คือความสัมพันธ์ของ alternate functions of Port B กับ overriding signals ที่แสดงในรูป Figure 18-5. SPI MSTR INPUT และ SPI SLAVE OUTPUT ประกอบกันเป็น MISO signal, ขณะที่ MOSI แบ่งออกเป็น SPI MSTR OUTPUT และ SPI SLAVE INPUT.

(https://i.imgur.com/bR1bdy6.png)
(https://i.imgur.com/iiIs4RZ.png)

Notes: 1. INTRC หมายถึงหนึ่งใน internal RC Oscillators ถูกเลือก (โดย CKSEL fuses), EXTCK หมายถึง external clock ถูกเลือก (โดย CKSEL fuses).

(https://i.imgur.com/I3j7aAA.png)

ปล. ดูในตาราง เครื่องหมายจุดนี่หมายถึงต้องรวมบิทกันใช่ไหม ดูมันจะสัมพันธ์กัน ส่วนเครื่องหมายบวกนี่ก็จะหมายถึงบิทอย่างใดอย่างหนึ่งใช่ไหม ไม่มีคำอธิบายเลย
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 05, 2019, 10:42:24 AM
นึกขึ้นมาได้ สงสัยมีพรายกระซิบบอก บางทีก็ว่านึกขึ้นมาได้เอง เราทำงานกันเป็นทีมนิลืมไป  ::) ดูเอานะว่าบิทไหนเซทบ้างที่ทำให้บิท overriding signal ทำงาน ดูจะเยอะนะ เวลาทำงานกับ alternate function ตัวไหนแล้วค่อยกลับมาดูเป็นตัวๆไปดีกว่า จำไม่ไหวหรอก นี่ขนาด 8 บิทนะ  :-X
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 05, 2019, 11:57:01 AM
ลืมขอบคุณ ขอบคุณครับ ก็ไม่ทราบว่าท่านใดช่วยกันคิดบ้าง  :) ถ้าผิดหรือมีอะไรเพิ่มเติมก็โพสต์ด้วยก็ได้ครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 06, 2019, 09:35:47 AM
18.3.2. Alternate Functions of Port C
Port C pins ที่มี alternate functions ถูกแสดงในตารางข้างล่างนี้ :

(https://i.imgur.com/yMaa5p3.png)
(https://i.imgur.com/oO6M981.png)

alternate pin configuration มีดังต่อไปนี้ :

• RESET/PCINT14 – Port C, Bit 6
   – RESET: Reset pin. เมื่อ RSTDISBL Fuse ถูกโปรแกรม, พินนี้มีฟังชั่นเป็นเป็น I/O pin ปกติ, และ mcu จะต้องพึ่งพา Power-on Reset และ Brown-out Reset เป็นแหล่ง reset ของมัน. เมื่อ RSTDISBL Fuse ไม่ถูกโปรแกรม วงจรรีเซทจะถูกต่อเข้ากับพินนี้, และพินไม่สามารถถูกใช้เป็น I/O pin.
   – PCINT14: Pin Change Interrupt source 14. The PC6 pin สามารถใช้ทำเป็น external interrupt source.
ถ้า PC6 ถูกใช้เป็น reset pin, DDC6, PORTC6 and PINC6 จะอ่านได้เป็น 0 ทั้งหมด.

• SCL/ADC5/PCINT13 – Port C, Bit 5
   – SCL: 2-wire Serial Interface Clock. เมื่อบิท TWEN ใน TWCR ถูกเซท ("1") เพื่อเปิดการใช้งาน 2-wire Serial Interface, pin PC5 ถูกตัดออกจาก port และกลายมาเป็น Serial Clock I/O pin สำหรับ 2-wire Serial Interface. ในโหมดนี้, จะมี spike filter บน pin เพื่อกดเดือยแหลม(spike)ให้สั้นกว่า 50 ns บน input signal, และพินนี้ถูกขับโดย open drain driver ที่มี slew-rate limitation.
  – PCINT13: Pin Change Interrupt source 13. The PC5 pin สามารถใช้ทำเป็น external interrupt source.
  – PC5 สามารถถูกใช้เป็น ADC input Channel 5 อีกด้วย. The ADC input channel 5 ใช้ digital power.

• SDA/ADC4/PCINT12 – Port C, Bit 4
   – SDA: 2-wire Serial Interface Data.  เมื่อบิท TWEN ใน TWCR ถูกเซท ("1") เพื่อเปิดการใช้งาน 2-wire Serial Interface, pin PC4 ถูกตัดออกจาก port และกลายมาเป็น the Serial Data I/O pin สำหรับ the 2-wire Serial Interface. ในโหมดนี้, จะมี spike filter บน pin เพื่อกดเดือยแหลม(spike)ให้สั้นกว่า 50 ns บน input signal, และพินนี้ถูกขับโดย open drain driver ที่มี slew-rate limitation.
   – PCINT12: Pin Change Interrupt source 12. The PC4 pin สามารถใช้ทำเป็น external interrupt source.
   – PC4 สามารถถูกใช้เป็น ADC input Channel 4 อีกด้วย. The ADC input channel 4 ใช้ digital power.
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 06, 2019, 10:08:36 AM
• ADC3/PCINT11 – Port C, Bit 3
   – PC3 สามารถถูกใช้เป็น ADC input Channel 3 อีกด้วย. The ADC input channel 3 ใช้ analog power.
   – PCINT11: Pin Change Interrupt source 11. The PC3 pin สามารถใช้ทำเป็น external interrupt source.

• ADC2/PCINT10 – Port C, Bit 2
   – PC2 สามารถถูกใช้เป็น ADC input Channel 2 อีกด้วย. The ADC input channel 2 ใช้ analog power.
   – PCINT10: Pin Change Interrupt source 10. The PC2 pin สามารถใช้ทำเป็น external interrupt source.

• ADC1/PCINT9 – Port C, Bit 1
   – PC1 สามารถถูกใช้เป็น ADC input Channel 1 อีกด้วย. The ADC input channel 1 ใช้ analog power.
   – PCINT9: Pin Change Interrupt source 9. The PC1 pin can สามารถใช้ทำเป็น external interrupt source.

• ADC0//CINT8 – Port C, Bit 0
   – PC0 สามารถถูกใช้เป็น ADC input Channel 0 อีกด้วย. The ADC input channel 0 ใช้ analog power.
  – PCINT8: Pin Change Interrupt source 8. The PC0 pin สามารถใช้ทำเป็น external interrupt source.

ตารางด้านล่างนี้คือความสัมพันธ์ของ alternate functions of Port C กับ overriding signals ที่แสดงในรูป Figure 18-5.

(https://i.imgur.com/MMYClD4.png)

Note: 1. เมื่อเปิดใช้งาน, 2-wire Serial Interface เปิดการใช้งาน slew-rate controls บน output pins PC4 และ PC5. สิ่งนี้ไม่แสดงในรูป. นอกจากนี้, spike filters ถูกต่อระหว่าง AIO outputs ที่แสดงในรูปพอร์ต และ digital logic ของ TWI module.

(https://i.imgur.com/KYAngIu.png)
(https://i.imgur.com/GPYXMGv.png)

ปล. ก็ไม่ยากแล้วใช่ไหมภาษาอังกฤษ พวกคู่มือส่วนมากก็จะมีรูปประโยคเป็น passive voice คือมี ประธาน + verb to be + verb ช่องที่ 3
จะเน้นที่ประธานเป็นผู้ถูกกระทำ ก็เท่านั้นเอง ส่วนคำศัพย์ก็จะไม่เยอะจำกัดๆไม่กี่ตัว ผมก็ได้แค่นี้เหมือนกัน ให้ไปท่องเว๊บหาข้อมูล ก็อ่านของเขายากเหมือนกันนะ  ;D
เดี๋ยวจบบทจะลองบอร์ดต่อกับจอ LCD16x2 หรือลองกับ GLCD5110 มีตัวอย่างของ ETT กับของหนังสือไมโครฯ AVR อยู่
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 06, 2019, 10:23:05 AM
library ที่ในหนังสือไมโครฯ AVR ให้ไว้ http://hubbard.engr.scu.edu/avr/avrlib มาอยู่นี่   https://github.com/synic/avrlib (https://github.com/synic/avrlib)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 07, 2019, 09:04:47 AM
18.3.3. Alternate Functions of Port D
Port D pins ที่มี alternate functions ถูกแสดงในตารางข้างล่างนี้ :

(https://i.imgur.com/xdCy3u7.png)
(https://i.imgur.com/lVs2WPA.png)

alternate pin configuration มีดังต่อไปนี้ :

• AIN1/OC2B/PCINT23 – Port D, Bit 7
   – AIN1: Analog Comparator1 Negative Input. กำหนด port pin เป็น input พร้อมกับปิด internal pull-up เพื่อหลีกเลี่ยง digital port function จากการรบกวนการทำงานของ Analog Comparator.(ต้องไม่ pull-up ใช่ไหม ไม่งั้นไฟจาก pull-up ก็ไหลมาเข้าพินสิ)
   – PCINT23: Pin Change Interrupt source 23. The PD7 pin สามารถใช้ทำเป็น external interrupt source.

• AIN0/OC0A/PCINT22 – Port D, Bit 6
   – AIN0: Analog Comparator0 Positive Input. กำหนด port pin เป็น input พร้อมกับปิด internal pull-up เพื่อหลีกเลี่ยง digital port function จากการรบกวนการทำงานของ Analog Comparator.(ต้องไม่ pull-up ใช่ไหม ไม่งั้นไฟจาก pull-up ก็ไหลมาเข้าพินสิ)
   – OC0A: Output Compare Match output. PD6 pin สามารถใช้ทำเป็น external output สำหรับ Timer/Counter0 Compare Match A.  PD6 pin ต้องถูกกำหนดเป็น output (DDB6 set '1') เพื่อทำหน้าที่ฟังชั่นนี้. OC0A pin ยังเป็น output pin สำหรับ PWM mode timer function อีกด้วย
   – PCINT22: Pin Change Interrupt source 22. The PD6 pin สามารถใช้ทำเป็น external interrupt source.

• T1/OC0B/PCINT21 – Port D, Bit 5
   – T1: Timer/Counter1 counter source.
   – OC0B: Output Compare Match output. PD5 pin สามารถใช้ทำเป็น external output สำหรับ Timer/Counter0 Compare Match B.  PD5 pin ต้องถูกกำหนดเป็น output (DDB5 set '1') เพื่อทำหน้าที่ฟังชั่นนี้. OC0B pin ยังเป็น output pin สำหรับ PWM mode timer function อีกด้วย
   – PCINT21: Pin Change Interrupt source 21. The PD5 pin สามารถใช้ทำเป็น external interrupt source.

• XCK/T0/PCINT20 – Port D, Bit 4
   – XCK: USART external clock.
   – T0: Timer/Counter0 counter source.
   – PCINT20: Pin Change Interrupt source 20. The PD4 pin สามารถใช้ทำเป็น external interrupt source.
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 07, 2019, 09:45:17 AM
• INT1/OC2B/PCINT19 – Port D, Bit 3
   – INT1: External Interrupt source 1. The PD3 pin สามารถใช้ทำเป็น external interrupt source.
   – OC2B: Output Compare Match output. PD3 pin สามารถใช้ทำเป็น external output สำหรับ Timer/Counter2 Compare Match B.  PD3 pin ต้องถูกกำหนดเป็น output (DDB3 set '1') เพื่อทำหน้าที่ฟังชั่นนี้. OC2B pin ยังเป็น output pin สำหรับ PWM mode timer function อีกด้วย
   – PCINT19: Pin Change Interrupt source 19. The PD3 pin สามารถใช้ทำเป็น external interrupt source.

• INT0/PCINT18 – Port D, Bit 2
   – INT0: External Interrupt source 0. The PD2 pin สามารถใช้ทำเป็น external interrupt source.
   – PCINT18: Pin Change Interrupt source 18. The PD2 pin สามารถใช้ทำเป็น external interrupt source.

• TXD/PCINT17 – Port D, Bit 1
   – TXD: Transmit Data (Data output pin สำหรับ USART). เมื่อ USART Transmitter ถูกเปิดการใช้งาน, พินนี้ถูกกำหนดเป็น output โดยไม่คำนึงถึงค่าของ DDD1.
   – PCINT17: Pin Change Interrupt source 17. The PD1 pin สามารถใช้ทำเป็น external interrupt source.

• RXD/PCINT16 – Port D, Bit 0
   – RXD: Receive Data (Data input pin สำหรับ USART). เมื่อ USART Receiver ถูกเปิดการใช้งาน พินนี้ถูกกำหนดเป็น input โดยไม่คำนึงถึงค่าของ DDD0. เมื่อ USART บังคับพินนี้ให้เป็น input, pull-up ยังคงสามารถถูกควบคุมโดยบิท PORTD0 bit.
   – PCINT16: Pin Change Interrupt source 16. The PD0 pin สามารถใช้ทำเป็น external interrupt source

ตารางด้านล่างนี้คือความสัมพันธ์ของ alternate functions of Port D กับ overriding signals ที่แสดงในรูป Figure 18-5.

(https://i.imgur.com/xWhgeEk.png)

(https://i.imgur.com/MLkOD1n.png)

ปล. เอาเรื่องจิตใจบ้างนะ จะสุขหรือทุกข์ก็อยู่ที่ใจครับ ไม่ทราบท่านใดแนะนำมา วันนี้เอา อิทธิบาท ๔ สวดท่องภาวนาบ่อยๆเข้าก็จะเป็นคุณธรมประจำใจ ไมโครฯจะทำงานได้ดี ก็เพราะมีโปรแกรมที่ดี คนเราจะดำเนินชีวิตไปได้ดี ก็ต้องมีโปรแกรมของใจ ดำเนินชีวิตไปตามสัญชาตญานเลยไม่ดี ต้องมีโปรแกรมของใจ ภาวนาธรรมะบ่อยๆเข้า ก็จะกลายมาเป็นโปรแกรม(คุณธรรม)ประจำใจ แล้วชีวิตเราก็จะดีขึ้น สุขขึ้น จิตใจของเราก็จะดีงาม        The Beautiful Mind           

http://www.84000.org/tipitaka/dic/d_item.php?i=213 (http://www.84000.org/tipitaka/dic/d_item.php?i=213)
http://www.84000.org/tipitaka/dic/ (http://www.84000.org/tipitaka/dic/)
ไม่ทราบท่านใดแนะนำมาบ้าง บางอย่างก็ผุดขึ้นมาลอยๆในใจ ช่วยกันคิดช่วยกันทำนะ ขอขอบครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 08, 2019, 08:50:01 AM
18.4.1. MCU Control Register

ก็ไปดูที่   http://www.electoday.com/index.php/topic,15922.32.html (http://www.electoday.com/index.php/topic,15922.32.html)

ส่วนรีจีสเตอร์ PORT, DDR, PIN ก็ดูเอาที่ data sheet ได้เลย จะไม่เอามาลงแล้วเพราะไม่มีการอธิบายบิท

เดี๋ยวจะลองต่อ ATmega328p กับ LCD16x2 นะ ลองเสิร์จกูเกิ้ลด้วย AVR LCD16x2 ก็จะได้นี่ ลองศึกษาและทำกันดูไปพร้อมกันนะครับ
https://www.electronicwings.com/avr-atmega/lcd16x2-interfacing-with-atmega16-32 (https://www.electronicwings.com/avr-atmega/lcd16x2-interfacing-with-atmega16-32)
https://www.electronicwings.com/avr-atmega/interfacing-lcd-16x2-in-4-bit-mode-with-atmega-16-32- (https://www.electronicwings.com/avr-atmega/interfacing-lcd-16x2-in-4-bit-mode-with-atmega-16-32-)

ปล. ดูท้องฟ้า ก้อนเมฆ ลม ฟ้า ฝน ดูแปลกไปไม่เหมือนตอนสมัยผมเป็นเด็กเลย ไม่รู้โลกมาถูกทางหรือเปล่าไม่รู้ ไปช้าๆเอาดีกว่านะ แต่ถึงอย่างไรทางด้านวัตถุนี้ เราก็สู้ประเทศเขตหนาวเขาไม่ได้อยู่ดี ก็เวลาร้อนมันอ่านหนังสือไม่ได้นี่ ส่วนมากก็ทำได้แต่ทำไร่ไถนา อยากรวยทำมากไปก็ทำลายธรรมชาติสิ่งแวดล้อมพังหมด ก็ไม่ยั่งยืนเลย ก็ต้องยั้งคิดก็ต้องศึกษาเหมือนกันหมด พ่อถึงสอนเราให้อยู่อย่างพอเพียง จะได้อยู่อย่างยั่งยืน     
https://sites.google.com/site/prachyasersthkicphxpheiyng12/-site-prachyasersthkicphxpheiyng12 (https://sites.google.com/site/prachyasersthkicphxpheiyng12/-site-prachyasersthkicphxpheiyng12) 


Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 09, 2019, 02:06:58 PM
เฮได้แล้ว Hello World กับจอ LCD16x2 ก๊อบปี้เอาของเขามานั่นแหละ ก็ขอขอบคุณเขามา ณ ที่นี้ด้วยครับ
https://www.electronicwings.com/avr-atmega/lcd16x2-interfacing-with-atmega16-32 (https://www.electronicwings.com/avr-atmega/lcd16x2-interfacing-with-atmega16-32)
มาเปลี่ยนขานิดหน่อยก็ใช้ได้ แต่ก็เจอปัญหาอยู่บ้าง สงสัยพินเสียบสายจะหลวม ทำให้ได้บ้างไม่ทำงานบ้าง ต้องคอยขยับสายเสียบอยู่เรื่อย  :P
ก็เอาขา D0-7 = PD0-7, RS = PB0, RW = PB1, EN = PB2  ก็จะเป็นแบบ 8 bit
http://www.mediafire.com/file/589iy8bcofqbt56/LCD16x2_1.rar/file (http://www.mediafire.com/file/589iy8bcofqbt56/LCD16x2_1.rar/file)

(https://i.imgur.com/wNL8AbJ.jpg)

ปล. เดี๋ยวจะทำแบบ 4 บิท ดูบ้างนะ วันนี้พอแค่นี้ก่อน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 10, 2019, 09:07:51 AM
พรายกระซิบบอก อะไรบ้างนะ ให้เปลี่ยนตัวแปร char เป็น unsigned char ทั้งหมดใช่ไหม
เวลา reset mcu แล้วจอไม่ reset ตามเหรอครับ ลองดูก็ reset ตามนะ เดี๋ยวลองอ่าน data sheet ดูอีกทีครับ
ทำเป็น header file นามสกุล __.h เอาไว้ใช้งานเป็นมาตรฐานใช่ไหม เดี๋ยวจะลองศึกษาหลายๆตัวอย่างก่อนครับ

ปล. วันนี้มีประชุมคณะสงฆ์ทั้งอำเภอที่วัดที่บ้าน ออกไมค์เสียงดังไม่มีสมาธิเลย คงต้องพักสักครู่ครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 10, 2019, 02:56:27 PM
พรายกระซิบบอกให้ไปเช็คโปรเจ็คที่ใช้ lcd16x2 ของ stm32 ที่เคยทำไว้ ก็เป็นตัวอย่างของ ETT นั่นแหละ ก็เลยไปเช็คดู พบว่าในโปรแกรมของ stm32 มีการเช็ค busy flag ด้วย โปรแกรมที่ผมทำมันเลยได้บ้างไม่ได้บ้างเพราะไม่ได้เช็ค busy flag นี่เอง ยังไงนะให้แปลดาต้าชีทของ lcd16x2 เอาที่ดาวน์โหลดของเว๊บ electronicWings เลยนะ ยังไม่รู้เรื่องเหมือนกัน งั้นเดี๋ยวจะลองแปลดู จะได้ละเอียดๆ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 10, 2019, 04:00:55 PM
ก็เอาตัวอย่างของบอร์ด ET-STM32F103RB มาทำเป็น Header file LCD16x2.h เก็บเอาไว้ใช้กับโปรแกรมอื่นๆได้ง่ายดี ลองเอาไปดูกันครับ
http://www.mediafire.com/file/tczke251kbwww5s/ET-STM32F103_LCD16X4_BMP085.rar/file (http://www.mediafire.com/file/tczke251kbwww5s/ET-STM32F103_LCD16X4_BMP085.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 11, 2019, 09:14:50 AM
เสิร์จกูเกิ้ลด้วย "อธิบาย LCD16x2" เจอนี่มา คงไม่ต้องแปลแล้วใช่ป่าว อ่านนี่ง่ายกว่า หรือว่าไง ลองอ่านกันดูก่อนครับ       
https://piyawat1989.files.wordpress.com/2017/03/618352ch05.pdf (https://piyawat1989.files.wordpress.com/2017/03/618352ch05.pdf)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 11, 2019, 11:46:58 AM
CGRAM เราคงไม่ค่อยได้ใช้ ก็จะไม่ศึกษานะเพราะเดี๋ยวจะมั่วกันไปใหญ่(ไม่รู้ด้วยว่า address มันอยู่แถวไหนด้วย  :P)
คราวนี้ก็มาแก้ไฟล์ LCD16x2.h ของ stm32 ให้มาใช้กับ AVR ของเรา ก็จะได้เป็นแบบนี้
http://www.mediafire.com/file/x5262nhpfljvf8w/LCD16X2.h/file (http://www.mediafire.com/file/x5262nhpfljvf8w/LCD16X2.h/file)

มาลงให้ดูก่อน ยังไม่ได้ลองกับบอร์ด ยังไม่แน่ใจที่จุดนี้ที่เช็ค busy flag
Quote
  if (LCD_Data_Port & (1<<LCD_D7_PIN))      // Check Busy Flag
ว่าเช็คแบบนี้ถูกต้องหรือเปล่า ถ้าบิท D7 ยังเป็น "1" อยู่แสดงว่า busy อยู่ ก็จะวนลูปอยู่จนกว่าจะเป็น "0"
ก็ดูมาจากตรงนี้ ในไฟล์ sfr_defs.h ใน C:\WinAVR-20100110\avr\include\avr ลองไล่เช็คดู ไฟล์ sfr_defs.h ก็ถูก include เข้าในไฟล์ io.h นั่นแหละ
Quote
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
ก็เอาด้านหลังมาเลยเพราะกลัวจะงงกัน
ส่วนตรงอื่นๆรู้สึกมั่นใจว่าถูกนะ ยังไม่ได้ลอง เดี๋ยวช่วงบ่ายจะออกไปธุระก่อน เลยเอามาลงให้เช็คความถูกต้องกัน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 11, 2019, 03:03:19 PM
มีผิดอยู่จุดตรงเช็ค busy flag ต้องอ่าน PIN ไม่ใช่อ่าน PORT ก็ได้แก้ใขแล้ว
อันนี้ทำเป็น 4 bit แล้ว D4-7 = PD4-7, RS = PB0, RW = PB1, EN = PB0
อันนี้ทำ header file LCD16x2.h แยกไว้ต่างหาก เอาไปใช้กับโปรเจ็คอื่นได้ง่าย ผมใช้โปรแกรม keil เปิดแล้วแก้ใข เสร็จแล้วก็ก๊อบปี้มาวางในโปรเจ็ค เวลาจะให้แสดงก็เพียงคลิกซ้ายคลิกขวาที่ header file ในหน้าต่างของ AVR Studio 4 แล้วก็ add header file เข้ามาแค่นี้ก็เสร็จ

http://www.mediafire.com/file/uwt6aygloahf1uf/LCD16x2_4bit.rar/file (http://www.mediafire.com/file/uwt6aygloahf1uf/LCD16x2_4bit.rar/file)

(https://i.imgur.com/DpwUYAp.png)

(https://i.imgur.com/IpOBlgv.jpg)

ปล. มีปัญหาจอขาวเหมือนกัน ก็มึนไปพัก แต่ก็เช็คเจอที่ตรงเช็ค busy flag ไปอ่าน PORTD ไม่ได้อ่าน PIND ก็แก้ใขแล้ว คราวนี้จะรีเซ็ทยังไงก็ไม่มีปัญหา ต้องขอขอบคุณทางทีมงาน ETT นะ ขอเอาไฟล์มาใช้นะครับ ขอบคุณครับ :D
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 12, 2019, 01:02:20 PM
พรายกระซิบบอกให้ลองทำ ADC แล้วให้มาแสดงที่หน้าจอ LCD16x2 ดู ชักลืมแล้ว ADC เดี๋ยวจะทบทวนดูก่อน ดูดาต้าชีทด้วย ตรงนี้ก็เคยทำ
http://www.electoday.com/index.php/topic,15922.8.html (http://www.electoday.com/index.php/topic,15922.8.html)
http://maxembedded.com/2011/06/the-adc-of-the-avr/ (http://maxembedded.com/2011/06/the-adc-of-the-avr/)
http://extremeelectronics.co.in/avr-tutorials/using-adc-of-avr-microcontroller/ (http://extremeelectronics.co.in/avr-tutorials/using-adc-of-avr-microcontroller/)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 12, 2019, 04:43:39 PM
ได้แล้ว วัด ADC Channel 0 (PC0) มาโชว์ที่จอ LCD16x2 ท่านใดไม่เข้าใจเรื่อง ADC ก็หาหนังสือมาอ่านก่อนนะ ยังแปลไม่ถึง แต่ไม่ตรงตัวเท่าไหร่ ในหนังสือเป็น ATmega16 ของเรา ATmega328p ก็ต้องดูรีจีสเตอร์ในดาต้าชีสประกอบด้วย
ส่วน prescaler ต้องหาร clock 16MHz ด้วย 128 จะได้ = 125KHz ถึงจะไม่เกิน ADC clock 200kHz ตามที่ดาต้าชีทระบุไว้ระหว่าง 50 - 200 kHz

http://www.mediafire.com/file/ug84naeqqimvsdm/LCD16x2_ADC_1.rar/file (http://www.mediafire.com/file/ug84naeqqimvsdm/LCD16x2_ADC_1.rar/file) 

(https://i.imgur.com/VManJ0J.jpg)

ปล. ไปเดินออกกำลังกายสักหน่อย มีปัญหาอะไรไว้พรุ่งนี้ก็ได้
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 13, 2019, 01:36:53 PM
ลองมาทำ ADC 2 channel(PC0,PC1) ดู ก็สามารถทำงานได้ครับ ลองเอาไปดูกัน

http://www.mediafire.com/file/r5emp0yj326rho0/LCD16x2_ADC_2.rar/file (http://www.mediafire.com/file/r5emp0yj326rho0/LCD16x2_ADC_2.rar/file)

(https://i.imgur.com/PcrdcwB.jpg)

ฟังชั่น sprintf ลองใช้ %0.2f แล้วบังคับตัวแปรให้เป็น (float) ให้คำนวณเป็นจุดทศนิยมเลย อย่างตัวอย่างของ stm32 ที่ให้ไปก็ทำไม่ได้ ขึ้นแสดงเป็นเครื่องหมาย ? ก็เลยต้องใช้รูปแบบเดิม %d.%d หารเอาส่วนก็เป็น %d ตัวแรก หารเอาเศษก็เป็น %d ตัวหลัง มี . คั่น ก็แสดงเป็นจุดทศนิยมได้ สงสัย ATmega328p 8 บิท มันคงจะคำนวณตัวแปร float ไม่ไหวใช่ไหม?
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 13, 2019, 03:21:45 PM
มาลองทำ ADC แบบ interrupt ดู ก็สามารถทำได้ ก็มีตัวอย่าง ADC USART อยู่ ก็เอามาโม แค่นี้ก็เสร็จ

http://www.mediafire.com/file/jhxqz2eo13ug3w1/LCD16x2_ADC_3.rar/file (http://www.mediafire.com/file/jhxqz2eo13ug3w1/LCD16x2_ADC_3.rar/file)

มีจุดที่ต้องจำคือ ตัวแปรที่ถูกใช้ในหลายส่วน ก็ต้องประกาศตัวแปรโดยใช้ volatile นำหน้า เพื่อไม่ให้คอมไพเลอร์มันบีบอัดตัดทอน
ก็มีส่วนที่แก้ใขคือ MUX ดูในดาต้าชีท ATmega328p จะมี 4 บิท ก็แก้เป็นอย่างนี้ดีกว่า ไม่แก้ก็ไม่เป็นไร
Quote
   //ch &= 0b00000111;  // AND operation with 7
   ch &= 0b00001111;  // AND operation with F
   //ADMUX = (ADMUX & 0xF8)|ch; // clears the bottom 3 bits before ORing
   ADMUX = (ADMUX & 0xF0)|ch; // clears the bottom 4 bits before ORing
header file ก็ไม่ยากนะ ก็เหมือนเอาโปรแกรมแยกส่วนไปให้ดูง่ายๆ include แล้วเหมือนกับต่อไฟล์ไปตรงจุดนั้นไป พอจบเฮดเดอร์ไฟล์ก็กลับมาไฟล์เมน เฮดเดอร์ไฟล์ LCD16x2.h ก็เดิมๆเลย สามารถก็อปไปใช้ได้ทุกโปรเจ็ค ส่วน ADC_3.h มีการเปลี่ยนแปลง
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 15, 2019, 10:21:30 AM
ซื้อ ET-BASE AVR EASY32U4 มาตอนแรกจะเอาไว้ทำ arduino สักหน่อย เก็บไว้จนฝุ่นจับ คิดไปคิดมาบอร์ดดีๆไม่ควรเก็บไว้ เลยเอามาเล่นสักหน่อย กับ AVR Studio 4 + Winavr นี่แหละ เพราะ arduino เคยเล่นอยู่หน่อยเดียว ลืมไปแล้ว หนังสือ arduino ก็ขายไปแล้ว ไป arduino ไม่ไหวแล้ว เล่น winavr อย่างเดียวดีกว่า เอาแต่โปรแกรมของ ETT เขามาเผยแผ่ ไม่เล่นบอร์ดเขาเลย ดูจะเอาเปรียบกันสักหน่อย 
http://www.ett.co.th/prod2012/AVR-EASY32U4/ET-BASE-AVR-EASY32U4.html (http://www.ett.co.th/prod2012/AVR-EASY32U4/ET-BASE-AVR-EASY32U4.html)
http://ww1.microchip.com/downloads/en/devicedoc/atmel-7766-8-bit-avr-atmega16u4-32u4_datasheet.pdf (http://ww1.microchip.com/downloads/en/devicedoc/atmel-7766-8-bit-avr-atmega16u4-32u4_datasheet.pdf)

งั้นเดี๋ยวจะเอาบอร์ด ET-BASE AVR EASY32U4 มาต่อกับจอ LCD16x4 นะ มีจอนี้อยู่ LCD16x4 ก็เหมือนกับจอ LCD16x2 นั่นแหละ แต่จะมีแถวแสดงผลเพิ่มมาอีก 2 แถวเท่านั้นเอง ก็เอาไฟล์ LCD16x2.h มาเพิ่มเติมอีกนิดหน่อย ก็ใช้ได้แล้ว
แต่ตอนนี้ขอเช็คขาของบอร์ดดูก่อน และทดลองบอร์ดดูก่อนด้วยโปรแกรมไฟกระพริบ(blink1)กับ switch debounce ดู หลอด LED กับ switch ก็มีอยู่บนบอร์ดแล้ว นี่ตัวอย่างโปรแกรมครับ

http://www.mediafire.com/file/2w8qlotnmsmxz1b/blink1%25283%2529.rar/file (http://www.mediafire.com/file/2w8qlotnmsmxz1b/blink1%25283%2529.rar/file)
http://www.mediafire.com/file/317lwxbm9r9fmi1/switch_debounce.rar/file (http://www.mediafire.com/file/317lwxbm9r9fmi1/switch_debounce.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 16, 2019, 10:57:18 AM
ตอนนี้ยังอยู่ที่บอร์ด ET-BASE AVR EASY32U4 ท่านใดบอกให้ตั้ง Fuse bits ใหม่เพราะของเก่าเป็น arduino ก็ดูในดาต้าชีสของ 32u4 บทที่ 6.3 Low Power Crystal Oscillator กับบทที่ 28.2 Fuse Bits ก็จะตั้งไว้ได้เป็นอย่างนี้(อย่าลืมกด program ไปด้วย) ลองไล่บิทดูเอานะยาวเลย

(https://i.imgur.com/h2pAo3a.png)

คราวนี้ก็มาลองทำ switch debounce 3 switch 3 หลอด LED มีสวิทช์กับหลอด LED อยู่บนบอร์ดแล้วอย่างละหนึ่ง เราก็มาเพิ่มนอกบอร์ดอีกสอง เราก็มาทำ header file switch_debounce_32u4.h แยกไว้ต่างหากเลยเพื่อจะได้ทำให้ดูง่ายและเอาไปใช้กับโปรเจ็คอื่นได้ง่าย ดูพินของบอร์ดจะเรียงตาม arduino นะจะไม่เรียงตามพอร์ต ดูออกจะสับสนหน่อย ระวังจะเสียบขาผิด มีปัญหานิดหน่อยที่โปรแกรมย่อย toggle_led(); ซึ่งต้องแยกโปรแกรมกันเลย ถึงจะทำงานได้ มีตัวอย่างให้ดูครับ

http://www.mediafire.com/file/13p0v2zrkobqrw2/switch_debounce_32u4.rar/file (http://www.mediafire.com/file/13p0v2zrkobqrw2/switch_debounce_32u4.rar/file)

(https://i.imgur.com/rKEjtRb.jpg)

ปล. ท่านใดอยากมีสมาธิดีก็หัดนั่งสมาธินะ ไม่ยากหรอกเพียงไหว้พระแล้วนั่งภาวนา หายใจเข้า-พุท หายใจออก-โธ แล้วเราก็ปรับปรุงของเราไป นานวันเข้าก็จะดีเอง เราก็จะรู้เองว่าช่วงไหนควรพักหรือเวลาไหนเหมาะที่จะทำ ตามสะดวกของเราเลย มันก็จะดีขึ้นเรื่อยๆเอง พอใจเรามีสมาธิก็จะสงบปราศจากนิวรณ์ 5 ทำให้เราอ่านหนังสือหรือคิดอะไรหรือทำอะไรได้ดีครับ
http://www.84000.org/tipitaka/dic/d_item.php?i=225 (http://www.84000.org/tipitaka/dic/d_item.php?i=225)
http://www.84000.org/tipitaka/dic/ (http://www.84000.org/tipitaka/dic/)
หลังภาวนาเราก็เจริญพรหมวิหาร 4 แล้วไหว้พระก็เป็นเสร็จ
พรหมวิหาร ๔
๑.เมตตา คือ ความรัก ความปรารถนาดี ความมีไมตรี อยากให้ผู้อื่นมีความสุข
๒.กรุณา คือ ความสงสาร อยากช่วยเหลือให้ผู้อื่นพ้นจากความทุกข์
๓.มุทิตา คือ ความเบิกบานพลอยยินดี เมื่อเห็นผู้อื่นได้รับความสุขหรือความสำเร็จ ก็พลอยเบิกบานบันเทิงใจไปด้วย
๔.อุเบกขา คือ ความมีใจเป็นกลาง มองตามความเป็นจริง จิตใจราบเรียบสม่ำเสมอ เมื่อเห็นผู้อื่นได้รับผลกรรมตามที่ตนประกอบ ไม่เอนเอียง วางตนเที่ยงธรรม

Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 16, 2019, 05:06:55 PM
พรุ่งนี้จะลอง usart นะ ไม่รู้ท่านใดเรียกร้องมา เอาก่อนที่จะแปลเลย ก็อ่านหนังสือเอาไวดี แต่จะเอาตัวอย่างของ ETT ดีกว่า ดูแล้วเข้าใจดีกว่าการใช้ stdio.h ก็จะมีรูปแบบเหมือนกันกับในเว๊บนี้ครับ https://www.electronicwings.com/avr-atmega/atmega1632-usart (https://www.electronicwings.com/avr-atmega/atmega1632-usart)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 17, 2019, 09:29:28 AM
บอร์ด ET-BASE AVR EASY32U4 มาทำ uart ก็มีไม่กี่บิท ดูดาต้าชีทด้วยนะ เอาตัวอย่างของ ETT มาโมนิดหน่อย(แก้ stop bit เป็น 1 บิทด้วย) ก็ใช้ได้กับ uart echo คือพอพิมพ์ที่คีบอร์ดก็สะท้อนกลับมาแสดงที่จอ รีจีสเตอร์จะไม่เหมือนกับ ATmega328p คือจะเป็น uart 1 RXD1, TXD1, CTS, RTS คือมี flow control ด้วย แต่โปรเจ็คนี้ไม่ได้ใช้ มีตัวอย่างให้ดูครับ

http://www.mediafire.com/file/0thkw0eeacmn9cj/uart_32u4.rar/file (http://www.mediafire.com/file/0thkw0eeacmn9cj/uart_32u4.rar/file)

(https://i.imgur.com/DjikBB0.png)

(https://i.imgur.com/zGnXwbw.png)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 17, 2019, 10:43:24 AM
มาทำกับบอร์ด ATmega328p บ้าง uart จะเป็น uart 0 ไม่มี flow control CTS, RTS ทำตามตัวอย่างของ ETT ก็ได้เหมือนกันครับ ถ้าแปลไปถึงเรื่องนี้แล้วเดี๋ยวจะลงรายละเอียดอีกที

http://www.mediafire.com/file/lzegx1dwbpmkpkk/usart2.rar/file (http://www.mediafire.com/file/lzegx1dwbpmkpkk/usart2.rar/file)

(https://i.imgur.com/lW0w2H6.jpg)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 18, 2019, 10:36:51 AM
คราวนี้มาต่อบอร์ด ET-BASE AVR EASY32U4 เข้ากับจอ LCD16x4 ก็เหมือนกับจอ LCD16x2 นั่นแหละ แต่เพิ่มแถวแสดงผลมาอีก 2 แถว โมโปรแกรม LCD16X2.h นิดหน่อย ให้แถวเพิ่มมาอีก 2 แถวก็ใช้ได้
ก็ต่อสายดังนี้(เป็นแบบ 4 bit mode)             PB4-7 = D4-7, EN = PC6, RW = PD7, RS = PE6

http://www.mediafire.com/file/azxxph85bzykp3y/LCD16x4_32u4.rar/file (http://www.mediafire.com/file/azxxph85bzykp3y/LCD16x4_32u4.rar/file)

(https://i.imgur.com/ejiqqg3.png)

เดี๋ยวจะลองทำแสดงผล adc ดู ไม่รู้ adc ของ 32u4 จะเหมือนกันกับ 328p หรือเปล่า คงต้องดูดาต้าชีทอีกที เดี๋ยวจะลองวัด 3 ชาแนล adc เลย เพิ่งจะไปซื้อโวลุ่ม 10k มาเพิ่มอีกสองตัว จอแสดงผลก็มี 4 แถว ก็แสดงได้พอดี
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 18, 2019, 02:43:00 PM
คราวนี้มาต่อบอร์ด ET-BASE AVR EASY32U4 เข้ากับจอ LCD16x4 แล้วต่อ ADC channel 7 ด้วย (บอร์ดเอา ADC channel 7 เป็นพินแรกของสล็อต ตอนแรกผมเอา ADC0 แต่เสียบสายเข้ากับพินแรก แล้วค่าไม่เปลี่ยนแปลงก็งงไปพักนึง ก็ได้แก้ไขใหม่แล้ว เอา ADC7 เลย)
-ADC ของ 32u4 จะไม่ตรงกับของ 328p เสียทีเดียว ที่ไม่ตรงกันก็มีบิท MUX ของ 32u4 จะมี 6 บิทเลย (ดูดาต้าชีทประกอบเอานะ)
-มีบิท ADHSM: ADC High Speed Mode ใช้กับการแปลงที่ไม่ถึง 10 บิท แล้วต้องการไวๆ แต่ของเราแปลงครบ 10 บิทเลย เราก็ไม่ใช้บิทนี้ (ให้เป็น "0" " ไป)
-ในโปรแกรม ADC Data Register รวมของ 328p define เป็น ADCW ส่วนของ 32u4 define เป็น ADC ซึ่งไม่เหมือนกัน แต่ define register address ตำแหน่งเดียวกัน ดูที่ไฟล์ iom328p.h กับ iom32u4.h ในโฟลเดอร์ C:\WinAVR-20100110\avr\include\avr เปรียบเทียบกันดูครับ ก็ include ต่อไปจากไฟล์ io.h ที่เรา include เอาไว้ที่หัวโปรแกรมนั่นแหละ และตอนที่เราเลือกเบอร์ตัวไมโครฯตอนสร้างโปรเจ็คใหม่ มันก็จะระบุ include file เฉพาะตัวไมโครฯเบอร์นั้นต่อไป อย่างเราเลือกเบอร์ 32u4 จากไฟล์ io.h ก็จะ include file iom32u4.h ต่อไป เพื่อใช้ในการ build ต่อไปครับ
ในไฟล์ iom328p.h จะเขียนเป็นแบบนี้
Quote
#ifndef __ASSEMBLER__
#define ADC     _SFR_MEM16(0x78)
#endif
#define ADCW    _SFR_MEM16(0x78)
ส่วนในไฟล์ iom32u4.h เขียนเป็นแบบนี้
Quote
#define ADC _SFR_MEM16(0x78)
ก็ address เดียวกัน แต่เขียนไม่เหมือนกัน ลองไล่ดูที่ไฟล์
มีตัวอย่างโปรแกรมด้วย
http://www.mediafire.com/file/xoql61qtyzkhvjk/LCD16x4_32u4_adc1.rar/file (http://www.mediafire.com/file/xoql61qtyzkhvjk/LCD16x4_32u4_adc1.rar/file)

(https://i.imgur.com/fK2kePY.jpg)

ก้อนสีดำๆนั้นไม่มีอะไรนะ คือบอร์ดมันมีที่เสียบสาย Vcc กับ GND ไม่พอ ผมเลยเอา พินเทอร์มินอล (เขาเรียกว่าอะไร) มาบัดกรีพินให้ถึงกันหมด เอามาทำเป็นที่ต่อเสียบสาย Vcc หนึ่งอันกับ GND หนึ่งอัน ใครจะเสียบแบบอื่นก็ได้นะ งงไหม  ;)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 19, 2019, 09:38:34 AM
ท่านใดแนะนำมาให้ลองต่อกับจอ GLCD5110 ดู พอดีมีไฟล์คู่มือภาษาไทยพร้อมตัวอย่างของ ETT และไฟล์โปรแกรมของ INEX ของบอร์ด stm32 จะอัฟโหลดคู่มือให้ไปศึกษาจะได้รู้ไปพร้อมกัน คงจะไม่หวงนะที่ผมจะเผยแผ่และขอขอบคุณมา ณ ที่นี้ด้วยครับ
จอ GLCD5110 มันใช้กับไฟ 3.3V เราก็จะต้องลดโวลท์ของบอร์ด 32u4 ลงมา 3.3V ด้วย ซึ่งก็สามารถทำได้ แต่ก็จะต้องลด system clock ลงมาด้วย(ดูที่กราฟคุณสมบัติหน้าไหนนะเคยเอามาลงแล้วหรือดูที่ดาต้าชีท) ลดเหลือ 8MHz ก็ใช้ได้ แต่จะไม่เปลี่ยน crystal จาก 16MHz เป็น 8MHz นะ แต่จะใช้วิธีหารด้วย clock prescaler แทน(หารสอง) ก็จะเหลือ 8MHz อย่างนี้ใช้ได้ไหมทุกท่าน

http://www.mediafire.com/file/wa03tiw08tvslzg/ET-NOKIA_LCD_5110.rar/file (http://www.mediafire.com/file/wa03tiw08tvslzg/ET-NOKIA_LCD_5110.rar/file)

แต่จอ LCD16x4 กับ ADC ยังไม่จบนะ วันนี้งดก่อนหนึ่งวัน ไม่รู้ตามกันทันไหม ไปช้าๆเอาดีกว่านะ จะได้แน่นๆรู้ลึกรู้จริงดีกว่าครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 19, 2019, 09:55:41 AM
ลองเอาตัวอย่างไปเต็มโปรเจ็คก็ได้สำหรับจอ GLCD5110 ต่อกับ ET-STM32F103RB
http://www.mediafire.com/file/7k0vnlw3c1y7kni/ET-STM32F103_NOKIA5110_HMC5883L.rar/file (http://www.mediafire.com/file/7k0vnlw3c1y7kni/ET-STM32F103_NOKIA5110_HMC5883L.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 20, 2019, 10:35:36 AM
มาลองบอร์ด ET-BASE AVR EASY32U4 ADC มาแสดงผลที่จอ LCD16x4 เอามาแสดงผล 4 channel เลย โวลุ่ม 10k ผมมีเยอะ ก็ไล่จาก adc7 ไป 6, 5, 4 ตามพินของบอร์ด ADC ของ 32u4 นี้จะมี MUX ถึง 6 บิทเลย ที่เรียงกันก็มี 5 บิท (MUX 4:0) ในรีจีสเตอร์ ADMUX ส่วน MUX บิทที่ 6(MUX 5) ไปอยู่ที่รีจีสเตอร์ ADCSRB เลย(ดูดาต้าชีทประกอบ) แต่ตอนนี้เรายังแปลไม่ถึงก็เขียนโปรแกรมง่ายๆไปก่อน ไว้แปลถึงแล้วคงจะได้ลองใช้งานให้เต็มที่ว่าทำอะไรได้บ้าง
คราวนี้มาถึงจุดนี้ของโปรแกรม
Quote
//sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*100)/Vadc);
  sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*10)/102);
ด้วยพลังของ 8 บิท ให้มันคูณด้วย 100 หารด้วย Vadc(1023) มันคงทำงานไม่ไหว ได้ค่าไม่ตรง อย่าง adc_result = 1022 แล้ว แสดงค่ามาได้ 4.35V เอง แต่พอลดทอนตัวคูณตัวหารมา(สิบ *10/102)แล้ว ค่าที่แสดงได้จะตรง อย่าง adc_result = 1022 แล้ว แสดงค่ามาได้ 4.99V ตรง
ไล่แก้ที่โปรแกรมก่อนหน้าที่ทำมาด้วยครับ ผิดพลาดอีกแล้ว  ;D
มีโปรแกรมตัวอย่าง
http://www.mediafire.com/file/6kmbptiy8dqlng4/LCD16x4_32u4_adc2.rar/file (http://www.mediafire.com/file/6kmbptiy8dqlng4/LCD16x4_32u4_adc2.rar/file)

(https://i.imgur.com/ZVezP8i.jpg)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 20, 2019, 01:55:49 PM
คราวนี้มาลองบอร์ด ET-BASE AVR EASY32U4 ADC แบบ interrupt ดูบ้าง ก็ทำงานได้เหมือนกัน
http://www.mediafire.com/file/gicbn9ri3p4lr6a/LCD16x4_32u4_adc3.rar/file (http://www.mediafire.com/file/gicbn9ri3p4lr6a/LCD16x4_32u4_adc3.rar/file)

ปล. เดี๋ยวพรุ่งนี้จะลองพิมพ์ที่ usart แล้วมาแสดงผลที่จอ LCD16x4 ดูนะ ไม่รู้มีท่านใดแนะนำมา เดี๋ยวจะลองทำดู
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 20, 2019, 04:20:40 PM
มีท่านใดแนะนำมา เอา adc มาแสดงเฉยๆ สามารถตัวแปร adc_result เพียงตัวเดียวก็ได้ พอมาลองทำตามดูก็สามารถทำได้ครับ ต้องขอขอบคุณด้วย ทำกันหลายๆแบบเป็นตัวอย่างเก็บเอาไว้ใช้ ส่วนตรงฟังชั่น sprintf หารเอาส่วนมาต่อหลังจุดทศนิยม ไม่สามารถลดทอนได้อีก มันจะมีสดุดตอนที่เราปรับโวลุ่ม(ค่า)ขึ้น แทนที่จะขึ้นจาก 4.9->4.99->5.0V กลับเป็น 4.9->4.10->5.0V ครับ ใช้รูปแบบนี้ได้ค่าถูกต้องดีแล้วครับ
Quote
sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*10)/102);

http://www.mediafire.com/file/4iqebis354cx3v7/LCD16x4_32u4_adc4.rar/file (http://www.mediafire.com/file/4iqebis354cx3v7/LCD16x4_32u4_adc4.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 20, 2019, 04:45:05 PM
อย่างนี้ก็ไม่ได้อีก ขึ้นค่าไม่ถูกต้องเหมือนกัน อย่างปรับค่าเป็น 3.05V แทนที่จะขึ้นค่าอย่างนี้ กลับแสดงได้เป็น 3.5V ไป ไม่ได้สังเกตุดูให้ดีๆ เดี๋ยวลองหาวิธีดูก่อน ไม่ทราบท่านใดแนะนำมา ต้องขอขอบคุณด้วยครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 20, 2019, 05:10:26 PM
แก้ไขได้ละ ทำแบบนี้เอา ถ้าได้ค่าต่ำกว่า 10 ก็เติม 0 เข้าไป ก็จะแสดงผลได้ถูกต้องแล้วครับ มีท่านใดแนะนำมาอีกไหมนี่ เราทำงานกันเป็นทีมนะ ต้องขอขอบคุณด้วย ช่วยแก้ไขในโปรแกรมก่อนหน้าด้วยครับ
Quote
c = (adc_result*5)/Vadc;
  d = (((adc_result*5)%Vadc)*10)/102;
  if(d<10)
    {
     //sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*100)/Vadc);
     //sprintf(LCD_buf,"%d.%d ", (adc_result*5)/Vadc,(((adc_result*5)%Vadc)*10)/102);
      sprintf(LCD_buf,"%d.0%d ", c, d);
   }
  else
   {
     sprintf(LCD_buf,"%d.%d ", c, d);
    }

http://www.mediafire.com/file/d7p33hlrvn3ug25/LCD16x4_32u4_adc4%25282%2529.rar/file (http://www.mediafire.com/file/d7p33hlrvn3ug25/LCD16x4_32u4_adc4%25282%2529.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 21, 2019, 11:51:29 AM
คราวนี้มาลองบอร์ด ET-BASE AVR EASY32U4 ADC มาแสดงที่ uart ด้วย LCD16x4 ด้วย เรามีเฮดเดอร์ไฟล์เก็บเอาไว้เยอะแล้ว ก็เป็นเรื่องง่ายที่จะนำเอามาใช้ เพียง #include file เข้าไปก็เรียกใช้งานเฮดเดอร์ไฟล์นั้นได้แล้ว มีโปรแกรมตัวอย่างครับ

http://www.mediafire.com/file/cik06hmckqfooaj/LCD16x4_32u4_adc_uart1.rar/file (http://www.mediafire.com/file/cik06hmckqfooaj/LCD16x4_32u4_adc_uart1.rar/file)

(https://i.imgur.com/3dSCAnN.jpg)

(https://i.imgur.com/YkOInld.png)

(https://i.imgur.com/DsSptmJ.png)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 21, 2019, 01:26:10 PM
เรื่องภาษาซีที่แสดงเป็น %d หรือ\f หรืออื่นๆ ก็ดูเอาที่นี่ก็ได้ ก็ขอขอบคุณคุณครูพนัสที่เขียนเว๊บให้ได้ศึกษามา ณ ที่นี้ด้วยครับ
https://sites.google.com/site/cprogramingbypanus/kar-saedng-phllaphth/printf1
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 23, 2019, 12:39:14 PM
เดี๋ยวจะลองจอ GLCD5110 ดูนะ อ่านคู่มือว่าเราสามารถตั้งเป็น 5V ก็ได้ ก็ต้องศึกษาเพิ่มเติมอีกสักหน่อย
เดี๋ยวจะลอง keypad ด้วย มี ET-MINI KEY 4x4 อยู่ ลองเส็ร์จกูเกิ้ลหาคู่มือมาดูนะ จะลองศึกษาหาวิธีก่อน เอาอันไหนก่อนดีหล่ะ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 24, 2019, 03:01:34 PM
คราวนี้มาลองบอร์ด ET-BASE AVR EASY32U4 เข้ากับจอ GLCD5110 ดูบ้าง จอ GLCD5110 ใช้กับไฟ 3.3V ใช่ไหม เราก็ต้องให้บอร์ดของเราใช้ไฟ 3.3V ด้วย แต่ว่าเมื่อดูที่กราฟคุณสมบัติ หน้านี้ http://www.electoday.com/index.php/topic,15827.96.html (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 (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

(https://i.imgur.com/X9MBw7c.png)

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

(https://i.imgur.com/FqYwjPN.jpg)

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

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

แต่ถ้าเอา font ไปจองใน flash rom แล้วจะไม่ทำงาน เดี๋ยวผมจะเช็คโปรแกรมดูก่อนว่าเป็นเพราะอะไร
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 24, 2019, 03:30:40 PM
ลองดูนี่เป็นตัวอย่างครับ https://github.com/LittleBuster/avr-nokia5110 (https://github.com/LittleBuster/avr-nokia5110) ว่าจะจอง font ไว้ที่ flash rom ยังไงถึงจะทำงานได้ เอามาให้ดูก่อนไว้พรุ่งนี้เช็คต่อ วันนี้รู้สึกจะตึงๆแล้วต้องพักสักหน่อยครับทุกท่าน
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 24, 2019, 05:38:20 PM
อธิบายโค้ดสักหน่อย GLCD5110_32u4.h โปรแกรมนี้จะไม่ใช้ spi จะใช้ขาพิน(จะแก้ให้ไปใช้ขาไหนก็ได้)มาทำให้ได้สัญญานตามรูป

(https://i.imgur.com/kpYk88y.png)

หลักๆก็อยู่ที่นี่ ส่วนจุดอื่นก็ใช้โปรแกรมของเขา ก็จนปัญญาที่จะไล่เหมือนกัน เราเอามาใช้ไม่จำเป็นต้องลงลึกอย่างนั้นก็ได้เดี๋ยวจะไม่เหลือสมองไปดูจุดอื่น  :-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 ขาเท่านั้นครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 24, 2019, 06:29:41 PM
ลองจ่ายไฟแล้ววัดกระแสของ 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 (http://www.84000.org/tipitaka/dic/d_item.php?i=156)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 27, 2019, 05:24:44 AM
คราวนี้ก็มาทำโปรแกรมให้ 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 (http://www.mediafire.com/file/16db0orq01f4ti2/GLCD5110_32u4_2.rar/file)

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

(https://i.imgur.com/djsoBLa.jpg)

Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 27, 2019, 05:51:57 AM
พรายกระซิบบอกให้แก้ตรงจุดนี้ให้เป็น 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).
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 27, 2019, 12:59:01 PM
ลองให้มันสลับตัวอักษรไปพร้อมกับไฟกระพริบดูบ้าง โดยใช้ถ่าน 2 ก้อน เดี๋ยวจะลองดูว่าทำงานได้นานแค่ไหน ตอนนี้วัดไฟได้ 3.04V ครับ
http://www.mediafire.com/file/oix3gm9uud86dge/GLCD5110_32u4_3.rar/file (http://www.mediafire.com/file/oix3gm9uud86dge/GLCD5110_32u4_3.rar/file)

https://www.youtube.com/v/Od2jlboJQ3c
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 27, 2019, 01:34:25 PM
ท่านใดเรียกร้องมาจะเอากราฟฟิค ก็ตัวอย่าง stm32 ของ Inex เขา นานแล้ว ขอขอบคุณมา ณ ที่นี้ด้วยครับ เขียน pixel, เขียนเส้นและเขียนสี่เหมี่ยม
http://www.mediafire.com/file/gb54f1odgwnda7u/GLCD5110_32u4_4.rar/file (http://www.mediafire.com/file/gb54f1odgwnda7u/GLCD5110_32u4_4.rar/file)

(https://i.imgur.com/aBfZeqJ.jpg)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 27, 2019, 02:00:37 PM
ตัวอย่างกราฟฟิคเป็นเฮดเดอร์ไฟล์ GLCD5110_32u4.h เป็น font ใน RAM นะ แก้เอาไฟล์ GLCD5110_32u4_1.h font ใน flash ROM มาใส่แทนก็ได้ จะได้ประหยัด RAM รีบไปหน่อยไม่ได้ดู ไปก๊อบปี้ตัวอย่างแรกมาใช้ ที่เป็น font ใน RAM

คราวนี้มาตัวอย่าง progress bar บ้าง ก็ไม่ยาก วันนี้ก็พอแค่นี้ก่อน คงไม่มีอะไรเพิ่มเติมแล้วนะ
http://www.mediafire.com/file/ehonrk5wavbuymg/GLCD5110_32u4_5.rar/file (http://www.mediafire.com/file/ehonrk5wavbuymg/GLCD5110_32u4_5.rar/file)

(https://i.imgur.com/uKSjy0n.jpg)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 29, 2019, 08:46:56 AM
พอดีมี crystal 8MHz เก็บไว้ในกล่องเก็บไอซี ก็เลยเอามาเปลี่ยนแทน crystal 16MHz ของบอร์ด ET-BASE AVR EASY32U4 ถาวรเลยจะดีกว่า จะได้ใช้ไฟ 3.3V ได้ ก็สามารถเปลี่ยนได้

(https://i.imgur.com/vCMa2vO.jpg)

โปรแกรมต่อๆไป จะใช้ crystal 8MHz แล้วนะ ก็แก้ง่ายๆ แค่ comment out ตัวหาร prescaler ออก ก็เป็น 8MHz แล้วเพราะเราเปลี่ยนเป็น crystal 8MHz แล้ว ส่วน fuse bits ก้คงเดิม ลองเช็ค clock บิทดู
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
       }*/

ส่วนไฟ backlight ผมก็เปลี่ยนมาใช้พิน PC7 จะได้อยู่สล็อตเดียวกันกับพินอื่น PC7 มันขับหลอด LED D13 อยู่ แต่ผมวัดกระแสดูแล้ว บอร์ดกินกระแสแค่ 9.28 mA เอง พินขับกระแสได้ถึง 40mA เลยไม่มีปัญหาอะไร ใช้พิน PC7 ขับ LED ของจอ nokia5110 เพิ่มได้ ลองแก้ใขกันดูนะ ไม่ยาก ท่านใดแนะนำมาไม่รู้

ที่โปรแกรมที่ 3 ผมเขียนโปรแกรมตกไม่ใส่  lcdUpdate(); สองจุด ลองเช็คแล้วแก้ใขดูนะครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 29, 2019, 11:05:34 AM
เปลี่ยน crystal เป็น 8MHz แล้ว ใช้ไฟ 3.3V ตัวอย่างที่ 3 ลองแก้ใขตามที่บอกไปดูนะครับ

https://www.youtube.com/v/q5omiesI8p4

Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 29, 2019, 12:36:31 PM
มีตัวอย่างที่แก้แล้วให้ดูครับ 
http://www.mediafire.com/file/szpcqhm14hstay9/GLCD5110_32u4_3%25282%2529.rar/file (http://www.mediafire.com/file/szpcqhm14hstay9/GLCD5110_32u4_3%25282%2529.rar/file)

ปล. ผมเข้าใจนะ มาคิดถึงตัวเอง เรียน ปวช.ก็กินเหล้าเล่นไพ่ ปวส.ก็กินเหล้า จบปวส.ไฟฟ้ามาก็เป็นแต่ตีกิ๊บตามบ้านจัดสรร สอบเข้าโรงปูนตรานกได้ ไม่ใช่เก่งนะ พอดีเขาเกณฑ์คนไปกันพนักงานประท้วง ก็เลยแก้วิกฤตให้เป็นโอกาศเร่งศึกษา จบปวส.มา 5ปีถึงไปสอบปริญญาตรีได้ อายุสี่สิบกว่าถึงจะอ่านภาษาอังกฤษโดยไม่ใช้ดิกได้ แต่ก็ได้แต่อ่านคู่มือไมโครฯซึ่งเป็นศัพท์เฉพาะ ศัพท์อื่นก็ไม่ค่อยได้เหมือนกัน แตก็อย่างว่านะ ประเทศเราอยู่เขตร้อน พอร้อนขึ้นมาก็อ่านหนังสือไม่ได้ ไม่มีอารมณ์อ่านหนังสือแล้ว เที่ยวเกเรไป ถึงไม่เจริญทางด้านวัตถุ(แต่ทางด้านจิตใจ พระพุทธศาสนาเราดีกว่าเขานะ ผมว่า) ไม่ได้หนาวเย็นมีหิมะตกอย่างจีน ญี่ปุ่น เกาหลี ยุโรป เมกาเขานิ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on September 30, 2019, 10:11:10 AM
ท่านใดแนะนำให้ทำเฮดเดอร์ไฟล์ของจอ LD16x4(LCD16x2 ก็เหมือนกัน ใช้ไฟล์ร่วมกันได้) ให้แยกขาพินแต่ละขาเลย จะได้แก้ขาพินง่ายๆเหมือนอย่างที่ทำกับของ nokia5110 ก็ทำตามที่เรียกร้องกันนะ ก็ง่ายๆ แยกขากันเลย จะเปลี่ยนไปใช้ขาอื่นได้ง่ายเลย ลองดู โปรแกรมนี้ยังไม่ได้ลองนะ คิดว่าไม่น่ามีอะไรผิดพลาด ลองดูกันเอาเองนะครับ

http://www.mediafire.com/file/hjof3974p5w5rw3/LCD16x4_32u4_1.rar/file (http://www.mediafire.com/file/hjof3974p5w5rw3/LCD16x4_32u4_1.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 01, 2019, 02:16:17 PM
ท่านใดให้ทดลองทำ ADC แล้วมาแสดงที่จอ LCD16x4 ดู ใช้เฮดเดอร์ไฟล์ LCD16x4_2.h ที่เขียนใหม่ สามารถที่จะแก้ขาพินได้ง่าย จะใช้ขาพินไหนเป็นขาไหนก็ได้ แล้วแต่เราจะออกแบบเลย เพียงเปลี่ยนแค่การ define เท่านั้น มีโปรแกรมตัวอย่าง ลองเอาไปตรวจเช็คแล้วลองแก้เปลี่ยนขากันได้เลย ขาไหนเป็นขาไหนได้ทั้งนั้นเลย

http://www.mediafire.com/file/93c0lygtabndm2w/LCD16x4_32u4_adc5.rar/file (http://www.mediafire.com/file/93c0lygtabndm2w/LCD16x4_32u4_adc5.rar/file)

(https://i.imgur.com/gs5ZtJV.jpg)

ของจอ nokia5110 ก็เหมือนกัน เปลี่ยนขาได้เพราะเราไม่ได้ใช้พอร์ต spi ลองเปลี่ยนกันดูนะ

ปล. ธรรมะสักข้อ ฆารวาสธรรม อ่านท่องสวดภาวนากันบ่อยๆ ก็จะกลายเป็นโปรแกรมของใจเรา เป็นคุณธรรมประจำใจของเราครับ
http://www.84000.org/tipitaka/dic/d_item.php?i=139 (http://www.84000.org/tipitaka/dic/d_item.php?i=139)
http://www.84000.org/tipitaka/dic/ (http://www.84000.org/tipitaka/dic/)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 02, 2019, 10:54:39 AM
คราวนี้ลองเอาบอร์ด ET-BASE AVR EASY32U4 มาต่อกับจอ nokia5110 อีกที แล้ววัด adc 4 channel 7,6,5,4 มาแสดงผลบนจอ ก็สามารถทำได้ มันใช้ไฟ 3.3V ก็มีการแก้ใขการคำนวณนิดหน่อย 8 บิทมันคำนวณจุดทศนิยมไม่ไหว ก็ใช้วิธีนี้ แทนที่จะคูณด้วย 3.3 ก็เป็น 33/10 แทน ดูเอานะครับ

http://www.mediafire.com/file/28kqqrl9udrglwg/GLCD5110_32u4_adc.rar/file (http://www.mediafire.com/file/28kqqrl9udrglwg/GLCD5110_32u4_adc.rar/file)

(https://i.imgur.com/x2944Dv.jpg)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 02, 2019, 12:46:15 PM
ท่านใดแจ้งมาว่า ADC clock prescaler ไม่ได้แก้ เพราะมาใช้ crystal 8MHz เพื่อให้มาใช้กับไฟ 3.3v ได้แล้ว แต่ก็ยังไม่ผิดนะเพราะตั้ง ADC clock prescaler ไว้ที่ 128 แล้ว system clock = 8MHz ก็จะได้ ADC clock = 62.5kHz ก็ยังอยู่ในย่าน 50 - 200kHz อยู่นะ ถ้าเราต้องการให้ไวๆ ก็สามารถตั้ง ADC clock prescaler = 64 ก็ได้ ก็จะได้ ADC clock = 125kHz ก็จะเร็วขึ้นครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 02, 2019, 01:20:26 PM
ท่านใดแจ้งมาว่าใช้ถ่านไฟเป็น power supply แล้วมาวัด ADC จะมีปัญหา ถ้าแรงดันไฟมันอ่อนตกลง แล้วจะวัดค่าได้ไม่ตรง ก็มีปัญหาสิ ลองคิดกันดู ผมก็จนปัญญาเหมือนกัน ถ้าใช้ ADC ก็ควรใช้ power supply ที่มีแรงดันไฟที่คงที่ก็แล้วกันครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 03, 2019, 09:41:09 AM
ท่านใดแนะนำมาให้ทำเฮดเดอร์ไฟล์ให้ lcdInit(); แยกต่างหากเหมือนอย่าง ADCInit(), LCDInit(); ก็ได้ตรวจเช็คโปรแกรมดู ก็สามารถทำได้โดย comment out (เอาออก) เอา lcdInit(); ออกที่จุดนี้
Quote
void configGlcd()
{
    if(glcd_ini==0)
    {
        glcd_ini=1;
        //lcdInit();
        lcdClear();
    }
}
แล้วที่เมนโปรแกรม เราก็ประกาศ lcdInit(); ก่อนตามตัวอย่าง จะได้เหมือนกับ ADCInit(), LCDInit();
แต่ว่าไปโปรแกรมเก่ามันก็ทำฟังชั่น lcdInit(); ครั้งเดียวนะ เพราะเมื่อ glcd_ini = 1; แล้ว มันก็จะไม่วนทำซ้ำอีก เพราะฟังชั่น if เป็นเท็จไปแล้วเมื่อ glcd_ini = 1 ลองตรวจเช็คกันดูนะว่าแบบไหนดีกว่ากัน ก็มีตัวอย่างมาให้ดู

http://www.mediafire.com/file/4xc9bpp8bge3p66/GLCD5110_32u4_6.rar/file (http://www.mediafire.com/file/4xc9bpp8bge3p66/GLCD5110_32u4_6.rar/file)
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 03, 2019, 10:27:34 AM
ตกลงใช้เฮดเดอร์ไฟล์ของตัวเก่า glcd5110_32u4_1.h นะ rebuild แล้ว code size เท่ากัน
ใส่ volatile unsigned char glcd_ini=0; ก็ code size เท่ากัน ไม่มีผลอะไร ถ้าตัวแปรถูกใช้ในหลายฟังชั่นย่อย ถึงต้องประกาศตัวแปรเป็น volatile เพื่อไม่ให้คอมไพลเลอร์มันบีบอัดตัดทอน ทำให้โปรแกรมไม่ทำงานตามที่เราเขียนโปรแกรม
ตกลงประกาศเป็น volatile เอาไว้นะเพราะประกาศอยู่ที่หัวของโปรแกรมเลย ถึงจะใช้ในฟังชั่นย่อยฟังชั่นเดียวก็ตาม แก้กันเองได้นะครับ
พรายกระซิบบอก ให้ประกาศเป็น volatile ไว้เลย ไม่งั้นมันอาจจะทำฟังชั่น lcdInit(); หลายรอบก็ได้ มีอะไรก็แนะนำกันมานะครับ ทำกันเป็นทีม จะได้รอบคอบ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: tha on October 04, 2019, 08:23:58 AM
ADC แบบ interrupt ก็เหมือนกันกับที่ทำกับจอ LCD16x4 นั่นแหละ ไม่เหมือนกันที่จอเท่านั้นเอง ลองทำกันดูนะครับ
Title: Re: Atmega328P Datasheet 18. I/O Ports 1
Post by: moneyp1000 on March 06, 2020, 08:50:11 AM
ขอบคุณครับ