AVR Codevision

การเซตค่า Fuse bits ของ AVR

โพสต์13 ต.ค. 2554 01:36โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:08 ]




การเซตค่า Fuse bits ของ AVR


การเซตค่า Fuse bits ของ AVR ในการเซตค่า Fuse bits ก็เป็นเหมือนกัน การที่เราได้ตั้งค่าในสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ ทำงานที่ความถี่ช่วงไหน ซึ่งถ้าหากเราตั้งค่าไม่ตรงกับอุปกรณ์สร้ัางสัญญาณนาฬิกาที่เราต่อเข้าไป ก็จะทำให้ ไมโครคอนโทรลเเลอร์ของเราทำงานได้ไม่ตรง หรือไม่ทำงานเลย วันนี้ เราจะมาดูตัวอย่างการตั้งค่า Fuse bits ของ Atmega48V กับ Crystal Oscillator 10 MHz กันสักหน่อยนะครับ 


อุปกรณ์ที่ใช้ทดลอง

  •  ET-AVR ISP
  •  Atmega48V
  •  Crystal 10 MHz

 ในที่นี้ ผมขอยกตัวอย่าง AVR เบอร์ Atmega48V นะครับ ก่อนอื่นเราต้องโหลด Data sheet มาก่อน นะครับ เพราะทั้งหมด ทุกอย่าง อยู่ในดาต้าชีท แทบจะทุกอย่างอยู่แล้ว แต่อาจจะมีบางจุด บางเทคนิคที่เราต้องเก็บเกี่ยวประสบการณ์กันต่อไป

ส่วนแรกที่เราต้องสนใจก่อนเลย คือ ไมโครคอนโทรลเลอร์ที่เรากำลังเล่นอยู่นี้ มันสามารถที่จะทำงานได้ตั้งแต่ Clock ที่เท่าไหร่ ถึงเท่าไหร่ ในตระกูล AVR นี้ เค้าจะใช้คำว่า Speed Grade (อยู่หน้าแรก ของดาต้าชีทเลย)


จะเห็นว่า เบอร์ที่ลงท้ายด้วยตัว V นี้ จะสามารถใส่ Crystal ได้น้อยกว่า ตัวที่ไม่มีตัว V ต่อท้ายนะครับ ซึ่งผมก็เพิ่งจะทราบหลังจากที่ซื้อไอซีมาแล้ว เหมือนกัน T_T

ในหัวข้อใหญ่ข้อที่ 8 ดาต้าชีท จะอธิบายเกี่ยวกับ System Clock and Clock Options ซึ่งหัวข้อนี้แหละ เป็นหัวข้อสำคัญที่เราจะต้องให้ความสนใจเป็นอันดับแรก ก่อนที่เราจะทำการโปรแกรม Fuse bit ลงไป ซึ่งอย่างที่บอกไปแล้ว Fuse bits เป็นสิ่งที่เราจะทำก็ต่อเมื่อ เราได้ทำการออกแบบวงจร และต้องการให้ไมโครคอนโทรลเลอร์ของเราทำงานที่สัญญาณนาฬิกา ความถี่เท่าไร ซึ่งถ้าเราไม่ได้เปลี่ยนแปลง Crystal หรือแหล่งกำเนิดสัญญาณนาฬิกาแล้ว เราก็ไม่จำเป็นที่จะต้องเปลี่ยนแปลงค่าใน Fuse bits อย่างไร พูดง่ายๆก็คือ โปรแกรมไปแล้วครั้งแรก ครั้งเดียวก็พอ ไม่จำเป็นต้องโปรแกรมใหม่ ถึงแม้เราจะแก้โค๊ดไปมา ในระหว่างการเขียนโค๊ด และทดสอบก็ตาม

ในหัวข้อ 8.2 เรื่อง Clock Source เค้าได้บอกไว้ว่า แหล่งกำเนิดของสัญญาณนาฬิกา ที่เราเลือกใช้แตกต่างกัน เราก็ต้องกำหนดค่า Register CKSEL ต่างกันด้วย จากตาราง 8.1 


แรกเริ่มเดิมที หากเราไม่ได้โปรแกรม Fuse bits ลงไปก่อน สำหรับไอซี Atmega48V นี้ เราสามารถเอาไอซีมาต่อไฟเลี้ยงให้ แล้วสามารถเขียนโปแกรม แล้วสั่งให้มันสามารถทำงานได้เลย เพียงแต่ว่า ไอซีตัวนี้ จะทำงานด้วยความถี่สัญญาณนาฬิกา 1 MHz ซึ่งเป็นค่าปกติของไอซีตัวนี้ ที่ออกมาจากโรงงานเลย เราสามารถทำการตรวจสอบกับไอซีได้ด้วยใช้โปรแกรม เช่น Ponyprog200 หรือโปรแกรมอื่นๆ ที่เครื่องโปรแกรมเราสามารถทำงานได้ ในที่นี้ ผมมีเครื่องโปรแกรม ET-AVR ISP ซึ่งสามารถใช้งานได้บนโปรแกรม PonyProg2000 ผมก็เลยทำการอ่านค่า Fuse bits ของมันออกมาก่อน ดูสิว่าจะตรงกับค่าที่โรงงานโปรแกรมมาให้เราหรือเปล่า

 ค่าจากโรงงาน

(CKSEL = "0010", SUT = "10", CKDIV8 = "0")

 

ค่าที่อ่านได้จากโปรแกรม PonyProg2000

อย่าลืมว่า ถ้าติ๊กที่ช่อง ค่าจะถูกเซตเป็น “0” และถ้าปล่อยว่างไว้ ค่าจะถูกเซตเป็น “1” นะครับ

จะเห็นได้ว่า ค่าที่ได้ตรงกัน ตามที่ดาต้าชีทได้บอกไว้ แสดงว่า ผมได้ไอซีตัวนี้ ตัวใหม่เอี่ยม ออกมาจากโรงงานแน่ๆ (หรือเปล่า)

ที่นี้ ก็มาถึงขั้นตอนสำคัญ คือ เราจะเปลี่ยนแปลงแก้ไข ค่าของ Fuse bits ให้เป็นไปตามวงจรที่เราออกแบบกันนะครับ ในที่นี้ ผมต้องการให้ Atmega48V ของผมตัวนี้ ทำงานที่สัญญาณนาฬิกา 10 MHz นะครับ โดยรับสัญญาณนาฬิกามาจาก Crystal ที่ต่อเข้ากับขา 9 และ 10 ของ Atmega48V ตัวนี้ นะครับ


กลับมาที่ ตาราง 8.1 อีกครั้ง เราจะพบว่า ถ้าหากต้องการ ให้ Atmega48V ทำงานที่ Full swing Crystal Oscillator เราต้องให้ ให้ CLKSEL บิตที่ 0  ถึง บิต ที่  3 มี ค่า เป็น 0111 หรือ 0110  แต่ ถ้ามันมี สองค่า ให้เลือกอย่างนี้ แสดงว่า ต้องมีปะไร ที่แตกต่างกันแน่นอน เราลองมาดูตางรางข้างล่างต่อ มานะครับ 


Full Swing Crystal Oscillator Mode

จากตารางที่ 8.6 เราจะเห็นว่า เป็นเรื่อง Start up time สำหรับโหมด Full Swing โหมด (ตอนนี้ ให้เราสนใจไปที่ Full Swing mode ของทุกตารางเท่านั้น ) เราจะเห็นว่า ค่าที่เราจะเลือกนี้ มันจะสอดคล้องกับค่าในตาราง 8.1 ด้วย จะเห็นว่า ที่ CLKSEL0 นั้น จะเป็นตัวบอกว่า ถ้าเราเลือกให้ Start up time ที่แตกต่างกัน ย่อมทำให้ CLKSEL0 และ SU1..0 ต่างกันด้วย ในที่นี้ ผมเลือก CLKSEL0 = 1 และ SUT1..0 = 11 ซึ่งเป็นการสั่งให้ไมโึครคอนโทรลเลอร์ เริ่มทำงาน หลังจากที่เราป้อนไฟให้กับวงจรไปแล้ว โดยให้ทำงานช้ากว่าสภาวะ Reset เป็นเวลารวม 14 clock รวมกับเวลา delay time เพิ่มอีก 65ms เหตุผลก็เพราะว่า เราต้องการให้สัญญาณนาฬิกา มีความคงที่ก่อน หลังจากที่เราป้อนไฟเลี้ยงให้วงจร 



ฉะนั้น เราจะได้ค่าในการตั้งค่า Fuse bits ให้กับ Atmega48V ให้ทำงานกับคลิสตอลภายนอก 10 MHz ด้วยค่า Fuse bits ที่ได้จากตารางต่อไปนี้

CLKSEL3 = 0 (programmed)
CLKSEL2 = 1 (unprogrammed)
CLKSEL1 = 1 (unprogrammed)
CLKSEL0 = 1 (unprogrammed)

SUT1 = 1     (unprogrammed)
SUT0 = 1     (unprogrammed)
CKDIV8 = 1  (unprogrammed)

ทำการติ๊กเครื่องหมายถูกที่ PonyProg2000 ที่ช่อง CLKSEL3 เท่านั้นนะครับ เพราะถ้าไม่ติ๊ก (Unprogrammed)  มีค่าเท่ากับ 1 
แต่ถ้าติ๊กเครื่องหมายถูก (Programmed) มีค่าเท่ากับ 0  ฉะนั้นเราจึงติ๊ก เฉพาะที่ช่อง CLKSEL3 แล้วให้ทำการกดปุ่ม Write แล้วลอง Read กลับมาดู ก็จะพบว่า เฉพาะที่ช่อง CLKSEL3 เท่านั้น ที่มีเครื่องหมายถูกอยู่ 



แล้วถ้าเราใช้โปรแกรมอื่นๆ ในการตั้งค่า Fuse bits หล่ะ ก็ตอบได้ไม่ยากครับ หลักการก็ยังคล้ายๆกัน ผมยกตัวอย่างเช่น ผมใช้โปรแกรม STK500 โปรแกรมแบบ Command line ได้ดังนี้

STK500 fuse bit programming


ซึ่งก็ให้ผลลัพธ์เหมือนกัน 


ในที่นี้ ผมได้ทำวีดีโอตัวอย่างการตั้งค่า Fuse bits ด้วยโปรแำกรม CodeVision มาให้เพื่อนๆ ได้รับชมกันด้วย ลองดูครับ 

วิดีโอ YouTube



CodeVision ตอนที่ 2

โพสต์20 เม.ย. 2554 02:09โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:07 ]



CodeVision ตอนที่ 2
Comments 
เหมือนกันกับภาษาซี CodeVision ก็มีรูปแบบการเขียนคอมเมนท์ หรือ หมายเหตุ ของโปรแกรม เพื่อเอาไว้เขียนคำอธิบายโปรแกรม หรือสิ่งที่เราต้องการสื่อสารให้ผู้ที่มาอ่านโค๊ดของเราในภายหลัง หรือเอาไว้ให้เราอ่านเอง แต่ไม่ต้องการให้ Complier หรือตัวแปรภาษาโปรแกรม สนใจในส่วนนี้ เรามีรูปแบบการเขียน Comment สองรูปแบบคือ 

รูปแบบที่ 1 /*  This is comment    */  
   หรือ 
  /* This is comment
     This is comment
     This is comment  */
สามารถที่จะเขียนคอมเมนต์ หรือหมายเหตุ บรรทัดเดียว หรือหลายบรรทัดก็ได้

และ รูปแ่บบที่ 2  // This is comment
รูปแบบนี้ เขียนได้เพียงบรรทัดเดียว 


Reversed Keywords หรือคำสงวน 
คำสงวนพวกนี้ เป็๋นคำที่เป็นคำสั่งพิเศษ ที่โปรแกรมต้องการใช้ ห้ามให้เรานำคำเหล่านี้ ไปตั้งเป็นชื่อตัวแปร ซึ่งเราจะได้พบเห็นในตอนต่อๆ ไป คำสงวนเหล่านี้ ได้แก่ 

__eeprom            enum            static
__flash                extern           struct
__interrupt          flash             switch 
__task                 float               typedef
_bool                  for                 union
break                  goto              unsigned
bit                       if                   void
bool                    inline             volatile
case                   int                  while
char                    interrupt
const                  long
continue              register
default                return
defined               short
do                      signed
double                sizeof
eeprom               sfrb
else                    sfrw


Identifiers
ในการตั้งชื่อตัวแปร ตัวใหญ่ กับตัวเล็ก ให้ความหมายที่ต่างกัน เราสามารถที่จะตั้งชื่อตัวแปรขึ้นต้นด้วย ตัวอักษา A...Z หรือ a.....z หรือใช้ตัว __ เครื่องหมาย underscore ในการนำหน้าชื่อตัวแปร ก็ได้

Data Types
ชนิดของข้อมูลแต่ละประเภท ใช้จำนวนหน่วยความจำที่แตกต่างกัน และให้ขอบเขตของค่าข้อมูลที่แตกต่างกันดังตารางด้านล่างนี้ 

 Type Size(Bits)   Range
bit  0, 1 
 bool, _Bool 0, 1
 char -128 to 127 
 unsigned char 0 to 255 
 signed char -128 to 127 
 int 16  -32768 to 32767 
 unsigned int 16  0 to 65535 
 signed int  16  -32768 to 32767 
 long int 32  -2147483648 to 2147483647 
 unsigned long int 32  0 to 4294967295 
 signed long int 32  -2147483648 to 2147483647  
 float 32  +/- 1.175e-38 to +/-3.402e38 
 double 32  +/- 1.175e-38 to +/-3.402e38 

Constants 
ค่าคงที่ เป็นค่าที่เราประกาศแล้ว  เป็นตัวเลขอาจจะเขียนอยู่ในรูปเลขฐานสิบ (เช่น 1234) 
ถ้าต้องการเขียนให้อยู่ในรูปเลขฐานสอง เราจะเขียนได้เป็น 0b นำหน้าเลขฐานสอง เช่น 0b101001 
ในเลขฐานสิบหก เราจะให้ 0x นำหน้าตัวเลขฐานสิบหก เช่น 0xff 
หรือ ถ้าเป็นเลขฐานแปด เราจะใช้ 0 นำหน้า เช่น 077 

ถ้าเราต้องการบอกให้ complier ทราบว่าเลขต่อไปนี้ เป็นข้อมูลชนิด unsigned integer เราอาจจะใส่ U ตามหลังเลข เช่น 1000U
ถ้าเป็นข้อมูลที่เป็น Long integer เราจะใช้ L ตามหลังตัวเลข เช่น 99L
สำหรับข้อมูลที่เป็น Unsigned long integer เราจะใช้ผสมกันระหว่าง U และ L เช่น 99UL
จำนวนที่เป็นเลขทศนิยม Floating point เราจะใช้ F ตามหลังเลขทศนิยม เช่น 1.234F
ค่าคงที่ ที่เป็นตัวอักขระ เราจะใช้เครื่องหมาย single quote เช่น 'a'
แต่ถ้าเป็นค่าคงที่ ทีเป็นข้อความ หรือ string เราจะใช้ double quote เช่น "Hello World"

เราสามารถประกาศตัวแปร constant ได้ทั่ง Global (เห็นทุกฟังก์ชัน) หรือแบบ Local (เห็นเฉพาะ ในฟังก์ชันที่ประกาศ) โดยใช้คำว่า cost นำหน้า ตัวแปรที่เราประกาศ ดูตัวอย่าง

/* Global constants declaration */
const char char_constant = 'a';
const int b=1234+5;
const long long_int_constant1 = 99L;
const long long_int_constant2 = 0x1000000;
const float pi = 3.14;

void main(void) {
    /* Local constant declaration */
    const long f = 2222222;
    const float x = 1.5;

}

นอกจากนี้ เราสามารถประกาศตัวแปรค่าคงที่ ที่เป็น array ได้ด้วย โดยที่ index ตัวเลขมีลำดับเป็น 0  เช่น 
const char string_constant2[] = "This is a string constant";
const int abc[3] = {1,2,3};

แต่ถ้าเราประกาศแบบนี้ จะทำให้ 2 ลำดับแรก มีค่าเป็น 1 และ 2 ลำดับที่เหลือ จะกลายเป็นเลขศูนย์ทั้งหมด
const int integer_array2[10] = {1,2};

หรือจะสร้างเป็น array หลายมิติก็ได้ 
const int multidim_array[2][3] = {{1,2,3},{4,5,6}};

ถ้าหากโปรแกรม CodeVision ถูกกำหนดที่เมนู Project|Configuration|C Complier|Code Generator|Store Global| Constant in FLASH Memory ถูกกำหนดเป็น  Enable แล้ว ต้ัวแปร global constant เมื่อถูกประกาศแล้ว (มีคำว่า const หน้าตัวแปร) จะถูกเก็บไว้ที่ FLASH Memory เมื่อถูกคอมไำพล์ แต่ถ้าที่เมนู ถูกกำหนดไว้เป็น disabled ตัวแปรที่ประกาศเป็น const จะถูกเก็บไ้ว้ที่ RAM memory และตัวแปรที่เป็น Local constant จะถูกเก็บไว้ที่ RAM memory.



คำว่า flash หรือ _flash เมื่อนำมาใช้ในการประกาศตัวแปรที่เป็นค่าคงที จะเป็นการนำค่าของตัวแปรนั้นไปเก็บไว้ที่ FLASH memory ไม่ว่าเราจะไปตั้งค่าที่ Store Global Constant in FLASH memory หรือไม่ก็ตาม
 
 

รูปแบบ 
flash <type definition> <identifier> = constant expression;
_flash <type definition> <identifier> = constant expression;

ตัวอย่าง 

flash int integer_constant = 1234+5;
flash char char_constant = 'a';
flash long long_int_constant1 = 99L;
flash long long_int_constant2 = 0x1000000;
flash int integer_array1[] = {1,2,3};
flash char string_constant1[] = "This is a string constant located in FLASH";

ในกรณีที่เราต้องส่งค่าที่เป็น string เข้าไปในฟังก์ชัน เราจะต้องส่งค่าแบบ pointer เท่านั้น ในการส่งค่าเข้าไปนี้ เราสามารถที่จะสั่งให้ทำการเก็บค่าตัวแปรที่ส่งเข้าไปไว้ที่ memory โดยใช้ keyword constant ที่เราได้กล่าวไว้แล้วได้ ตัวอย่างการนำไปใช้งาน และประสิทธิภาพ 

/* This function displays a string located in RAM. */
void display_ram(char *s){

}

/* This function displays a string located in FLASH. */
void display_ram(flash char *s){

}


/* This function displays a string located in EEPROM. */
void display_ram(eeprom char *s){

}

void main(void) {
/* ข้อความ "Hello world" จะถูกเก็บไว้ที่ FLASH memory โดย complier 
   แล้วจะทำการ copy ไปไว้ที่ส่วนเริ่มต้นของโปรแกรม นั่นคือ RAM เำื่พื่อให้
   ตัวแปร pointer เข้ามาใช้งานได้ เพื่อนำเข้าข้อมูลส่งเข้าไปใน function 
   โค๊ดตัวอย่างนี้ ให้ประสิทธิภาพของโปรแกรมค่อนข้างต่ำ เพราะว่า FLASH และ
   RAM memory ถูกนำไปใช้ทั้งคู่ */
display_ram("Hello world");

/* ข้อความ "Hello world" จะถูกเก็บไว้ที่ FLASH memory เท่านั้น 
   เป็นตัวอย่างการเขียนโปรแกรมที่ดี โค๊ดมีประสิทธิภาพดี */
display_flash("Hello world");

/* ข้อความ "Hello world" จะถูกเก็บไว้ที่ EEPROM memory เท่ีานั้น.
   โค๊ดมีประสิทธิภาพมากที่สุด เพราะ FLASH memory ไม่ได้ถูกนำมาใช้เพื่อการนี้เลย */
display_eeprom("Hello world");

while (1);
}
  

CodeVision+AVRStudio จับมือกัน Debug Mode

โพสต์12 เม.ย. 2554 05:05โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:07 ]


CodeVision+AVRStudio จับมือกัน Debug Mode


ในส่วนของการ Debug ถือเป็นเรื่องสำคัญไม่แพ้กัน ในงานของ Embedded System เพราะบางครั้ง เราจะต้องทำการเช็คการทำงานของ Register สถานะของ Port ต่างๆ ว่าเป็นไปตามที่เราเขียน หรือทำงานเป็นไปตามลำดับที่เราต้องการหรือเปล่า 

ในส่วนของโปรแกรม CodeVision ผมถือว่าเป็น IDE ตัีวหนึ่งที่เหมาะกับ AVR มากตัวหนึ่ง ใน IDE หลายๆตัว ในวันนี้ ผมพยายามที่จะทำการ Debug โค๊ดการทำงานว่า สามารถทำงานได้ตาม Step ตามที่เราต้องการหรือเปล่า ผมพยายามหา feature นี้ ที่ Codevision แต่ก็พบว่า เมื่อทำการคลิกที่เมนู 


ก็ต้องพบว่า โปรแกรม CodeVision ทำการเรียกหาโปรแกรม AVRStudio ผมเข้าใจ(เอาเอง) ว่า ตัวโปรแกรม CodeVision ที่ผมใช้อยู่นี่ มันไม่มีี debugger mode หรืออย่างไร ไม่เป็นไร ขี้เกียจหาว่า สาเหตุเพราะอะไร ก็เลยจัดการติดตั้งโปรแกรม AVRStudio ให้เลยซะ เอาแค่ เวอร์ชั่น 4 ก็แล้วกัน เพราะเวอร์ชั่น 5 ยังไม่ได้โหลดมา และมันก็ยังเป็น Beta อยู่เลย

หลังจากติดตั้งโปรแกรม AVRStudio และ WinAVR-20100110-install.exe แล้ว (ไม่แน่ใจ อันหลังจำเป็นไหม ลงไว้ก่อน ก็แล้วกัน) 
ทำการคลิกที่ Run the debugger อีกครั้ง แล้ว Browse หาไฟล์ AVRStudio.exe ให้มันซะ โปรแกรม AVRStudio จะทำการสร้างไฟล์ *.cof ให้เรา อันนี้ ผมก็ยังไม่ทราบว่ามันเอาไว้ทำไร ปล่อยมันผ่านไปก่อน 

เราจะพบกับโปรแกรม AVRStudio พร้อมกับ source code ที่เค้าเปิดไว้ให้เราแล้ว เป็นโค๊ดเดียวกันกับที่เราเขียนไว้ที่ CodeVision ครับ ให้ทำการกดปุ่ม Start Debugging หรือกด Ctrl+Alt+Shift+F5 แล้วกดปุ่ม Step into เพื่อทำการ run แบบ step สังเกตผลการเปลี่ยนแปลงที่หน้าต่าง I/O View 
 
* หมายเหตุ ในที่นี้ แนะนำให้ comment บรรทัด delay ของเราไว้ก่อนนะครับ เพราะไม่งั้นมันจะนาน เพราะต้องกระโดดไปฟังก์ชัน delay ก่อนครับ 

ในตัวอย่างนี้ ผมแสดงให้เห็นตัวอย่างโค๊ดไฟวิ่ง (แบบบ้านๆ) กับ Atmega16 ก่อนครับ 




 
 

โค๊ด Atmega16 ไฟวิ่ง 
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
ฉ Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 4/12/2011
Author  : Freeware, for evaluation and non-commercial use only
Company : 
Comments: 


Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
PORTB=0x00;
DDRB=0xFF;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;
PORTB = 0x01;
while (1)
      {
        unsigned int i; 
      // Place your code here
        for(i=0;i<7;i++)
        {
            PORTB = PORTB<<1;
            delay_ms(100);        
        };
        PORTB = 0x80;
        delay_ms(10);
        for (i=0;i<7;i++) {
            PORTB = PORTB>>1;
            delay_ms(100); 
        };
        PORTB = 0x01;

       
      }
}

CodeVisionAVR C Complier ตอนที่ 1

โพสต์15 ก.พ. 2554 00:45โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:06 ]


CodeVisionAVR C Complier ตอนที่ 1

     ในตอนนี้ เราจะมาเริ่มเข้าเนื้อหากฏทั่วๆ ไปของการเขียนภาษาซี กับ CodeVisionAVR C Complier โดยเน้นเฉพาะที่ต้องใช้กับ Complier ซึ่งเราอาจจะไม่ได้ลงไปในรายละเอียดทุกๆ ส่วนของภาษาซี แต่จะเน้นเฉพาะที่ต้องใช้บ่อยๆ ในการทำงานกับไมโครคอนโทรลเลอร์เท่านั้น ซึ่งรายละเอียดทั้งหมดของภาษาซี เพื่อนๆสามารถหาอ่านได้ตามหนังสือภาษาซี ที่มีขายอยู่ทั่วไป


 
 

The C Preprocessor 

The C Preprocessor directives ยอมอนุญาต ให้คุณกระทำการได้ดังนี้
  • นำไฟล์อื่นเข้ามาร่วมในการคอมไพล์ได้ โดยไฟล์นั้น อาจจะเป็นไฟล์ไลบรารี หรือ  ไฟล์ที่ประกาศเฉพาะแต่ function prtotype ก็ได้
  • ยอมให้เรานิยามตัวแปร Macro ซึ่งช่วยลดความยุ่งยากในการเขียนโปรแกรมมิ่ง และช่วยทำให้ไล่โค๊ดได้ง่าย
  • ช่วยให้การตั้งค่าการ Debug และช่วยปรับปรุงโค๊ดให้มีความสามารถโยกย้ายไป complier ค่ายอื่นๆได้ง่าย 
  • สามารถระบุ complier ที่ใช้ในการคอมไพล์ได้
โดย Preprocessor จะประกาศไว้ก่อน function main(void) ทุกครั้ง  Preprocessor ที่สำคัญได้แก่ 


#include ทำหน้าที่รวมไฟล์อื่นๆ เข้ามาในไฟล์ซอร์สโค๊ดของคุณ เราสามารถรวมไฟล์ด้วยคำสั่ง #include ได้มากที่สุด 300 ไฟล์ 
รูปแบบการใช้งาน 

#include <file_name>  ไฟล์ที่ถูกเรียกเข้ามาร่วมด้วยนี้ จะต้องอยู่ภายในโฟลเดอร์ include directory ของ complier 

หรือรูปแบบนี้ 

#include "file_name" ไฟล์ที่ถูกเรียกเข้ามาร่วมด้วยนี้ จะต้องอยู่ภายในโฟลเดอร์เดียวกันกับไฟล์ซอร์สโค๊ด


#define ใช้สำหรับในการกำหนด macro ( macro คือคำสั่งที่ผู้ใช้เขียนขึ้นเอง หรือคำสั่งที่ประกอบด้วยคำสั่งย่อยๆ คำสั่งซึ่งแทนด้วยสัญลักษณ์ เพียงสัญลักษณ์เดียว ) ตัวอย่างเช่น

#define ALFA 0xff    เป็นการแทน ALFA ด้วยค่าเลขฐาน 0xff 

บางครั้งเราสามารถที่จะให้ parameter กับตัวมาโคร ได้ด้วย เช่น 

#define SUM(a,b) a+b
int i = SUM(2,3);  เราจะได้ค่า i = 5 

ถ้ามีการใช้ # ร่วมกับ parameter ของมาโคร จะเป็นแปลง parameter ของมาโคร ให้กลายเป็น ตัวอักษร 

#define PRINT_MESSAGE(t) printf(#t)

เมื่อเราเรียกใช้คำสั่ง PRINT_MESSAGE(Hello) เราจะได้ผลลัพธ์เหมือนกับ printf("Hello"); 

เราสามารถทำการต่อเชื่อมตัว parameter 2 ตัวของมาโครได้ โดยใช้สัญลักษณ์ ## สองตัวติดกัน ดังตัวอย่าง

#define ALFA(a,b) a##b

char ALFA(x,y) = 1;  เราจะได้ผลลัพธ์เหมือนกับ char xy = 1;

หากว่ามาโครของเรามีจำนวนบรรทัดมากกว่า 1 บรรทัด เราสามารถขึ้นบรรทัดใหม่ได้ โดยการใช้ \ ก่อนจบบรรทัดเก่า 

เราสามารถยกเลิกการใช้มาโครได้ด้วยใช้คำสั่ง #undef ALFA เป็นการยกเลิกมาโคร ALFA 


วิธีสร้างโปรเจคด้วย CodeWizardAVR ของ CodeVision

โพสต์13 ก.พ. 2554 22:10โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:09 ]


วิธีสร้างโปรเจคด้วย CodeWizardAVR ของ CodeVision

จากตัวอย่างที่แล้ว ผมลืมแนะนำวิธีการสร้างโปรเจค CodeVision ด้วย CodeWizardAVR บทความตอนนี้ จะเป็นตอนที่เราสร้างโปรเจคง่ายๆ ด้วย CodeWizardAVR ของ โปรแกรม CodeVision ครับ 

 
 


จากตอนที่แล้ว วงจรที่แสดงให้เห็น เป็นวงจรง่ายๆ เป็นการควบคุม การเปิดหลอด LED ด้วย Push Button แต่ละตัว ควบคุมมแต่ละหลอด เมื่อพิจารณาในแง่การทำงานที่ขาของไมโครคอนโทรลเลอร์ เราสามารถพิจารณาออกเป็น 4 อินพุต 4 เอาท์พุท โดยให้ขา PIN PB0..PB3 เป็นขาอินพุต รับลอจิกจาก Push button และให้ PB4...PB7 เป็นขาเอาท์พุต สั่งให้ LED ติด  



1. ที่เมนู File .. เลือก New จะมีหน้าต่าง Dialog ให้เราเลือก Project เำำพราะเราจะสร้างโปรเจคใหม่่ไปพร้อมกับ main ไฟล์เลย 


2. หลังจากเลือกโปรเจคแล้ว จะมีหน้าต่างถามว่าเราจะสร้าง new project ด้วย CodeWizardAVR ไหม ให้เราเลือก Yes เลยครัีบ 



3. เลือกไมโครอคนโทรลเลอร์ ในที่นี้ ผมใช้ ATMEGA48V-10PU



4. จะปรากฏหน้าต่าง CodeWizardAVR ที่แท๊ป Chip ให้เราเลือกไมโครคอนโทรลเลอร์ ATMEGA48V และค่า Clock 8 MHz



5. ที่แท๊ป Ports ตั้งค่า Port B โดยทำการกดปุ่มเพื่อเปลี่ยนค่า Data Direction โดย Bit 0 คือตำแหน่งของ PB0 ไปตามลำดับ จนถึงตำแหน่ง PB7  ให้เราตั้งค่า Data Direction ตามวงจรที่เราได้ออกแบบไว้แล้ว 


6. ที่เมนู Program เราสามารถเลืิอก Preview เพื่อดูโค๊ดที่ CodeWizardAVR จะทำการ generate ออกมาให้ได้ก่อน แล้วทำการเลือก Generate, Save and Exit 

7. ทำการบันทึก File source code เป็น main.c และทำการบันทึกโปรเจค เป็น LED.cwp และ LED.prj ตามลำดับ ทั้งหมด เราจะได้ไฟล์และโปรเจคไว้ในโฟลเดอร์ที่เรากำหนด 




8. โปรแกรม CodeWizardAVR จะทำการ generate code ออกมาให้เรา ตามที่เราได้เลือกค่าไว้ และที่เหลือ ให้เราเพิ่มโค๊ดตามที่เราต้องการ 

9. ที่เมนู Project เลือก Build All ถ้าไม่มีอะไรผิดพลาดเี่ราจะได้ Hex file อยู่ที่โฟลเดอร์ Exe เพื่อนำไปเบิร์นลงไมโครคอนโทรลเลอร์อีกที 

10 ทดลองต่อวงจรตามรูป แล้วทดสอบโปรแกรม 

จะเห็นได้ว่า CodeWizardAVR มีประโยชน์มากๆ ทำให้เราสามารถพัฒนางานได้อย่างรวดเร็ว และมีความถูกต้อง ลดปัญหาความผิดพลาด นับว่าเป็นจุดเด่น ของ Complier CodeVision  อยากให้เพื่อนๆ ลองใช้งานดูครับ แล้วจะติดใจ 



/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
ฉ Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 2/14/2011
Author  : Freeware, for evaluation and non-commercial use only
Company : 
Comments: 


Chip type               : ATmega48V
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include <mega48.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0xF0;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// USART initialization
// USART disabled
UCSR0B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
      {
      // Place your code here

      }
}
 

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------//

แก้ไข เพิ่มเติม ได้เป็น 


ซอร์ซโค๊ดใหม่ หลังการแก้ไข  
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
ฉ Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 2/14/2011
Author  : Freeware, for evaluation and non-commercial use only
Company : 
Comments: 


Chip type               : ATmega48V
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include <mega48.h>
#include <delay.h>

#define LED1 PORTB.4
#define LED2 PORTB.5
#define LED3 PORTB.6
#define LED4 PORTB.7

#define SW1 PINB.0
#define SW2 PINB.1
#define SW3 PINB.2
#define SW4 PINB.3

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0xF0;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// USART initialization
// USART disabled
UCSR0B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
      {
      // Place your code here
            if(!SW1){
                delay_ms(10);
                LED1 = 1;
            }
            else if(!SW2){
                delay_ms(10);
                LED2 = 1;
            }
            else if(!SW3){
                //delay_ms(10);
                LED3 = 1;
            }
            else if(!SW4){
                //delay_ms(10);
                LED4 = 1;
            }
            else{ 
                //delay_ms(10);
                LED1 = 0;
                LED2 = 0;
                LED3 = 0;
                LED4 = 0;
            }
      }
}

ทดลองวงจรง่ายๆ กับ ATMEGA48 กับ CodeVision

โพสต์11 ก.พ. 2554 10:08โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 20 มี.ค. 2556 19:05 ]

     ก่อนจะเริ่มเข้าสู่การศึกษาโปรแกรม CodeVision เรามาลองทำการต่อวงจรตามรูป แล้วทำการสร้างโปรเจค แล้วเขียนโปรแกรมต่อไปนี้ดูครับ 
เพื่อทดสอบว่าโปรแกรม CodeVision ที่เราได้ติดตั้งไว้แล้ว สามารถที่จะเขียนได้ และสามารถที่จะคอมไพล์ ผ่าน โดยผมใช้โปรแกรม Proteus เวอร์ชั่น 7.5 SP3  ในการสร้างวงจร เป็นวงจรกดสวิทช์ 4 ตัว ควบคุมการ ON LED แ่ต่ละดวง ในที่นี้ ผมไ้ด้ทำการ zip ไฟล์แนบไว้ด้วยครับ เพี่อนๆ ลองโหลดไปทดสอบกันดูนะครับ 
 
 


วงจรการทำงาน 




การทำงานของวงจร 
ให้ SW แต่ละตัว ทำการ ON LED แต่ละดวง 


ซอร์ซโค๊ด 
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Evaluation
Automatic Program Generator
ฉ Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 2/8/2011
Author  : Freeware, for evaluation and non-commercial use only
Company : 
Comments: 


Chip type               : ATmega48
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include <mega48.h>
#include <delay.h>

#define LED1 PORTB.4
#define LED2 PORTB.5
#define LED3 PORTB.6
#define LED4 PORTB.7

#define SW1 PINB.0
#define SW2 PINB.1
#define SW3 PINB.2
#define SW4 PINB.3

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0xF0;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;

// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;

// USART initialization
// USART disabled
UCSR0B=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR1=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
      {
      // Place your code here
            if(!SW1){
                delay_ms(10);
                LED1 = 1;
            }
            else if(!SW2){
                delay_ms(10);
                LED2 = 1;
            }
            else if(!SW3){
                //delay_ms(10);
                LED3 = 1;
            }
            else if(!SW4){
                //delay_ms(10);
                LED4 = 1;
            }
            else{ 
                //delay_ms(10);
                LED1 = 0;
                LED2 = 0;
                LED3 = 0;
                LED4 = 0;
            }
      }
}

Codevision คืออะไร

โพสต์8 ก.พ. 2554 00:09โดยวิสิทธิ์ แผ้วกระโทก   [ อัปเดต 18 ม.ค. 2557 07:06 ]




Codevision คืออะไร

Codevision คือ สภาพแวดล้อมและเครื่องมือที่ช่วยในการพัฒนาการเขียนโปรแกรมด้วยภาษาซี เพื่อช่วยให้การพัฒนางานด้านเขียนโค๊ดเพื่อ Burn หรืออัดลงบนไมโครคอนโทรลเลอร์ตระกูล AVR ของบริษัท ATMEL 

       Codevisionเป็นโปรแกรมที่พัฒนาขึ้นโดยบริษัท HP Info Tech ซึ่งทำมาเพื่อจำหน่ายโปรแกรมสำหรับผู้ที่ต้องการพัฒนางานด้านไมโครคอนโทรลเลอร์ตระกูล AVR จะต้องเสียเงินซื้อ แต่ถ้าคุณต้องการทดลองใช้งาน ทางบริษัท ก็มีให้ดาวน์โหลดไปทดลองใช้งาน 

CodeVisionAVR Evaluation V2.05.0   Free, 3kbytes code size limited version

 
 

 โดยสามารถใช้งานได้ แต่จำกัดที่ขนาดของ code size อยู่ที่ 3kb 


นอกจากโปรแกรมที่ทางบริษัทได้ทำไว้ให้ดาวน์โหลดแล้ว นอกจากนี้ยังมีคู่มือ และเอกสารเริ่มต้นใช้งานโปรแกรม codevision ไว้ให้เราดาวน์โหลดไว้ด้วย 

โปรแกรม codevision เป็นโปรแกรมที่เอาไว้เขียนภาษาซี ซึ่งตัวโปรแกรม อ้างอิงตามมาตรฐาน ANSI C เพราะฉะนั้น จึงทำให้เราสามารถนำความรู้พื้นฐานของการใช้ภาษาซีของเรา สามารถนำมาใช้กับการเขียนโค๊ดภาษาซี บน codevision ได้เลย 

คุณสมบัติของโปรแกรม codevision รุ่นมาตรฐาน
  • สามารถติดตั้งได้ทั้ง windows 2000, xp ,vista และ windows 7 ทั้งแบบ 32 บิต และ 64 บิต
  • IDE ถูกออกแบบให้สามารถใช้งานได้ง่าย และเข้ากันได้กับการเขียนภาษาซี ตามมาตรฐาน ANSI C
  • ตัวโปรแกรมสามารถย่อหน้าให้เราอัตโนมัติ ไวยกรณ์ของภาษาซี และ ASSEMBLY ถูกระบายสี เพื้อการสังเกตได้ชัดเจน 
  • รองรับการประกาศตัวแปร ชนิด  bit, bool, char, int, short, long, float
  • มีไลบรารี รองรับการทำงานกับข้อมูลที่เป็น เลขทศนิยม กับไมโครคอนโทรลเลอร์ที่รองรับคำสั่งเหล่านี้ 

ไมโครคอนโทรลเลอร์ที่สามารถใช้โปรแกรม Codevision ได้แก่ 
  • ATtiny4, ATtiny5, ATtiny9, ATtiny10, ATtiny20, ATtiny40 (reduced core)
  • ATtiny13, ATtiny13A
  • ATtiny167, ATtiny87
  • ATtiny22
  • ATtiny2313, ATtiny2313A, ATtiny4313
  • ATtiny24, ATtiny44, ATtiny84
  • ATtiny25, ATtiny45, ATtiny85
  • ATtiny26, ATtiny46, ATtiny86, ATtiny166
  • ATtiny261, ATtiny461, ATtiny861
  • ATtiny43U
  • ATtiny48, ATtiny88
  • AT90S2313
  • AT90S2323, AT90S2343
  • AT90S2333, AT90S4433
  • AT90S4414, AT90S8515
  • AT90S4434, AT90S8535
  • AT90S8534
  • AT90CAN32, AT90CAN64, AT90CAN128
  • AT90PWM2, AT90PWM2B, AT90PWM3, AT90PWM3B, AT90PWM216, AT90PWM316
  • AT90USB1286, AT90USB1287, AT90USB646, AT90USB647, AT90USB162, AT90USB82
  • ATmega103
  • ATmega128, ATmega1280, ATmega1281
  • ATmega128RFA1
  • ATmega16
  • ATmega16HVA, ATmega 8HVA
  • ATmega16HVB, ATmega32HVB
  • ATmega16M1, ATmega32M1, ATmega64M1
  • ATmega16U4, ATmega32U4
  • ATmega161
  • ATmega162
  • ATmega163
  • ATmega164, ATmega164P
  • ATmega164A, ATmega164PA, ATmega324A, ATmega324PA, ATmega644A, ATmega644PA, ATmega1284, ATmega1284P
  • ATmega165
  • ATmega169, ATmega169A, ATmega169PA
  • ATmega2560, ATmega2561
  • ATmega32
  • ATmega32C1, ATmega64C1
  • ATmega32U6
  • ATmega323
  • ATmega324, ATmega324P
  • ATmega325, ATmega325P, ATmega3250, ATmega3250P
  • ATmega329, ATmega329P, ATmega3290, ATmega3290P
  • ATmega406
  • ATmega48, ATmega48P, ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P
  • ATmega603
  • ATmega64
  • ATmega640
  • ATmega644, ATmega644P
  • ATmega645, ATmega6450
  • ATmega649, ATmega6490
  • ATmega8, ATmega8U2, ATmega16U2, ATmega32U2
  • ATmega8515
  • ATmega8535
  • ATxmega128A1, ATxmega192A1, ATxmega256A1, ATxmega384A1, ATxmega64A1
  • ATxmega128A3, ATxmega192A3, ATxmega256A3, ATxmega256A3B, ATxmega64A3
  • ATxmega16A4, ATxmega32A4, ATxmega64A4, ATxmega128A4
  • ATxmega128D3, ATxmega192D3, ATxmega256D3, ATxmega64D3
  • ATxmega16D4, ATxmega32D4, ATxmega64D4, ATxmega128D4
  • FPSLIC AT94K05, AT94K10, AT94K20, AT94K40
  • AT43USB355
  • AT76C711
  • AT86RF401
  • ATA6285, ATA6286, ATA6289
นอกจากนี้ Codevision ยังได้ทำไลบรารี ไว้รองรับกับการติดต่อกับฮาร์ดแวร์และโปรโตคอลต่างๆที่จำเป็นไว้ด้วย ไม่ว่าจะเป็น 
  • Alphanumeric LCD modules, with possibility to allocate the LCD signals to any pin of any I/O port
  • Philips I²C Bus
  • National Semiconductor LM75 Temperature Sensor
  • Maxim/Dallas Semiconductor DS1621 Thermometer/Thermostat
  • Philips PCF8563 and PCF8583 Real Time Clocks
  • Maxim/Dallas Semiconductor DS1302 and DS1307 Real Time Clocks
  • Maxim/Dallas Semiconductor 1 Wire protocol
  • Maxim/Dallas Semiconductor DS1820/DS18B20/DS1822 1 Wire Temperature Sensors
  • Maxim/Dallas Semiconductor DS2430/DS2433 1 Wire EEPROMs
  • SPI
  • ATxmega TWI
  • MMC/SD/SD HC FLASH Memory Card drivers and FAT12, FAT16, FAT32 access libraries
  • Power management
  • Delays
  • BCD and Gray code conversion
ข้อดีอีกประการหนึ่งของโปรแกรม codevision นั่นก็คือ ตัวโปรแกรม สามารถสร้างโค๊ดที่จำเป็นได้อย่างอัตโนมัติ เพียงแต่ผู้ใช้ หรือโปรแกรมเมอร์ทำการคลิกเลือกค่า ผ่านหน้าต่างโปรแกรม  codevision ตัวโปรแกรมจะทำการ generate โค๊ดออกมาให้อย่างอัตโนมัติ ทำให้เราสามารถลดขั้นตอนการเขียนโปรแกรมได้ ทำให้ลดขั้นตอนการผิดพลาดในการกำหนดค่า และทำให้การพัฒนางานเป็นไปอย่างรวดเร็ว 


Built-in CodeWizardAVR Automatic Program Generator
  • External memory access setup, including the ATxmega EBI
  • Chip reset source identification
  • Input/Output Port initialization
  • External Interrupts initialization
  • Timers/Counters initialization
  • Watchdog Timer initialization
  • UART initialization and interrupt driven buffered serial communication with the following parameters: 7N2, 7E1, 7O1, 8N1, 8N2, 8E1 and 8O1
  • Analog Comparator initialization
  • ADC initialization
  • SPI Interface initialization
  • CAN Interface initialization
  • Two Wire Interface initialization
  • I²C Bus, LM75 Temperature Sensor, DS1621 Thermometer/Thermostat, PCF8563, PCF8583, DS1302 and DS1307 Real Time Clocks initialization
  • 1 Wire Bus and DS1820/DS1822 Temperature Sensors initialization
  • LCD module initialization
  • USB controller for the AT90USB646, AT90USB647, AT90USB1286 and AT90USB1287 chips

1-7 of 7