วันที่โพสต์: Apr 12, 2011 12:5:3 PM
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;
}
}