VMLAB

การสร้างโปรเจคใหม่

Project-> New project

Step 1 สร้าง Directory  เพื่อเก็บ Project

Step 2 เลือกไมโคร  ATmega168

 Step 3 คลิกเลือก GNU C   สังเกตด้วยว่า GCC path อยู่ตรงตำแหน่งที่เก็บ WinAVR-20100110 หรือไม่ ถ้าไม่ให้แก้ไข

Step 4 เลือก Add this  เพิ่มไฟล์ภาษา C ใว้ใน Project

คลิก OK

ตัวอย่างไฟลโปรเจค

; ************************************************************
; PROJECT:
; AUTHOR:
; ************************************************************

; Micro + software running
; ------------------------------------------------------------
.MICRO "ATmega168"
.TOOLCHAIN "GCC"
.GCCPATH   "C:\WinAVR-20100110"
.GCCMAKE   AUTO
.TARGET    "example.hex"
.SOURCE    "example.c"

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


เปิดไฟล์โปรแกรม  แล้วแก้ไขให้เหลือเพียง

#include <avr\io.h>                 // Most basic include files
#include <avr\interrupt.h>       // Add the necessary ones
#include <avr\signal.h>           // here

// Define here the global static variables

int a;

// ***********************************************************
// Main program
//
int main(void) {
   a = ......;
   while(1) {             // Infinite loop; define here the
      a>>=....;
   }
}
แปลโปรแกรม
    Project -> Build

กำหนดค่าตัวแปรที่ต้องการดู
Debug -> Watch manager  แล้วคลิกเลือกตัวแปร  แล้วปิดหน้าต่าง

แสดงค่าตัวแปร
View -> Watch

Run Prgram ที่ละสเต็ป
    Run -> Step into หรือ F7

ให้บันทึกค่า   a = …….  ; a>>=……….;   กด F7 แล้ว เปลี่ยนไปอย่างไร .....................................................
สรุปคำสั่ง  a>>=……….;   นี้คืออะไร
-------------------------------------------------------------------------------------------------------------------------------
โปรแกรมที่ 2
เขียนโปรแกรมใหม่  ให้ใช้ชื่อว่า ex2.c
#include <avr\io.h>              // Most basic include files
#include <stdio.h>
#include <util/delay.h>

int a;
// ***********************************************************
// Main program

int main(void) {
   DDRD = 0xff;  //Port D as output
   while(1) {             // Infinite loop; define here the
      a = 1;
       for(int i = 0;i<8;i++){
           PORTD = a;
            _delay_ms(300);
            a<<=1;
        }
   }
}

แก้ไฟล์โปรเจคในบรรทัด .SOURCE    “ex2.c”

เพื่อให้ทำงานกับโปรกรมใหม่  ex2.c
แปลโปรแกรม
แสดงค่า I/O Port
    View -> I/O Port   จะได้หน้าต่าง I/O Port ให้ติกเลือกแสดงรายละเอียดพอร์ท D

 
รูปที่ 1


Run Prgram  ต่อเนื่องโดยกด  F5 แล้วสังเกตค่าที่ Port D
ให้ทำความเข้าใจโปรแกรม
จำลองการทำงานด้วย LED
จาก Ex2.c จะแสดงการทำงาน เหมือนกับต่อ LED   ตามรูปที่ 2

 
รูปที่ 2

ที่ ไฟล์โปรเจคให้เพิมคำสั่งต่อไปนี้
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

แก้ไขไฟล์ e2.c   ที่ PORTD = a;   เป็น PORTD = ~a;
แปลโปรแกรม
แสดงอุปกรณ์ LED
    View -> Control Panel
Run โปรแกรม ตรวจสอบการทำงาน
------------------------------------------------------------------------------------------------------------------------------
โปรแกรมที่ 3   จำลองสวิทช์แบบ LATCHED

เพื่อต่อสวิทช์ K1 เข้ากับ PB0 ให้เพิ่มคำสั่งลงในไฟล์โปรเจคดังนี้

R9 VDD PB0 10K
K1 PB0 VSS LATCHED

แก้ไขโปรแกรมที่ 2 เพื่อให้สามารถควบคุมทิศทางการวิ่งของ LED ได้ โดยมีแนวทางโปรแกรมดังนี้

#include <avr\io.h>              // Most basic include files
#include <stdio.h>
#include <util/delay.h>

// Define here the global static variables

unsigned int a;
#define SW0_CLOSE (PINB & 0b00000001) == 0
#define SW0_OPEN (PINB & 0b00000001)==1

// ***********************************************************
// Main program
//
int main(void) {
    DDRD = 0xff;  //Port D as output
    DDRB = 0xfe;
   while(1)
   {             // Infinite loop; define here the
       if(SW0_CLOSE)
       {

        }
        else
       {

        }       
   }




งานมอบหมาย
1.    จงเขียนโปรแกรมภาษา C ของ AVR เพื่อให้ทำงานได้เหมือนกับวงจรเกทในรูปที่ 3

 
รูปที่ 3


2.    จากวงจรในรูปที่ 4 จงเขียนโปรแกรมภาษา C เพื่อตรวจสอบว่าสวิทช์  SW1  ถึง SW4  ปิดวงจร (Close circuit)  ถ้าสวิทช์ใดปิดวงจร  ให้ LED 7-segment  ติดเป็นเลขนั้น  เช่นถ้า SW3  ปิดวงจร LED 7-segment  จะติดเป็นเลข 3  แต่ถ้าไม่มีสวิทช์ใดปิดวงจรเลยให้ LED ติดเฉพาะจุด (dot) อย่างเดียว  

 
รูปที่ 4


3.    ตามรูปที่ 5 จงเขียนโปรแกรมภาษา C เมื่อ SW1  เปิดวงจร (Open) LED 1 ดับ และ PD2 เป็นโลจิก 1   แต่ถ้า SW1 ปิดวงจร (Close) LED1 จะติด และ PD2  เป็นสัญญาณสีเหลี่ยม (Squarewave) ความถี่ 500 Hz

 
รูปที่ 5

4.    จาก State diagram ของ State Machine   ตามรูปที่ 6  จงเขียนโปรแกรมภาษา C เพื่อควบคุมการทำงาน  กำหนดให้
อินพุท x เป็นสวิทช์ต่ออยู่ที่ PB0
เอาท์พุท y1 y2 เป็น LED ต่อยู่ที่ PD0 และ PD1 ตามลำดับ

 
รูปที่ 6


5.    จงเขียนโปรแกรมภาษา C ควบคุมสัญญาณไฟจราจร  ตามรูปที่ 7 

 
รูปที่ 7


6.    จงเขียนโปรแกรมภาษา C ควบคุมเครื่องชงกาแฟอัตโนมัติ