A-02. Assembly : I/O Port 1

การส่งข้อมูลออกทางพอร์ทเอาท์พุท

พอร์ท หมายถึงทางเข้าออกของข้อมูล ระหว่างโลกภายนอกกับซีพียู ตามรูปที่ 3.1 พอร์ทของ ATmega168 ประกอบด้วย

  • พอร์ท PB PB0 - PB7

  • พอร์ท PC PC0 - PC6

  • พอร์ท PD PD0 - PD7

ทั้ง 3 พอร์ทนี้สามารถกำหนดให้เป็นพอร์ทสำหรับรับข้อมูลเข้าสู่ซีพียู (Input port) และพอร์ทสำหรับส่งข้อมูลออกจากซีพียู (Output port) ด้วยการกำหนดค่ารีจิสเตอร์ DDR ประจำพอร์ท โดยถ้าให้บิตใหนเป็น 1 ขาของพอร์ทที่ตรงตำแหน่งบิตนั้น จะทำหน้าที่เป็นพอร์ทเอาท์พุท แต่ถ้าบิตใดกำหนดให้เป็น 0 ขาของพอร์ทที่ตรงตำแหน่งบิตนั้น จะทำหน้าที่เป็นพอร์ทอินพุท

รูปที่ 3.1

โปรแกรมที่ 3.1 ส่งค่าออกทางพอร์ท D

รูปที่ 3.2

  1. สร้างโปรเจคใหม่ตาท 01.การโปรแกรมภาษาแอสเซมบลีของ AVR

  2. ใช้วงจรตามรูปที่ 3.2 แล้วสร้างโปรเจค เขียนโปรแกรมเพื่อส่งข้อมูลออกทางพอร์ท PD ดังนี้

------------------------------------------------------------

.include "C:\PROGRA~1\VMLAB\include\m168def.inc"

; Define here the variables

;

.def temp =r16

; Define here Reset and interrupt vectors, if any

;

reset: rjmp start

; Program starts here after Reset

;

start:

LDI temp,0xFF ; Load 0b11111111 in R16

OUT DDRD,temp ; Configure PortD as an Output port

LDI temp,0xFC ; Load 0b11111100 in R16

OUT PORTD,temp ; out to port D

forever:

nop

nop ; Infinite loop.

nop ; Define your main system

nop ; behaviour here

rjmp forever

------------------------------------------------------------

ใช้คำสั่ง Watch และ view เพืาอดูค่าที่ ตัวแปร temp (หรือ R16) และดูค่าที่พอร์ท PD แล้ว run โปรแกรม จะได้โปรแกรมตามรูปรูปที่ 3

รูปที่ 3.3

ตามวงจรในรูปที่ 3.2 จะใช้ Control Panel ของ VMLAB เพื่อจำลองการทำงานของ LED

ด้วยการแก้ไขไฟล์โปรเจค โดยเพิ่มคำสั่งที่เขียนด้วยด้วยตัวพิมพ์สีแดงลงในไฟล์โปรเจคดังนี้

; ************************************************************

; PROJECT:

; AUTHOR:

; ************************************************************

; Micro + software running

; ------------------------------------------------------------

.MICRO "ATmega168"

.PROGRAM "asm_3.asm"

.TARGET "asm_3.hex"

.TRACE ; Activate micro trace

; Following lines are optional; if not included

; exactly these values are taken by default

; ------------------------------------------------------------

.POWER VDD=5 VSS=0 ; Power nodes

.CLOCK 1meg ; Micro clock

.STORE 250m ; Trace (micro+signals) storage time

; Micro nodes: RESET, AREF, PB0-PB7, PC0-PC6, PD0-PD7, ACO, TIM1OVF, ADC6, ADC7

; Define here the hardware around the micro

; ------------------------------------------------------------

D1 VDD D1_NODE

D2 VDD D2_NODE

D3 VDD D3_NODE

D4 VDD D4_NODE

D5 VDD D5_NODE

D6 VDD D6_NODE

D7 VDD D7_NODE

D8 VDD D8_NODE

R1 D1_NODE PD0 0.62K

R2 D2_NODE PD1 0.62K

R3 D3_NODE PD2 0.62K

R4 D4_NODE PD3 0.62K

R5 D5_NODE PD4 0.62K

R6 D6_NODE PD5 0.62K

R7 D7_NODE PD6 0.62K

R8 D8_NODE PD7 0.62K

เมื่อจะ run โปรแกรม ให้ใช้คำสั่ง view -> Control Panel จะปรากฎหน้าต่างตามรูปที่ 3.4

รูปที่ 3.4

โปรแกรมที่ 3.2 ทำไฟวิ่งออกทางพอร์ท D

ให้แก้โปรแกรมเป็นดังนี้

------------------------------------------------------------

.include "C:\PROGRA~1\VMLAB\include\m168def.inc"

; Define here the variables

;

.def temp =r16

; Define here Reset and interrupt vectors, if any

;

reset:

rjmp start

; Program starts here after Reset

;

start:

LDI temp,0xFF ; Load 0b11111111 in R16

OUT DDRD,temp ; Configure PortD as an Output port

LDI temp,0xFE

SEC ;Set Carry flg

forever:

OUT PORTD,temp

ROL temp

rjmp forever

------------------------------------------------------------

เมื่อ view -> Control Panel แล้ว run โปรแกรม จะได้เป็นไฟวิ่งขนาด 1 ดวง