Atmega328P Datasheet 18. I/O Ports 1

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

Previous topic - Next topic

tha

ลองทำ 2 สวิทช์(PB0, PB1) 2 หลอด led(PD0, PD1) ดู ก็สามารถทำได้

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

tha

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 ตามลำดับ



ปล. ดูที่วงจรและ timing diagram จะเห็นได้ว่า clkio เปลี่ยนจาก "1" เป็น "0" ก่อน ถึงจะรับค่าพินภายนอกเข้ามากลาง synchronizer พอ clkio เปลี่ยนจาก "0" เป็น "1' อีกที ถึงจะได้ค่า PINxn แล้วถึงอ่านออกไปอีกที

tha

พิจารณาที่ 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



ปล. เวลาใช้คำสั่ง out port ไป จะอ่านกลับทันทีไม่ได้ ต้องใช้คำสั่ง NOP ดีเลย์ไว้ก่อน 1 system clock period ให้มันผ่าน synchronizer เสียก่อน ถึงจะอ่าน PINxn กลับมาได้ ถึงจะได้ค่าที่ตรง
ปล. วันนี้เย็นฝนตกก็ไปได้เรื่อยๆ ตามทันกันไหม เอาเรื่องจิตใจกันบ้างนะ มาภาวนากัน นานไปก็จะจำได้ มันก็จะ้เป็นคุณธรรมประจำใจเรา แล้วชีวิตเราก็จะดีขึ้น ไม่ต้องรอให้ใครมาสั่งจิตเสียเงินเสียทองไปเปล่าๆ                                                             
https://www.gotoknow.org/posts/247404
ผมก็ภาวนาอยู่ ก็เกิดผลดี อย่างข้อที่ 14 ทำให้ผมศึกษาอะไรละเอียดขึ้น ไม่เร่งรีบโดยที่ไม่รู้ไม่ศึกษาเหมือนแต่ก่อน


tha

ตัวอย่าง 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).



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




มีตัวอย่าง แต่จะไม่เหมือนเลย เพราะพิน PB6, PB7 ของเราถูกใช้เป็นขา crystal ไปเสียแล้ว
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 ใหม่

tha

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)

tha

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/d_item.php?i=139

tha

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



Note :  1. WRx, WPx, WDx, RRx, RPx, and RDx ใช้ร่วมกันทุก pins ภายใน port เดียวกัน clkI/O, SLEEP, and PUD ใช้ร่วมกันทุก ports สัญญานอื่นๆทั้งหมดเป็นของเฉพาะสำหรับแต่ละพิน

tha

ตารางต่อไปนี้สรุปรวมฟังชั่นของ overriding signals. ดัชนี pin และ port จากรูป Figure 14-5 จะไม่แสดงในตารางนี้ overriding signals ถูกสร้างขึ้นภายในโมดูลที่มี alternate function

.

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