Timer 如何在Arduino mega的定时器中断中使用ADXL345
我想在Arduino mega的定时器中断中使用ADXL345 但它不能工作 这是我的密码:Timer 如何在Arduino mega的定时器中断中使用ADXL345,timer,arduino,interrupt,i2c,isr,Timer,Arduino,Interrupt,I2c,Isr,我想在Arduino mega的定时器中断中使用ADXL345 但它不能工作 这是我的密码: #include <Wire.h> #define Register_ID 0 #define Register_2D 0x2D #define Register_X0 0x32 #define Register_X1 0x33 #define Register_Y0 0x34 #define Register_Y1 0x35
#include <Wire.h>
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
int ADXAddress = 0xA7>>1;
int reading = 0;
int val = 0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
unsigned long t1, t2;
void setup()
{
Serial.begin(9600);
Wire.begin(); //初始化I2C
delay(100);
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8);
Wire.endTransmission();
delay(500);
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 2500; // compare match register //250 = 1ms//500=2ms
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS10) + (1 << CS11); // 64 prescaler
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
interrupts(); // enable all interrupts
}
void loop()
{
Serial.println(Z_out);
delay(500);
}
ISR(TIMER1_COMPA_vect){
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2);
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1 = Z1<<8;
Z_out = Z0+Z1;
}
}
#包括
#定义寄存器\u ID 0
#定义寄存器\u 2D 0x2D
#定义寄存器\u X0 0x32
#定义寄存器_X1 0x33
#定义寄存器_Y0 0x34
#定义寄存器_Y1 0x35
#定义寄存器_Z0 0x36
#定义寄存器_Z1 0x37
int ADXAddress=0xA7>>1;
整数读数=0;
int-val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
双Xg、Yg、Zg;
无符号长t1,t2;
无效设置()
{
Serial.begin(9600);
Wire.begin()//初始化I2C
延迟(100);
线路开始传输(ADX地址);
Wire.write(寄存器_2D);
线写(8);
导线端传动();
延迟(500);
noInterrupts();//禁用所有中断
TCCR1A=0;
TCCR1B=0;
TCNT1=0;
OCR1A=2500;//比较匹配寄存器//250=1ms//500=2ms
TCCR1B |=(1您不能在ISR内使用线库,因为中断已被禁用。线库使用中断。您不应该在ISR中处理I2C通信。尝试使用定时器中断更改标志的值。在主循环中检查该标志并读取该值