【发布时间】:2016-05-23 21:43:40
【问题描述】:
我正在使用 atmega32 并尝试使用中断使主发送器,但它会导致无限跳转到中断,因为 TWINT(I2C 标志)总是在没有 I2C 操作时设置,并且仅在操作期间被清除,我该如何解决这个问题?
这里是主代码,它每秒增加 PORTD,当按下按钮时,它会将 PORTD 的当前状态发送到从机微控制器,并且发生中断并且 portb 增加 2,真正发生的是在发送start 信号它不断跳到中断(portb 不断增加)而不发送任何东西。
#define F_CPU 8000000UL
#include <avr/io.h>
#include<util/delay.h>
#include <avr/interrupt.h >
void i2c_master_init()
{TWSR=0;
TWBR=0x47;
TWCR=(1<<TWEN);
}
void i2c_start()
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
while((TWCR & (1<<TWINT))==0);
}
void i2c_send(unsigned char data)
{
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);
}
void i2c_stop()
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
ISR(TWI_vect)
{ PORTB+=2; // PORTB+=2 when an interrupt occurs
}
int main(void)
{
DDRD=0xff;
DDRB=0b11111110;
sei();
i2c_master_init();
i2c_start();
i2c_send(0b00000010); //sending SLA+W
while(1)
{
if((PINB & 1)==0) //check if the button is pressed
{i2c_send(PORTD); //send the current state of PORTD
while((PINB & 1)==0); //wait until the button is released
}
_delay_ms(1000);
PORTD++; //increment PORTD every second
}
return 0;
}
【问题讨论】:
-
设置为低电平有效?
-
定义“无 I2C 操作”。你用的是哪个控制器?至少有 5 种不同类别的 AVR 控制器(32 位、8 位、汽车......)。你的问题很模糊。
-
这个问题很可能是因为你的代码有错误。如果您想要比这更好的答案,事实证明您必须提供更多细节。
-
@Rev1.0 抱歉缺少细节,我正在使用 atmega32 ,没有操作只是意味着主机现在没有传输任何东西,在这种状态下 TWINT 被设置,因此中断连续发生,我在帖子里加了代码
-
@Lundin 抱歉缺少细节,我正在使用 atmega32,并在帖子中添加了代码