Atmega328P Datasheet 18. I/O Ports 1

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

Previous topic - Next topic

tha

มาลองทำ ADC แบบ interrupt ดู ก็สามารถทำได้ ก็มีตัวอย่าง ADC USART อยู่ ก็เอามาโม แค่นี้ก็เสร็จ

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 มีการเปลี่ยนแปลง

tha

ซื้อ 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://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/317lwxbm9r9fmi1/switch_debounce.rar/file

tha

ตอนนี้ยังอยู่ที่บอร์ด ET-BASE AVR EASY32U4 ท่านใดบอกให้ตั้ง Fuse bits ใหม่เพราะของเก่าเป็น arduino ก็ดูในดาต้าชีสของ 32u4 บทที่ 6.3 Low Power Crystal Oscillator กับบทที่ 28.2 Fuse Bits ก็จะตั้งไว้ได้เป็นอย่างนี้(อย่าลืมกด program ไปด้วย) ลองไล่บิทดูเอานะยาวเลย



คราวนี้ก็มาลองทำ 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



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



tha

พรุ่งนี้จะลอง usart นะ ไม่รู้ท่านใดเรียกร้องมา เอาก่อนที่จะแปลเลย ก็อ่านหนังสือเอาไวดี แต่จะเอาตัวอย่างของ ETT ดีกว่า ดูแล้วเข้าใจดีกว่าการใช้ stdio.h ก็จะมีรูปแบบเหมือนกันกับในเว๊บนี้ครับ https://www.electronicwings.com/avr-atmega/atmega1632-usart

tha

บอร์ด 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




tha

มาทำกับบอร์ด ATmega328p บ้าง uart จะเป็น uart 0 ไม่มี flow control CTS, RTS ทำตามตัวอย่างของ ETT ก็ได้เหมือนกันครับ ถ้าแปลไปถึงเรื่องนี้แล้วเดี๋ยวจะลงรายละเอียดอีกที

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


tha

คราวนี้มาต่อบอร์ด 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



เดี๋ยวจะลองทำแสดงผล adc ดู ไม่รู้ adc ของ 32u4 จะเหมือนกันกับ 328p หรือเปล่า คงต้องดูดาต้าชีทอีกที เดี๋ยวจะลองวัด 3 ชาแนล adc เลย เพิ่งจะไปซื้อโวลุ่ม 10k มาเพิ่มอีกสองตัว จอแสดงผลก็มี 4 แถว ก็แสดงได้พอดี

tha

คราวนี้มาต่อบอร์ด 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



ก้อนสีดำๆนั้นไม่มีอะไรนะ คือบอร์ดมันมีที่เสียบสาย Vcc กับ GND ไม่พอ ผมเลยเอา พินเทอร์มินอล (เขาเรียกว่าอะไร) มาบัดกรีพินให้ถึงกันหมด เอามาทำเป็นที่ต่อเสียบสาย Vcc หนึ่งอันกับ GND หนึ่งอัน ใครจะเสียบแบบอื่นก็ได้นะ งงไหม  ;)