วันศุกร์ที่ 20 พฤษภาคม พ.ศ. 2559

AVR C: Bitwise กลับค่า I/O

ในบางครั้งเรามีความจำเป็นต้องกลับค่าใน PORT ใดๆ สักพอร์ตหนึ่ง เราสามารถทำได้หลายแบบ แม้กระทั่งการกลับโดยระบุ 0xFF และ 0x00 โดยตรงก็ได้ เช่น

PORTB = 0xFF; //กำหนดให้ PORTB มีค่าเป็น 1 ทั้งหมด
PORTB = 0x00; //กำหนดให้ PORTB มีค่าเป็น 0 ทั้งหมด

วิธีการนี้ก็ง่ายๆ ตรงไปตรงมาดี แต่บางครั้งการเขียนโปรแกรมเราไม่สนใจว่าขณะนั้น PORTx มีค่าเป็นอะไร แต่เราต้องการสลับค่าภายใน จึงเปลี่ยนไปใช้คำสั่งระดับบิตในการสลับจะง่ายกว่า เช่น

PORTB = ~PORTB

คำสั่งนี้จะสั่งให้โปรแกรมสลับค่าใน PORTB จากเดิมที่เป็นให้เป็นตรงกันข้าม ถ้าเดิมเป็น 1 ให้กลับเป็น 0 ถ้าเดิมเป็น 0 ก็ให้เป็น 1 ซึ่งวิธีนี้จะง่ายและเหมาะสำหรับการกลับค่าที่ไม่เหมือนกันทั้งหมด เช่น

...
PORTB = 0b10101010;
while(1){
  PORTB = ~PORTB;
}
...

คำสั่งสองสามบรรทัดข้างบนนี้จะทำให้ PORTB มีค่าระหว่าง 0b10101010 กับ 0b01010101 นั่นเอง
ตัวอย่างการสลับค่า I/O



ตัวอย่างโปรแกรม


#define F_CPU 8000000l
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  DDRB = 0xff;
  PORTB = 0b10101010;
  while (1) 
  {
    PORTB = ~PORTB;
    _delay_ms(300);
  }

}

video

หวังว่าตัวอย่างง่ายๆ นี่จะเป็นอีกแนวทางหนึ่งในการศึกษาการเขียนโปรแกรม AVR C และเป็นฐานในการพัฒนาต่อไปในอนาคต...

ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Driver สำหรับ USB UART TTL

https://drive.google.com/open?id=0B80EqvaAGSB8dU9EMXdwQmJCLVE