共2条
1/1 1 跳转至页
8535,ICC 8535在ICC编程中的中断冲突问题
问
我在用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转换
}
答 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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |