Atmega328P Datasheet 18. I/O Ports 1

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

Previous topic - Next topic

tha

ลองไล่ไปในไฟล์ io.h ที่เรา include ไปที่หัวโปรแกรมนั่นแหละ ว่า include ไฟล์ไหนเข้าไปอีก ไล่ไปจนให้สุดซอยเลยนะ ว่ามีบิทหรือรีจีสเตอร์เหล่านี้อยู่มั๊ย ถ้าไม่มีก็เขียนโปรแกรมที่เกี่ยวกับบิทนี้ไม่ได้เพราะโปรแกรมมันจะไม่รับรู้ ก็จะ build ไม่ผ่านครับ  :o

tha

ที่ผมดู 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>

tha

เห็นแล้ว overriding signal สำหรับ alternate function ดูในตารางต่อๆมา มันคงจะเซทจากภายในว่าเราให้พินนั้นเป็น alternate function อะไร ก็ดูได้ตามตาราง แต่ก็ยังงงกับเครื่องหมายบวกกับจุดในตารางอยู่


tha

บทย่อยดังต่อไปนี้อธิบาย alternate function แบบย่อ สำหรับแต่ละ port และความสัมพันธ์ของ overriding signals กับ alternate function อ้างอิงถึง alternate function description สำหรับรายละเอียดเพิ่มเติม

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



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 ด้วย ต้องรอให้ถึง Timer/Counter2 ก่อนนะถึงจะอธิบายรายละเอียด หรือจะลองทำด้วย ไม่แน่ใจ ช่วยกันทำนะท่านๆ  :)

tha

• 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.

tha

• 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.




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



ปล. ดูในตาราง เครื่องหมายจุดนี่หมายถึงต้องรวมบิทกันใช่ไหม ดูมันจะสัมพันธ์กัน ส่วนเครื่องหมายบวกนี่ก็จะหมายถึงบิทอย่างใดอย่างหนึ่งใช่ไหม ไม่มีคำอธิบายเลย

tha

นึกขึ้นมาได้ สงสัยมีพรายกระซิบบอก บางทีก็ว่านึกขึ้นมาได้เอง เราทำงานกันเป็นทีมนิลืมไป  ::) ดูเอานะว่าบิทไหนเซทบ้างที่ทำให้บิท overriding signal ทำงาน ดูจะเยอะนะ เวลาทำงานกับ alternate function ตัวไหนแล้วค่อยกลับมาดูเป็นตัวๆไปดีกว่า จำไม่ไหวหรอก นี่ขนาด 8 บิทนะ  :-X

tha

ลืมขอบคุณ ขอบคุณครับ ก็ไม่ทราบว่าท่านใดช่วยกันคิดบ้าง  :) ถ้าผิดหรือมีอะไรเพิ่มเติมก็โพสต์ด้วยก็ได้ครับ