C 如何使用中断从光传感器读取数据结果

C 如何使用中断从光传感器读取数据结果,c,avr,light-sensor,C,Avr,Light Sensor,我使用的是Arduino mega 2560和光传感器BH1750FVI。要显示我使用minicom的结果,请使用Ubuntu 16.04 LTS 我写代码,它的工作,并向我发送数据结果读取光传感器,我只能读取信息一次。我不明白我如何使它通过中断(TWI_vect)工作,并在每次使用uart时显示结果 #include "my_header.h" #define I2C_STATUS_MASK 0xF8 #define START_COND_TRANSMITTE

我使用的是Arduino mega 2560和光传感器BH1750FVI。要显示我使用minicom的结果,请使用Ubuntu 16.04 LTS

我写代码,它的工作,并向我发送数据结果读取光传感器,我只能读取信息一次。我不明白我如何使它通过中断(TWI_vect)工作,并在每次使用uart时显示结果

#include "my_header.h"

#define I2C_STATUS_MASK                 0xF8
#define START_COND_TRANSMITTED          0x08
#define REPEATED_START_COND_TRANSMITTED 0x10
#define SLA_W_TRANSMITTED_ACK_RECEIVED  0x18
#define DATA_TRANSMITTED_ACK_RECEIVED   0x28
#define SLA_R_TRANSMITTED_ACK_RECEIVED  0x40
#define DATA_RECEIVED_ACK_RETURNED      0x50
#define DATA_RECEIVED_NACK_RETURNED     0x58
volatile int light_intensity = 0; // var for read data from sensor

ISR(USART0_UDRE_vect) {
  if (!bufferIsEmpty(&buffer)) //if we have something to read do it
    UDR0 = popFromBuff(&buffer);
  else
    UCSR0B &= ~_BV(UDRIE0); //disallow interrupts
}



int     main(void) {
  cli();
  init_port(); //initialize my port
  init_buffer(&buffer, BUFF_SIZE); //init ring_buffer for uart
  init_uart();
  TWI_init();
  sei();

  TWI_start(); //send start 
  TWI_send_SLA(WRITE); //send SLA+W to light sensor 
  TWI_sendData(0b00010000); //opecode for Measurement
  TWI_stop(); //stop

  TWI_start(); //send start 
  TWI_send_SLA(READ); // send SLA+R to sensor
  TWI_readData(); // read data from it light_intensity = TWDR
  TWI_stop(); // stop 
  u_printnumbers(light_intensity); /*my func that send data to ring_buffer and later
                      *using interrupts send it form buffer to UDR
                      */
  u_print("\n");

  while (1) {
    if (!bufferIsEmpty(&buffer)) /*if buffer is not empty allow interrupts for uart*/
      UCSR0B |= _BV(UDRIE0);
  }
}
所以这个代码工作,我从传感器接收数据,一切正常。但是我想用它来中断(TWI_vect)并一直从传感器接收数据,就像在while()中一样。我读了很多信息,但不明白它应该是什么样子。
你能告诉我如何正确使用中断代码吗?举个小例子。谢谢你的帮助

要使用双Wirte接口(I²C;TWI)中断驱动,您必须在TWI ISR中实现某种状态机

给出一个大概的想法如何做到这一点。您必须准备好缓冲区,并将事务抽象到某种结构中。例如,您可以有一个

struct i2c_transfer {
    uint8_t        i2c_sla; /* slave address */
    const uint8_t *txbuf;
    size_t         txbytes;
    uint8_t       *rxbuf;
    size_t         rxbytes;
}

然后让一个函数开始传输I2C,并通过检查
txbytes==0&&rxbytes==0
或发生错误来检查是否完成。然后,您的ISR需要检查其状态,并根据其应该写入和读取的字节数采取适当的行动。

我们不是辅导服务。