Не компилируется скетч на диспарк аттини 85

Выскакивает ошибка exit status1 no matching functional forcall to"USI_TWI: :registFrom(int, unit8_t&, int) ’

Народ, у кого доступ третьего уровня - поправьте этот бредовый заголовок.

поправил.

1 лайк

@Yri
Добро пожаловать на форум.

Пожалуйста, ознакомтесь с этой темой:

Особенно обратите внимание на последний абзац первого сообщения - “Типичные ошибки новичков при публикации кода”


#include <DigisparkOLED.h>
#include <Wire.h>

#define deviceAddress 11

// Standard and common non-standard Smart Battery commands
#define MANUFACTURER_ACCESS      0x00
#define REM_CAP_ALARM            0x01
#define REM_TIME_ALARM           0x02
#define BATTERY_MODE             0x03
#define TEMPERATURE              0x08
#define VOLTAGE                  0x09
#define CURRENT                  0x0A
#define RELATIVE_SOC             0x0D
#define ABSOLUTE_SOC             0x0E
#define REMAINING_CAPACITY       0x0F
#define FULL_CHARGE_CAPACITY     0x10
#define TIME_TO_FULL             0x13
#define CHARGING_CURRENT         0x14
#define CHARGING_VOLTAGE         0x15
#define BATTERY_STATUS           0x16
#define CYCLE_COUNT              0x17
#define DESIGN_CAPACITY          0x18
#define DESIGN_VOLTAGE           0x19
#define SPEC_INFO                0x1A
#define MFG_DATE                 0x1B
#define SERIAL_NUM               0x1C
#define MFG_NAME                 0x20   // String
#define DEV_NAME                 0x21   // String
#define CELL_CHEM                0x22   // String
#define MFG_DATA                 0x23   // String
#define CELL4_VOLTAGE            0x3C
#define CELL3_VOLTAGE            0x3D
#define CELL2_VOLTAGE            0x3E
#define CELL1_VOLTAGE            0x3F
#define STATE_OF_HEALTH          0x4F
#define PF_STATUS                0x53
#define DJI_SERIAL               0xD8  // String

#define bufferLen 32
uint8_t i2cBuffer[bufferLen];

uint8_t read_byte()
{
  while (1)
  {
    if (Wire.available())
    {
      return Wire.read();
    }
  }
}

int fetchWord(byte func)
{
  Wire.beginTransmission(deviceAddress);
  Wire.write(func);
  Wire.endTransmission(true);
  delay(1); // FIX wire bug
  Wire.requestFrom(deviceAddress, 2);
  
  uint8_t b1 = read_byte();
  uint8_t b2 = read_byte();
  Wire.endTransmission(true);
  return (int)b1 | (((int)b2) << 8);
}

uint8_t i2c_smbus_read_block(uint8_t command, uint8_t* blockBuffer, uint8_t blockBufferLen)
{
  uint8_t x, num_bytes;
  Wire.beginTransmission(deviceAddress);
  Wire.write(command);
  Wire.endTransmission(false);
  delay(1);
  Wire.requestFrom(deviceAddress, blockBufferLen, true);
  
  num_bytes = read_byte();
  num_bytes = constrain(num_bytes, 0, blockBufferLen - 2);
  for (x = 0; x < num_bytes - 1; x++) 
  { // -1 because x=num_bytes-1 if x<y; last byte needs to be "nack"'d, x<y-1
    blockBuffer[x] = read_byte();
  }
  blockBuffer[x++] = read_byte(); // this will nack the last byte and store it in x's num_bytes-1 address.
  blockBuffer[x] = 0; // and null it at last_byte+1
  Wire.endTransmission();
  return num_bytes;
}

void check_sealed(byte clearscreen)
{
  uint16_t uMac = fetchWord(MANUFACTURER_ACCESS);
  if (clearscreen == 1)
  {
    oled.clear();           //all black
    oled.setCursor(0, 0);   //top left
  }
  oled.print(F("Manufacturer Access: 0x"));
  oled.print(uMac, HEX);

  switch(uMac & 0x0300)
      {
        case 0x0300:  
            oled.println(F(" SEALED"));
            break;
        case 0x0200:  
            oled.println(F(" UNSEALED"));
            break;
        case 0x0100:  
            oled.println(F(" FULL ACCESS"));
            break;
        default:  
            oled.println(F(" UNKNOWN"));
            break;
        }
  return;  
}

void mba_writecmd(byte b1, byte b2, byte end_trans)
{
  Wire.beginTransmission(deviceAddress);
  Wire.write(0x44);         //  ManufacturerBlockAccess()
  Wire.write(0x02);         //  len
  Wire.write(b1);
  Wire.write(b2);
  if (end_trans == 1)
    Wire.endTransmission(true);
}

void do_unseal_dji()        // Unseal using DJI key CCDF7EE0 
{
  oled.println(F("Unseal..."));
  mba_writecmd(0xE0, 0x7E, 1);
  mba_writecmd(0xDF, 0xCC, 1);  
}
  
void do_fas_dji()           // FAS using DJI key E0BCBF17
{
  oled.println(F("Full access..."));
  mba_writecmd(0x17, 0xBF, 1);
  mba_writecmd(0xBC, 0xE0, 1);
}

void clear_pf_reset()
{
  oled.println(F("Clear PF..."));
  mba_writecmd(0x29, 0x00, 0);
  Wire.write(0x7F);         //  FEC
  Wire.endTransmission(true);  
  delay(100);
  Wire.beginTransmission(deviceAddress);
  Wire.write(0x44);         //  ManufacturerBlockAccess()
  Wire.write(0x06);         //  len
  Wire.write(0x62);         //  LifetimeDataBlock3   ???????
  Wire.write(0x40);
  Wire.write(0x01);         
  Wire.write(0x23);
  Wire.write(0x45);         
  Wire.write(0x67);
  Wire.write(0xDF);         //  FEC
  Wire.endTransmission(true);  
  delay(100);
  oled.println(F("Reset..."));
  mba_writecmd(0x41, 0x00, 0);
  Wire.write(0x22);         //  FEC
  Wire.endTransmission(true);  
  delay(100);
  oled.println(F("Done"));
}

void bat_2seal()
{
  // seal DJI battery  
  mba_writecmd(0x30, 0x00, 1);
}

/*
byte bat_is_blocked()
{
  uint8_t length_read = 0;
  // Ввести ключи, достаточно пару unseal, затем послать 0x44, 0x02, 0x62, 0x40 и прочитать из 0x44 7 байт. 
  // Для незаблокированной батареи они будут 0x22 0x62 0x40 0x01 0x23 0x45 0x67.
  bat_write2bytes(0x62, 0x40, 1);
  length_read = i2c_smbus_read_block(0x44, i2cBuffer, 7);
  if (length_read != 7)
  {
    return 1;
  }
  if ((i2cBuffer[0] == 0x22) and 
      (i2cBuffer[1] == 0x62) and 
      (i2cBuffer[2] == 0x40) and 
      (i2cBuffer[3] == 0x01) and 
      (i2cBuffer[4] == 0x23) and 
      (i2cBuffer[5] == 0x45) and 
      (i2cBuffer[6] == 0x67))
  {
    return 0;
  }
  return 1;
}
*/

void setup()
{
  Wire.begin();
  oled.begin();
}

void loop()
{
  char *outstr = i2cBuffer;
  oled.clear(); //all black
  oled.setCursor(0, 3); 
  oled.setFont(FONT6X8);

  oled.println(F("Connect to battery.."));
  // Unlock battery if it is locked
  uint16_t bat_status = fetchWord(BATTERY_STATUS);
  uint16_t opstat = fetchWord(MANUFACTURER_ACCESS) & 0xFCFF;
  i2c_smbus_read_block(PF_STATUS, i2cBuffer, 4);
  if ((bat_status & 0x4800) or
      (i2cBuffer[0] != 0) or
      (i2cBuffer[1] != 0) or
      (i2cBuffer[2] != 0) or
      (i2cBuffer[3] != 0) or
      (opstat != 0))  
  {
    oled.clear(); //all black
    oled.setCursor(0, 0); //top left
    check_sealed(1);        // Sealing status to OLED screen
    delay(100);  
    do_unseal_dji();        // Unseal using DJI key
    delay(100);  
    check_sealed(0);
    delay(100);  
    do_fas_dji();           // Full access using DJI key
    delay(2000);  
    oled.clear(); //all black
    oled.setCursor(0, 0); 
    check_sealed(0);
    mba_writecmd(0x2A, 0x00, 0);  // Black Box Recorder Reset
    Wire.write(0x40);             //  FEC
    Wire.endTransmission(true);  
    mba_writecmd(0x28, 0x00, 0);  // Lifetime Data Reset
    Wire.write(0x6A);             //  FEC
    Wire.endTransmission(true);  
    // unlock battery
    clear_pf_reset();       // Clear PF and reset chip
    delay(1000);  
    check_sealed(0);
    delay(5000);  
  }

repeat_info:
  i2c_smbus_read_block(DJI_SERIAL, i2cBuffer, bufferLen);
  oled.clear();         //all black
  oled.setCursor(0, 0); //top left
  oled.print(F("Ser #:"));
  oled.println(outstr);

  oled.print(F("Cycle Count:"));
  uint8_t cycles = fetchWord(CYCLE_COUNT);
  oled.println(cycles);
  
  oled.print(F("Full Ch Capacity:"));
  oled.println(fetchWord(FULL_CHARGE_CAPACITY));

  oled.print(F("Remaining Cap.:" ));
  oled.println(fetchWord(REMAINING_CAPACITY));

  oled.print(F("Relative Charge:"));
  uint8_t charge = fetchWord(RELATIVE_SOC);
  oled.print(charge);
  oled.println(F("%"));

  oled.print(F("Absolute Charge:"));
  oled.print(fetchWord(ABSOLUTE_SOC));
  oled.println(F("%"));

  oled.print(F("Voltage:"));
  int cell1 = fetchWord(CELL1_VOLTAGE);
  int cell2 = fetchWord(CELL2_VOLTAGE);
  oled.print(cell1);
  oled.print(F("/"));
  oled.println(cell2);

  oled.print(F("Temp:"));
  int temp = fetchWord(TEMPERATURE) * 10 - 27315;
  oled.print(temp / 100);
  oled.print(F("."));
  oled.println(temp % 100);

  delay(7000);
  oled.clear(); //all black
  oled.setCursor(0, 0); //top left

  oled.print(F("Manufacturer:"));
  i2c_smbus_read_block(MFG_NAME, i2cBuffer, bufferLen);
  oled.println(outstr);

  oled.print(F("Dev Name:"));
  i2c_smbus_read_block(DEV_NAME, i2cBuffer, bufferLen);
  oled.println(outstr);
  
  oled.print(F("Chemistry:"));
  i2c_smbus_read_block(CELL_CHEM, i2cBuffer, bufferLen);
  oled.println(outstr);

  oled.print(F("Data:"));
  int mdate = fetchWord(MFG_DATE);
  int mday = B00011111 & mdate;
  int mmonth = mdate >> 5 & B00001111;
  int myear = 1980 + (mdate >> 9 & B01111111);
  oled.print(mday);
  oled.print(F("."));
  oled.print(mmonth);
  oled.print(F("."));
  oled.println(myear);

  oled.print(F("Design Capacity:"));
  oled.println(fetchWord(DESIGN_CAPACITY));

  oled.print(F("Design Voltage:"));
  oled.println(fetchWord(DESIGN_VOLTAGE));

  oled.print(F("Specific. Info:"));
  oled.println(fetchWord(SPEC_INFO));

  oled.print(F("State of Health:"));
  oled.println(fetchWord(STATE_OF_HEALTH));

  delay(7000);
  oled.clear(); //all black
  oled.setCursor(0, 0); //top left

  oled.println(F("Battery Mode:"));
  oled.print(F("0b"));
  oled.println(fetchWord(BATTERY_MODE), BIN);

  oled.print(F("Status:0b"));
  oled.println(fetchWord(BATTERY_STATUS), BIN);

  oled.print(F("Current:"));
  oled.print(fetchWord(CURRENT));
  oled.println(F("mA"));

  delay(7000);
  goto repeat_info;
}