AVR Codevision
การเซตค่า Fuse bits ของ AVR
![]() การเซตค่า Fuse bits ของ AVR การเซตค่า Fuse bits ของ AVR ในการเซตค่า Fuse bits ก็เป็นเหมือนกัน การที่เราได้ตั้งค่าในสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ ทำงานที่ความถี่ช่วงไหน ซึ่งถ้าหากเราตั้งค่าไม่ตรงกับอุปกรณ์สร้ัางสัญญาณนาฬิกาที่เราต่อเข้าไป ก็จะทำให้ ไมโครคอนโทรลเเลอร์ของเราทำงานได้ไม่ตรง หรือไม่ทำงานเลย วันนี้ เราจะมาดูตัวอย่างการตั้งค่า Fuse bits ของ Atmega48V กับ Crystal Oscillator 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 แต่ ถ้ามันมี สองค่า ให้เลือกอย่างนี้ แสดงว่า ต้องมีปะไร ที่แตกต่างกันแน่นอน เราลองมาดูตางรางข้างล่างต่อ มานะครับ จากตารางที่ 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 เหตุผลก็เพราะว่า เราต้องการให้สัญญาณนาฬิกา มีความคงที่ก่อน หลังจากที่เราป้อนไฟเลี้ยงให้วงจร 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 เท่านั้น ที่มีเครื่องหมายถูกอยู่ |
CodeVision ตอนที่ 2
CodeVision+AVRStudio จับมือกัน Debug Mode
ในส่วนของโปรแกรม 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
CodeVisionAVR C Complier ตอนที่ 1 ในตอนนี้ เราจะมาเริ่มเข้าเนื้อหากฏทั่วๆ ไปของการเขียนภาษาซี กับ CodeVisionAVR C Complier โดยเน้นเฉพาะที่ต้องใช้กับ Complier ซึ่งเราอาจจะไม่ได้ลงไปในรายละเอียดทุกๆ ส่วนของภาษาซี แต่จะเน้นเฉพาะที่ต้องใช้บ่อยๆ ในการทำงานกับไมโครคอนโทรลเลอร์เท่านั้น ซึ่งรายละเอียดทั้งหมดของภาษาซี เพื่อนๆสามารถหาอ่านได้ตามหนังสือภาษาซี ที่มีขายอยู่ทั่วไป
The C Preprocessor
The C Preprocessor directives ยอมอนุญาต ให้คุณกระทำการได้ดังนี้
โดย 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
วิธีสร้างโปรเจคด้วย CodeWizardAVR ของ CodeVision จากตอนที่แล้ว วงจรที่แสดงให้เห็น เป็นวงจรง่ายๆ เป็นการควบคุม การเปิดหลอด LED ด้วย Push Button แต่ละตัว ควบคุมมแต่ละหลอด เมื่อพิจารณาในแง่การทำงานที่ขาของไมโครคอนโทรลเลอร์ เราสามารถพิจารณาออกเป็น 4 อินพุต 4 เอาท์พุท โดยให้ขา PIN PB0..PB3 เป็นขาอินพุต รับลอจิกจาก Push button และให้ PB4...PB7 เป็นขาเอาท์พุต สั่งให้ LED ติด
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
ก่อนจะเริ่มเข้าสู่การศึกษาโปรแกรม 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 คืออะไร
![]() Codevision คืออะไร Codevision คือ สภาพแวดล้อมและเครื่องมือที่ช่วยในการพัฒนาการเขียนโปรแกรมด้วยภาษาซี เพื่อช่วยให้การพัฒนางานด้านเขียนโค๊ดเพื่อ Burn หรืออัดลงบนไมโครคอนโทรลเลอร์ตระกูล AVR ของบริษัท ATMEL
Codevisionเป็นโปรแกรมที่พัฒนาขึ้นโดยบริษัท HP Info Tech ซึ่งทำมาเพื่อจำหน่ายโปรแกรมสำหรับผู้ที่ต้องการพัฒนางานด้านไมโครคอนโทรลเลอร์ตระกูล AVR จะต้องเสียเงินซื้อ แต่ถ้าคุณต้องการทดลองใช้งาน ทางบริษัท ก็มีให้ดาวน์โหลดไปทดลองใช้งาน
CodeVisionAVR Evaluation V2.05.0 Free, 3kbytes code size limited version
นอกจากโปรแกรมที่ทางบริษัทได้ทำไว้ให้ดาวน์โหลดแล้ว นอกจากนี้ยังมีคู่มือ และเอกสารเริ่มต้นใช้งานโปรแกรม codevision ไว้ให้เราดาวน์โหลดไว้ด้วย
โปรแกรม codevision เป็นโปรแกรมที่เอาไว้เขียนภาษาซี ซึ่งตัวโปรแกรม อ้างอิงตามมาตรฐาน ANSI C เพราะฉะนั้น จึงทำให้เราสามารถนำความรู้พื้นฐานของการใช้ภาษาซีของเรา สามารถนำมาใช้กับการเขียนโค๊ดภาษาซี บน codevision ได้เลย
คุณสมบัติของโปรแกรม codevision รุ่นมาตรฐาน
ไมโครคอนโทรลเลอร์ที่สามารถใช้โปรแกรม Codevision ได้แก่
นอกจากนี้ Codevision ยังได้ทำไลบรารี ไว้รองรับกับการติดต่อกับฮาร์ดแวร์และโปรโตคอลต่างๆที่จำเป็นไว้ด้วย ไม่ว่าจะเป็น
ข้อดีอีกประการหนึ่งของโปรแกรม codevision นั่นก็คือ ตัวโปรแกรม สามารถสร้างโค๊ดที่จำเป็นได้อย่างอัตโนมัติ เพียงแต่ผู้ใช้ หรือโปรแกรมเมอร์ทำการคลิกเลือกค่า ผ่านหน้าต่างโปรแกรม codevision ตัวโปรแกรมจะทำการ generate โค๊ดออกมาให้อย่างอัตโนมัติ ทำให้เราสามารถลดขั้นตอนการเขียนโปรแกรมได้ ทำให้ลดขั้นตอนการผิดพลาดในการกำหนดค่า และทำให้การพัฒนางานเป็นไปอย่างรวดเร็ว
Built-in CodeWizardAVR Automatic Program Generator
|