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
ใช้วงจรตามรูปที่ 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 ดวง