Выскакивает ошибка exit status1 no matching functional forcall to"USI_TWI: :registFrom(int, unit8_t&, int) ’
Народ, у кого доступ третьего уровня - поправьте этот бредовый заголовок.
поправил.
@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.
Там вам никакой компилятор ничего подсказывать не будет.
может быть у кого-то есть готовый скетч под аттини 85 ?
конечно, держите
void setup() {
}
void loop() {
}
Вы дискуссию “Как правильно задать вопрос” - внимательно прочитали?
Если про ваш скетч написано, что он должен работать на 85, то почитайте там на каком аддоне был написан скетч. Аддонов есть несколько. Вам советовал ранее UnforgivenII "поставь TinyCore, там Serial, SPI и Wire как в Uno, искаропки. "
Для пробы можно поставить portable версию 1.8.19 для пробы . Рortable версии работают независимо от других и их может быть несколько.
https://www.arduino.cc/en/Guide/PortableIDE