Group Blog
 
<<
มีนาคม 2554
 12345
6789101112
13141516171819
20212223242526
2728293031 
 
6 มีนาคม 2554
 
All Blogs
 
ทดสอบ Interrupt Vector ของ PIC18Fxx

ทดสอบ Interrupt Vector PIC18Fxx



วันก่อนได้มีโอกาศทดสอบ RTOS (FreeRTOS) บน PIC18 ไล่ code ในส่วนของ port file
ดูมีหลายอย่างที่น่าสนใจ โดยเฉพาะการจัดการกับการ interrupt ของตัว OS เลยเกิดความสงสัยขึ้นมาเกี่ยวกับ
interrupt vector และการ override ก็เลยเขียนโปรแกรมทดสอบให้ชัดๆ กันไปเลย ทั้งนี้เพื่อเพิ่มความชัดเจนให้ตัวเองเท่านั้น
จุดประสงค์จริงๆ เพื่อจะดูว่า low และ high priority vector มันมีการเข้าถึงที่แตกต่างกันอย่างไรใชเชิงเวลา
เพื่อให้ง่ายต่อการทดสอบ เลยใช้ Timer มาเป็นตัวกระตุ้นการ interrupt และดูค่าของ timer ว่าระหว่าง
low และ high priority vector ตัวไหนจะถูกเข้าถึงเร็วกว่ากัน ผลการทดสอบบอกว่า high priority vector
ชนะไปแค่ 1 FCY แต่เพียงเท่านี้ก็อธิบายถึงการ override และวงจรถายในของ interrupt system ของ PIC18
ได้อย่างดี และสมเหตุสมผลสำหรับ microcontroller ที่มี interrupt vector ของทุก peripheral ร่วมกันร่วมกัน
เพราะมันจะทำให้เราในฐานนะผู้ใช้งาน จัดการกับการ interrupt ได้อย่างมีประสิทธิภาพที่สูงขึ้น
นอกจากนี้ยังสามารถควบคุมการ interrupt ให้ได้ดังใจคิดมาขึ้นโดยการควบคุมผ่าน register ที่ทำหน้าที่ควบคุม
การ interrupt


/************************************************
* FILE: MAIN.C *
* CPU: PIC18F452 *
* XTAL: 20MHz *
* IDE: MPLAB IDE v8.63 *
* COMPILER: MCC18 v4.35 *
* AUTHOR: SANTI NURATCH @ SHADOWWARES.COM *
* DATE: 06 March, 2011 *
* DESCRIPTION: *
* Using Timer0's interrupt *
*************************************************/

/************************************************
* INCLUDE FILES *
*************************************************/
#include <p18f452.h>

/************************************************
* PROCESSOR CONFIGURATIONS *
*************************************************/
#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF

/************************************************
* CONSTANT DEFINITIONS *
*************************************************/
#define LOW_PRIORITY 0
#define HIG_PRIORITY 1
#define TIMER0_INTERRUPT_TYPE LOW_PRIORITY

#define XTAL 20e6
#define FCY XTAL/4.0
#define TIMER0_ISR_TIME 1e-3
#define TIMER0_PRESCALER 32.0
#define TIMER0_VALUE (unsigned char)(256.0-(TIMER0_ISR_TIME*FCY/TIMER0_PRESCALER)+0.5)

#define LED_PORT PORTD
#define LED_TRIS TRISD
#define LED_BIT 7
#define BIT_SET(x,n) (x|=(1<<n))
#define BIT_CLR(x,n) (x&=~(1<<n))
#define BIT_TOG(x,n) (x^=(1<<n))

/************************************************
* PROTOTYPE FUNCTIONS *
*************************************************/
void Timer0_ISR (void);
void Hardware_Init(void);

/************************************************
* GLOBAL VARIABLES *
*************************************************/
static unsigned int int_counter = 0;

#if TIMER0_INTERRUPT_TYPE == HIG_PRIORITY

/************************************************
* HIGH-PRIORITY INTERRUPT SERVICE RUTINE *
*************************************************/
#pragma code isr_vector = 0x08

void isr (void){
_asm GOTO Timer0_ISR _endasm
}

#else
/************************************************
* LOW-PRIORITY INTERRUPT SERVICE RUTINE *
*************************************************/
#pragma code isr_vector = 0x18

void isr (void){
_asm GOTO Timer0_ISR _endasm
}
#endif

/************************************************
* CODE SECTION *
*************************************************/
#pragma code

/************************************************
* INTERRUPT SERVICE RUTINE *
*************************************************/
#pragma interrupt Timer0_ISR

void Timer0_ISR (void){
TMR0L = TIMER0_VALUE;
INTCONbits.TMR0IF = 0;
int_counter++;
BIT_TOG(LED_PORT,LED_BIT);
}

/************************************************
* HARDWARE INITIAL FUNCTION *
*************************************************/
void Hardware_Init(void){
BIT_CLR(LED_TRIS,LED_BIT);
}

/************************************************
* TIMER0 INITIAL FUNCTION *
*************************************************/
void Timer0_Init(void){
T0CONbits.T0PS0 = 0;
T0CONbits.T0PS1 = 0;
T0CONbits.T0PS2 = 1;
T0CONbits.T08BIT = 1;
T0CONbits.T0CS = 0;
T0CONbits.PSA = 0;
INTCONbits.TMR0IF = 0;
INTCONbits.TMR0IE = 1;

//INTCON2bits.TMR0IP= 1;
//RCONbits.IPEN = 1;
//INTCONbits.PEIE = 1;

T0CONbits.TMR0ON = 1;
INTCONbits.GIE = 1; // Enables all unmasked interrupts
}

/************************************************
* MAIN FUNCTION *
*************************************************/
void main(void){
Hardware_Init();
Timer0_Init();
while(1);
}

/************************************************
* END OF FILE *
*************************************************/

http://www.shadowwares.com/forum


Create Date : 06 มีนาคม 2554
Last Update : 7 มีนาคม 2554 9:15:55 น. 0 comments
Counter : 419 Pageviews.

TheInsight
Location :


[ดู Profile ทั้งหมด]

ให้ทิปเจ้าของ Blog [?]
ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 2 คน [?]




Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.