vasa
03-05-2010, 22:44
عرض سلام و ادب خوبید همگی
آقا من این کدو نوشتم واسه راه اندازی اینتراپت تایمر نوشتم ولی کار نمیکنه مشکل چیه؟؟؟
#include<AT91SAM7X256.H>
#include<delay.h>
__irq void T0_handler(void)
//* Begin
{
if ( (*AT91C_PIOB_ODSR&0x00080000)==0x00000000)
*AT91C_PIOB_ODSR=0x00080000; /*turn on LED*/
else *AT91C_PIOB_ODSR=0x00000000;/*turn off LED*/
*AT91C_AIC_ICCR = (1 << AT91C_ID_TC0);
*AT91C_AIC_EOICR = *AT91C_TC0_SR; /*Interrupt Ack*/
}
//* End
void main ( void )
//* Begin
{
*AT91C_CKGR_MOR=0x00000701; //enable processor & programmable clocks
while(AT91C_PMC_MOSCS==0);
*AT91C_CKGR_PLLR=0x00040801; // Mul=4+1 Div=1
while(AT91C_PMC_LOCK==0);
*AT91C_PMC_MCKR=0x00000004;
while(AT91C_PMC_MCKRDY==0);
*AT91C_PMC_MCKR=0x00000007; // select (PLL clk)/2
while(AT91C_PMC_MCKRDY==0);
*AT91C_PMC_PCER=0xC0001008; //Enable peripherals Ports & Timer0
*AT91C_PIOB_PER = 0x00080000 ; /* Enable the PIO/LED8 pin */
*AT91C_PIOB_OER = 0x00080000; /* Enable the PIO/LED8 pin as Output */
*AT91C_PIOB_CODR = 0x00080000;/* turn off LED */
*AT91C_PIOB_OWER = 0x00080000;/* Enable output write */
AT91C_AIC_SVR[12] = (unsigned int) T0_handler; /* Set the TC1 IRQ handler address */
AT91C_AIC_SMR[12] = 0x00000000; /* Set the trigg and priority for TC1 interrupt */
*AT91C_AIC_ICCR = (1<<12) ; /* Clear the TC1 interrupt */
*AT91C_AIC_IECR = (1<<12) ; /* Enable the TC1 interrupt */
*AT91C_TC0_CCR = 0x00000002; /* Disable the Clock Counter */
*AT91C_TC0_CMR = 0x00000004; /* Set the TIMER_CLOCK5 */
*AT91C_TC0_CCR = 0x00000001; /* Enable the Clock counter */
*AT91C_TC0_CCR = 0x00000004; /* Trigger timer */
*AT91C_TC0_IER = 0x00000001; /* Enable timer overflow interrupt */
while (1) {
}
}//*End
ضمنا تایمر به درستی داره کار میکنه , پرچم overflow اون هم همینطور , روتین اینتراپتو اگه به صورت یه تابع call کنم بازم کار میکنه (همشونو چک کردم) ولی خودش توی روتین اینتراپت نمیره که نمیره
من واقعا دیگه عقلم به جایی قد نمیده
ممنون
آقا من این کدو نوشتم واسه راه اندازی اینتراپت تایمر نوشتم ولی کار نمیکنه مشکل چیه؟؟؟
#include<AT91SAM7X256.H>
#include<delay.h>
__irq void T0_handler(void)
//* Begin
{
if ( (*AT91C_PIOB_ODSR&0x00080000)==0x00000000)
*AT91C_PIOB_ODSR=0x00080000; /*turn on LED*/
else *AT91C_PIOB_ODSR=0x00000000;/*turn off LED*/
*AT91C_AIC_ICCR = (1 << AT91C_ID_TC0);
*AT91C_AIC_EOICR = *AT91C_TC0_SR; /*Interrupt Ack*/
}
//* End
void main ( void )
//* Begin
{
*AT91C_CKGR_MOR=0x00000701; //enable processor & programmable clocks
while(AT91C_PMC_MOSCS==0);
*AT91C_CKGR_PLLR=0x00040801; // Mul=4+1 Div=1
while(AT91C_PMC_LOCK==0);
*AT91C_PMC_MCKR=0x00000004;
while(AT91C_PMC_MCKRDY==0);
*AT91C_PMC_MCKR=0x00000007; // select (PLL clk)/2
while(AT91C_PMC_MCKRDY==0);
*AT91C_PMC_PCER=0xC0001008; //Enable peripherals Ports & Timer0
*AT91C_PIOB_PER = 0x00080000 ; /* Enable the PIO/LED8 pin */
*AT91C_PIOB_OER = 0x00080000; /* Enable the PIO/LED8 pin as Output */
*AT91C_PIOB_CODR = 0x00080000;/* turn off LED */
*AT91C_PIOB_OWER = 0x00080000;/* Enable output write */
AT91C_AIC_SVR[12] = (unsigned int) T0_handler; /* Set the TC1 IRQ handler address */
AT91C_AIC_SMR[12] = 0x00000000; /* Set the trigg and priority for TC1 interrupt */
*AT91C_AIC_ICCR = (1<<12) ; /* Clear the TC1 interrupt */
*AT91C_AIC_IECR = (1<<12) ; /* Enable the TC1 interrupt */
*AT91C_TC0_CCR = 0x00000002; /* Disable the Clock Counter */
*AT91C_TC0_CMR = 0x00000004; /* Set the TIMER_CLOCK5 */
*AT91C_TC0_CCR = 0x00000001; /* Enable the Clock counter */
*AT91C_TC0_CCR = 0x00000004; /* Trigger timer */
*AT91C_TC0_IER = 0x00000001; /* Enable timer overflow interrupt */
while (1) {
}
}//*End
ضمنا تایمر به درستی داره کار میکنه , پرچم overflow اون هم همینطور , روتین اینتراپتو اگه به صورت یه تابع call کنم بازم کار میکنه (همشونو چک کردم) ولی خودش توی روتین اینتراپت نمیره که نمیره
من واقعا دیگه عقلم به جایی قد نمیده
ممنون