这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 8535,ICC 8535在ICC编程中的中断冲突问题

共2条 1/1 1 跳转至

8535,ICC 8535在ICC编程中的中断冲突问题

院士
2006-09-17 18:14:16     打赏
8535,ICC 8535在ICC编程中的中断冲突问题



关键词: 编程     中的     中断     冲突     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 我在用ICC编程,程序中使用了A/D转换中断、SPI中断。而当我开总中断时,程序无法正常运行,而当我关总中断程序运行正常。而关了总中断,后面的外部中断、计数器中断、UART中断都无法用了。请问大家这是怎么回事?是不是ICC编译器有问题,我用CAVR试过也不行。 1: 应该是程序的问题注意ICCAVR的中断向量从1开始 2: 能否说的详细一些ICCAVR的中断向量从1开始是怎么回事?
3: 中断向量应该是对的我设的SPI中断向量是11,A/D转换的是15。这与8535的中断源完全相同。在用STUDIO软件仿真时完全正确,而下载后不正确,为什么?谢谢!!! 4: 堆栈仿真正确,就应注意是否堆栈溢出? 5: 堆栈问题堆栈范围(默认为32)我设为64、128,也不行。 6: 应该将有问题的代码帖出来,不要让帮助你的人瞎猜。 7: 中断冲突程序//ICC-AVR application builder : 2003-2-21 下午 06:39:22
// Target : 8535
// Crystal: 8.0000Mhz

#include <io8535v.h>
#include <macros.h>
#define uint unsigned int
#define xtal 8
#define TIME1 1
#define TIME2 200
#pragma interrupt_handler spi_stc_isr:11
#pragma interrupt_handler adc_isr:15

void abc(void);
//SPI initialisation
// clock rate: 2000000hz
void spi_init(void)
{
SPCR = 0xD0; //setup SPI
}


void spi_stc_isr(void)
{
PORTB|=0x08;             //SCK置1,将数据并行发出
}

//送数子程序
void send(char temp)
{
SEI();
SPCR=0xD0;              //写SPI控制字,允许SPI中断触发,主机模式,4除频
DDRB|=0x20;             //由PB5输出串行数据
SPDR=temp;              //发送数据
while(!(SPSR&0x80));    //未完成继续等待
PORTB&=0xF7;            //PB3清零,为下次发送做准备
}

int value=0;
void adc_isr(void)
{
//conversion complete, read value (int) using...
value=ADCL;              //Read 8 low bits first (important)
value |= (int)ADCH << 8;   //read 2 high bits and shift into top byte
ADCSR &= 0xBF;             //清零ADSC,停止AD转换  
}

//AD转换程序
//int k=0;
void readADC(char channel)
{
    ADMUX = channel;                       // Select channel                 
    ADCSR |= 0Xcd;                         // Start conversion
    while (!(ADCSR & 0x10));               // Check if converstion is ready
}
    
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0xFF;
DDRB  = 0xFF;
PORTC = 0xFF;
DDRC  = 0xFF;
PORTD = 0xFF;
DDRD  = 0xFF;
}

//SPI initialisation
// clock rate: 2000000hz
void spi_init(void)
{
SPCR = 0xD0; //setup SPI
}

//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
spi_init();
adc_init();

MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialised
}

void main(void)
{
init_devices();
caiji();
.
.
.
}


//void caiji(void);//阀值采集子程序
void caiji(void)
{
.
.
abc();//采集程序

.
.
}

int a[8]={0,0,0,0,0,0,0,0};
void abc(void)
{
char temp1=0b00000000;      //1-3位用于指示发光二极管,4-7位用于16选一片选信号
char temp2=0b11111110;      
char channel=0;             //AD转换通道初始化
char i=0;
readADC(0);                //第一次虚拟转换过程
delay_ms(TIME2);

//将8个管子分别采集到的数值存储到相应的数组元素中
PORTB&=0xF7;
for(i=0;i<8;i++)      
  {
    send(temp1);                    //发送数据的1-3位和4-7位分别到4051进行片选和指示灯
    send(temp2);                    //发送数据的相应位到发射管
    readADC(channel);
    a[i]=value;
    delay_ms(TIME2);
    temp1=(temp1+((0x00+1)<<4))+(0x01+1);  //实现temp1的1-3位和4-7位分别加1
    temp2=~((~temp2)<<1);                   //实现temp2的左移1位
  }
} 8: 允许某一中断,却没有写相应的中断服务程序 9: ?这里有2个中断11和15,相应的中断服务程序都是写了的啊。楼上的是什么意思呢?
void spi_stc_isr(void)
{
PORTB|=0x08;             //SCK置1,将数据并行发出
}


void adc_isr(void)
{
//conversion complete, read value (int) using...
value=ADCL;              //Read 8 low bits first (important)
value |= (int)ADCH << 8;   //read 2 high bits and shift into top byte
ADCSR &= 0xBF;             //清零ADSC,停止AD转换  
}

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]