Atmega328P Datasheet 18. I/O Ports 1

  • 85 Replies
  • 3510 Views
*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #48 on: September 13, 2019, 03:21:45 pm »
มาลองทำ 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 มีการเปลี่ยนแปลง

*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #49 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://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

*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #50 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 ไปด้วย) ลองไล่บิทดูเอานะยาวเลย



คราวนี้ก็มาลองทำ 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 แล้วไหว้พระก็เป็นเสร็จ
พรหมวิหาร ๔
๑.เมตตา คือ ความรัก ความปรารถนาดี ความมีไมตรี อยากให้ผู้อื่นมีความสุข
๒.กรุณา คือ ความสงสาร อยากช่วยเหลือให้ผู้อื่นพ้นจากความทุกข์
๓.มุทิตา คือ ความเบิกบานพลอยยินดี เมื่อเห็นผู้อื่นได้รับความสุขหรือความสำเร็จ ก็พลอยเบิกบานบันเทิงใจไปด้วย
๔.อุเบกขา คือ ความมีใจเป็นกลาง มองตามความเป็นจริง จิตใจราบเรียบสม่ำเสมอ เมื่อเห็นผู้อื่นได้รับผลกรรมตามที่ตนประกอบ ไม่เอนเอียง วางตนเที่ยงธรรม


*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #51 on: September 16, 2019, 05:06:55 pm »
พรุ่งนี้จะลอง usart นะ ไม่รู้ท่านใดเรียกร้องมา เอาก่อนที่จะแปลเลย ก็อ่านหนังสือเอาไวดี แต่จะเอาตัวอย่างของ ETT ดีกว่า ดูแล้วเข้าใจดีกว่าการใช้ stdio.h ก็จะมีรูปแบบเหมือนกันกับในเว๊บนี้ครับ https://www.electronicwings.com/avr-atmega/atmega1632-usart

*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #52 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




*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #53 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


*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #54 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



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

*

Offline tha

  • *****
  • 1072
    • View Profile
Re: Atmega328P Datasheet 18. I/O Ports 1
« Reply #55 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



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