Не компилируется скетч на диспарк аттини 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;
}

уже и скетч выложил но похоже как запрос на третий уровень и исправил доводы закончились.

Догадаться можно, что вы хотели сказать. Но только догадаться.

По начальному вопросу. Вероятно в библиотеке wire для 85, функция requestFrom вызывается с двумя параметрами, а не с тремя как вашем коде. Посмотрите в примерах для Digispark

удали ядро дигиспарка, поставь TinyCore, там Serial, SPI и Wire как в Uno, искаропки. Единственное, что программировать придется программатором UsbAsp. Зато места будет для программ не 6кБ, а 8

Попробуйте в вызове функции стр.73 и 75

 Wire.requestFrom(deviceAddress, blockBufferLen, true);

убрать третий параметр

 Wire.requestFrom(deviceAddress, blockBufferLen);

P.S. Да , уже @Upper выше говорил об этом

здравствуйте да я пробовал удалять но дает уругую ошибку и так постоянно

я не хочу ни кого обидеть я не совсем сразу понял что как здесь работает потому сначала выложил только код ошибки которую он мне давал без скетча

Слушайте, а вы что ожидали? Одну ошибку поправили и оно заработает?

А кто сказал что там одна ошибка? - может их сотни…

Процесс отладки кода - он итерационный. Исправили одну ошибку, прочитали сообщение о следующей… пошли исправлять новую. Это норма.

Более того, это сейчас вы только ошибки компиляции исправляете. Они самые простые, потому что компилятор сам вам их подсвечивает. самое интересное начнется тогда, когда код скомпилируется. Вот тогда придется искать ошибки логики… это когда например вы считаете сумму 2 + 2 - а программа выдает 5.
Там вам никакой компилятор ничего подсказывать не будет.

1 лайк

может быть у кого-то есть готовый скетч под аттини 85 ?

конечно, держите

void setup() {

}
void loop() {

}

Вы дискуссию “Как правильно задать вопрос” - внимательно прочитали?

1 лайк

Если про ваш скетч написано, что он должен работать на 85, то почитайте там на каком аддоне был написан скетч. Аддонов есть несколько. Вам советовал ранее UnforgivenII "поставь TinyCore, там Serial, SPI и Wire как в Uno, искаропки. "
Для пробы можно поставить portable версию 1.8.19 для пробы . Рortable версии работают независимо от других и их может быть несколько.
https://www.arduino.cc/en/Guide/PortableIDE

1 лайк