Eeprom was not declared in this scope как исправить

Bug Description When compiling 2.0.5-bugfix - 8b637e4 for the board BTT_SKR_MINI_E3_V2_0 I get the following error: MarlinsrcHALSTM32F1eeprom.cpp: In static member function 'static bool Per...

Bug Description

When compiling 2.0.5-bugfix — 8b637e4 for the board BTT_SKR_MINI_E3_V2_0
I get the following error:

MarlinsrcHALSTM32F1eeprom.cpp: In static member function 'static bool PersistentStore::write_data(int&, const uint8_t*, size_t, uint16_t*)':
MarlinsrcHALSTM32F1eeprom.cpp:49:14: error: 'eeprom_read_byte' was not declared in this scope
     if (v != eeprom_read_byte(p)) {
Compiling .piobuildSTM32F103RC_btt_512KsrcsrcHALSTM32F1eeprom_flash.cpp.o
              ^~~~~~~~~~~~~~~~
MarlinsrcHALSTM32F1eeprom.cpp:49:14: note: suggested alternative: 'pgm_read_byte'
     if (v != eeprom_read_byte(p)) {
              ^~~~~~~~~~~~~~~~
              pgm_read_byte
MarlinsrcHALSTM32F1eeprom.cpp:50:7: error: 'eeprom_write_byte' was not declared in this scope
       eeprom_write_byte(p, v);
       ^~~~~~~~~~~~~~~~~
MarlinsrcHALSTM32F1eeprom.cpp:50:7: note: suggested alternative: 'gpio_write_bit'
       eeprom_write_byte(p, v);
       ^~~~~~~~~~~~~~~~~
       gpio_write_bit
MarlinsrcHALSTM32F1eeprom.cpp: In static member function 'static bool PersistentStore::read_data(int&, uint8_t*, size_t, uint16_t*, bool)':
MarlinsrcHALSTM32F1eeprom.cpp:65:17: error: 'eeprom_read_byte' was not declared in this scope
     uint8_t c = eeprom_read_byte((uint8_t*)pos);
                 ^~~~~~~~~~~~~~~~
MarlinsrcHALSTM32F1eeprom.cpp:65:17: note: suggested alternative: 'pgm_read_byte'
     uint8_t c = eeprom_read_byte((uint8_t*)pos);
                 ^~~~~~~~~~~~~~~~
                 pgm_read_byte
MarlinsrcHALSTM32F1eeprom.cpp: In static member function 'static size_t PersistentStore::capacity()':
MarlinsrcHALSTM32F1eeprom.cpp:74:45: error: 'E2END' was not declared in this scope
 size_t PersistentStore::capacity() { return E2END + 1; }
                                             ^~~~~
*** [.piobuildSTM32F103RC_btt_512KsrcsrcHALSTM32F1eeprom.cpp.o] Error 1

This file is not found in the official release of BTT, so I suspect that this file causes some issues with my configuration.

My Configurations

https://www.dropbox.com/s/fn3nsenb4cl8de3/Marlin.zip?dl=0

Steps to Reproduce

Compile in PlatformIO

Expected behavior: [What you expect to happen]
A successful compilation

Actual behavior: [What actually happens]
Error during compilation

Additional Information

  • Provide pictures or links to videos that clearly demonstrate the issue.
  • See How Can I Contribute for additional guidelines.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
#include <util/delay.h> 
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
 
#define F_CPU 4800000UL  // Define software reference clock for delay duration
#define SDA_release   DDRB &= 0xEF
#define SDA_low     DDRB |= 0x10
#define SCL_release   DDRB &= 0xF7
#define SCL_low     DDRB |= 0x08
 
#define FREQ_STEPS 10
#define RADIO_REG_CHIPID  0x00
#define RADIO_REG_CTRL    0x02
#define RADIO_REG_CTRL_OUTPUT 0x8000
#define RADIO_REG_CTRL_UNMUTE 0x4000
#define RADIO_REG_CTRL_MONO   0x2000
#define RADIO_REG_CTRL_BASS   0x1000
#define RADIO_REG_CTRL_SEEKUP 0x0200
#define RADIO_REG_CTRL_SEEK   0x0100
#define RADIO_REG_CTRL_RDS    0x0008
#define RADIO_REG_CTRL_NEW    0x0004
#define RADIO_REG_CTRL_RESET  0x0002
#define RADIO_REG_CTRL_ENABLE 0x0001
 
#define RADIO_REG_CHAN    0x03
#define RADIO_REG_CHAN_SPACE     0x0003
#define RADIO_REG_CHAN_SPACE_100 0x0000
#define RADIO_REG_CHAN_BAND      0x000C
#define RADIO_REG_CHAN_BAND_FM      0x0000
#define RADIO_REG_CHAN_BAND_FMWORLD 0x0008
#define RADIO_REG_CHAN_TUNE   0x0010
#define RADIO_REG_CHAN_NR     0x7FC0
#define RADIO_REG_R4    0x04
#define RADIO_REG_R4_EM50   0x0800
#define RADIO_REG_R4_SOFTMUTE   0x0200
#define RADIO_REG_R4_AFC   0x0100
#define RADIO_REG_VOL     0x05
#define RADIO_REG_VOL_VOL   0x000F
 
#define RADIO_REG_RA      0x0A
#define RADIO_REG_RA_RDS       0x8000
#define RADIO_REG_RA_RDSBLOCK  0x0800
#define RADIO_REG_RA_STEREO    0x0400
#define RADIO_REG_RA_NR        0x03FF
 
#define RADIO_REG_RB          0x0B
#define RADIO_REG_RB_FMTRUE   0x0100
#define RADIO_REG_RB_FMREADY  0x0080
 
 
#define RADIO_REG_RDSA   0x0C
#define RADIO_REG_RDSB   0x0D
#define RADIO_REG_RDSC   0x0E
#define RADIO_REG_RDSD   0x0F
 
// I2C-Address RDA Chip for sequential  Access
#define I2C_SEQ  0x20
 
// I2C-Address RDA Chip for Index  Access
#define I2C_INDX  0x22
 
 
#define   RADIO_BAND_NONE     0x0
#define   RADIO_BAND_FM       0x1
#define   RADIO_BAND_FMWORLD  0x2
 
// ----- implement
uint16_t registers[10]={
0x5804,
0x0000,
0x0001,
0x0000,
0x0800,
0x9089, //  последняя цифра громкость  1 - F
0x0000,
0x0000,
0x0000,
0x0000
};
uint8_t fm, vol;
bool BTNUP, BTNDN, BTNSK, BASS , MONO ;
 
//  Частоты радиостанций в вашем регионе 
static uint16_t preset[] PROGMEM= {
  9080,
  10100,
  10140,
  10180, // hr1
  10220,
  10290, // Bayern2
  10340, // ???
  10390, // * hr3
  10430,
  10490,
  10670,
  10720
}; 
 
int main( void )
{  // всё что до while(1){ выполняется один раз при старте
//-----setup--------
  DDRB = 0x00;    //PORTB = Inputs
  PORTB = 0x87;   //Set Outputs to Low (when DDRB is set to low the pin associated goes Hi-Z)
  fm=EEPROM_read(0);
  vol=EEPROM_read(1);
  BASS=EEPROM_read(2);
  MONO=EEPROM_read(3);
  _delay_ms(1000); 
  _saveRegisters();
  setVol();
  setBassBoost();
  setMono();
  setFrequency();
  while(1){ // вечный цыкл, тоже самое что и void loop(){
//----loop--------    
  if (PINB & (1<<PINB0)) BTNUP=0;
  if (PINB & (1<<PINB1)) BTNDN=0;
  if (PINB & (1<<PINB2)) BTNSK=0;
  
  if (!BTNUP & !BTNDN & !BTNSK)
  {
      _delay_ms(5);
   if (!(PINB & (1<<PINB2)))
   {BTNSK=1;
   fm ++;
   if (fm>11) fm=0;  //   11 Количество радиостанций  в таблице
   setFrequency();
   EEPROM_write(0, fm);
   }
    if (!(PINB & (1<<PINB1)))
   {BTNDN=1;
   vol --;
   if (vol<1) vol=1;  
   setVol();
 
   }
    if (!(PINB & (1<<PINB0)))
   {BTNUP=1;
   vol ++;
   if (vol>15) vol=15; 
   setVol();
 
   }
  } else { 
  _delay_ms(5);
if (!(PINB & (1<<PINB2))) { if (BTNUP) {BASS=!BASS; setBassBoost();  BTNUP=0;BTNSK=1;}
                           if (BTNDN) {MONO=!MONO;setMono(); BTNDN=0;BTNSK=1;}     
    } 
   }
  } // конец вечного цикла
  return 0;
}
 
void setVol(void)
{
   registers[RADIO_REG_VOL] = (0x9080 | vol); 
   _saveRegister(RADIO_REG_VOL);
   EEPROM_write(1, vol);
} // setBassBoost()
 
 
void setBassBoost()
{ 
  if (BASS)
  registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_BASS;
  else
  registers[RADIO_REG_CTRL] &= (~RADIO_REG_CTRL_BASS);
  _saveRegister(RADIO_REG_CTRL);
  EEPROM_write(2, BASS);
} // setBassBoost()
 
 
// Mono / Stereo
void setMono(void)
{ 
 registers[RADIO_REG_CTRL] &= (~RADIO_REG_CTRL_SEEK);
  if (!MONO) {
    registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_MONO;
  }
  else {
    registers[RADIO_REG_CTRL] &= ~RADIO_REG_CTRL_MONO;
  }
   _saveRegister(RADIO_REG_CTRL);
   EEPROM_write(3, MONO);
 
} // setMono
 
 
void setFrequency(void) {
  uint16_t newChannel;
  uint16_t regChannel = registers[RADIO_REG_CHAN] & (RADIO_REG_CHAN_SPACE | RADIO_REG_CHAN_BAND);
 
  newChannel = (pgm_read_word_near(preset + fm) - 8700) / 10;
  regChannel += RADIO_REG_CHAN_TUNE; // enable tuning
  regChannel |= newChannel << 6;
  
  // enable output and unmute
  registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_OUTPUT | RADIO_REG_CTRL_UNMUTE | RADIO_REG_CTRL_ENABLE; //  | RADIO_REG_CTRL_NEW
  _saveRegister(RADIO_REG_CTRL);
 
  registers[RADIO_REG_CHAN] = regChannel;
  _saveRegister(RADIO_REG_CHAN);
 
  // adjust Volume
//  _saveRegister(RADIO_REG_VOL);
} // setFrequency()
 
 
// Save one register back to the chip
void _saveRegister(byte regNr)
{
  i2c_start(I2C_INDX);
  i2c_write(regNr);
  _write16(registers[regNr]);
   i2c_stop();
} // _saveRegister
 
void _saveRegisters()
{
  i2c_start(I2C_SEQ);
  for (int i = 2; i <= 6; i++)
  _write16(registers[i]);
   i2c_stop();
} // _saveRegisters
 
void _write16(uint16_t val)
{
  i2c_write(val >> 8); 
  i2c_write(val & 0xFF);
} // _write16
 
void i2c_clk(void)
{
  SCL_release;    //Release Clock
  _delay_us(5);
  SCL_low;      //Pull Clock Low
}
/**************************************************************/
void i2c_write(char data)
{
int i;
 
  for (i=0;i<=7;i++)            //Clocks out byte MSB first
  {
    if (data & 0x80)  {SDA_release;}  //Release Data
    else        {SDA_low;};   //Pull Data Low
    data = data * 2;
    i2c_clk();
  }
 
 // _delay_us(5);
 
  SDA_release;              //Release Data to check for ACK
 
  if (PINB & 0x08){   } //slave didn't acknowledge (data held low by slave)
  else      {   } //slave did acknowledge (data not held low by slave)
  i2c_clk();
  SDA_low;                //Pull Data Low
}
/**************************************************************/
void i2c_start(char data)
{ SDA_low;    //Pull Data Low
  SCL_low;    //Pull Clock Low
  i2c_write(data);
}
/**************************************************************/
void i2c_stop(void)
{
  SCL_release;  //Release Clock
  SDA_release ; //Release Data
}
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
  while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
  EEAR = uiAddress; /*Проинициализировать регистры*/
  EEDR = ucData;
  EECR |= (1<<EEMWE); /*Установить флаг EEMWE*/
  EECR |= (1<<EEWE); /*Начать запись в EEPROM*/
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
  while(EECR & (1<<EEWE)); /*Ждать завершения предыдущей записи*/
  EEAR = uiAddress; /* Проинициализировать регистр адреса*/
  EECR |= (1<<EERE); /*Выполнить чтение*/
  return EEDR;
}

СОДЕРЖАНИЕ ►

  • Произошла ошибка при загрузке скетча в Ардуино
    • programmer is not responding
    • a function-definition is not allowed arduino ошибка
    • expected initializer before ‘}’ token arduino ошибка
    • ‘что-то’ was not declared in this scope arduino ошибка
    • No such file or directory arduino ошибка
  • Compilation error: Missing FQBN (Fully Qualified Board Name)

Ошибки компиляции Arduino IDE возникают при проверке или загрузке скетча в плату, если код программы содержит ошибки, компилятор не может найти библиотеки или переменные. На самом деле, сообщение об ошибке при загрузке скетча связано с невнимательностью самого программиста. Рассмотрим в этой статье все возможные ошибки компиляции для платы Ардуино UNO R3, NANO, MEGA и пути их решения.

Произошла ошибка при загрузке скетча Ардуино

Самые простые ошибки возникают у новичков, кто только начинает разбираться с языком программирования Ардуино и делает первые попытки загрузить скетч. Если вы не нашли решение своей проблемы в статье, то напишите свой вопрос в комментариях к этой записи и мы поможем решить вашу проблему с загрузкой (бесплатно!).

avrdude: stk500_recv(): programmer is not responding

Что делать в этом случае? Первым делом обратите внимание какую плату вы используете и к какому порту она подключена (смотри на скриншоте в правом нижнем углу). Необходимо сообщить Arduino IDE, какая плата используется и к какому порту она подключена. Если вы загружаете скетч в Ардуино Nano V3, но при этом в настройках указана плата Uno или Mega 2560, то вы увидите ошибку, как на скриншоте ниже.

Ошибка: programmer is not responding

Ошибка Ардуино: programmer is not responding

Такая же ошибка будет возникать, если вы не укажите порт к которому подключена плата (это может быть любой COM-порт, кроме COM1). В обоих случаях вы получите сообщение — плата не отвечает (programmer is not responding). Для исправления ошибки надо на панели инструментов Arduino IDE в меню «Сервис» выбрать нужную плату и там же, через «Сервис» → «Последовательный порт» выбрать порт «COM7».

a function-definition is not allowed here before ‘{‘ token

Это значит, что в скетче вы забыли где-то закрыть фигурную скобку. Синтаксические ошибки IDE тоже распространены и связаны они просто с невнимательностью. Такие проблемы легко решаются, так как Arduino IDE даст вам подсказку, стараясь отметить номер строки, где обнаружена ошибка. На скриншоте видно, что строка с ошибкой подсвечена, а в нижнем левом углу приложения указан номер строки.

Ошибка: a function-definition is not allowed

Ошибка: a function-definition is not allowed here before ‘{‘ token

expected initializer before ‘}’ token   expected ‘;’ before ‘}’ token

Сообщение expected initializer before ‘}’ token говорит о том, что вы, наоборот где-то забыли открыть фигурную скобку. Arduino IDE даст вам подсказку, но если скетч довольно большой, то вам придется набраться терпения, чтобы найти неточность в коде. Ошибка при компиляции программы: expected ‘;’ before ‘}’ token говорит о том, что вы забыли поставить точку с запятой в конце командной строки.

‘что-то’ was not declared in this scope

Что за ошибка? Arduino IDE обнаружила в скетче слова, не являющиеся служебными или не были объявлены, как переменные. Например, вы забыли продекларировать переменную или задали переменную ‘DATA’, а затем по невнимательности используете ‘DAT’, которая не была продекларирована. Ошибка was not declared in this scope возникает при появлении в скетче случайных или лишних символов.

Ошибка Ардуино: was not declared in this scope

Ошибка Ардуино: was not declared in this scope

Например, на скриншоте выделено, что программист забыл продекларировать переменную ‘x’, а также неправильно написал функцию ‘analogRead’. Такая ошибка может возникнуть, если вы забудете поставить комментарий, написали функцию с ошибкой и т.д. Все ошибки также будут подсвечены, а при нескольких ошибках в скетче, сначала будет предложено исправить первую ошибку, расположенную выше.

exit status 1 ошибка компиляции для платы Arduino

Данная ошибка возникает, если вы подключаете в скетче библиотеку, которую не установили в папку libraries. Например, не установлена библиотека ИК приемника Ардуино: fatal error: IRremote.h: No such file or directory. Как исправить ошибку? Скачайте нужную библиотеку и распакуйте архив в папку C:Program FilesArduinolibraries. Если библиотека установлена, то попробуйте скачать и заменить библиотеку на новую.

exit status 1 Ошибка компиляции для Arduino Nano

exit status 1 Ошибка компиляции для платы Arduino Nano

Довольно часто у новичков выходит exit status 1 ошибка компиляции для платы arduino uno /genuino uno. Причин данного сообщения при загрузке скетча в плату Arduino Mega или Uno может быть огромное множество. Но все их легко исправить, достаточно внимательно перепроверить код программы. Если в этом обзоре вы не нашли решение своей проблемы, то напишите свой вопрос в комментариях к этой статье.

missing fqbn (fully qualified board name)

Ошибка возникает, если не была выбрана плата. Обратите внимание, что тип платы необходимо выбрать, даже если вы не загружаете, а, например, делаете компиляцию скетча. В Arduino IDE 2 вы можете использовать меню выбора:
— список плат, которые подключены и были идентифицированы Arduino IDE.
— или выбрать плату и порт вручную, без подключения микроконтроллера.

Tags: ESP8266

The EEPROM is an internal memory of the ESP8266 microcontroller which allows to keep in memory data after restarting the card. When working with microcontrollers, it is interesting to keep in memory data such as the identifier and the password of the Wifi.

Material

  • Computer
  • NodeMCU ESP8266
  • USB A Male/Micro B Male Cable

Principle of operation

The ESP8266 microcontroller has a Flash memory area to simulate the EEPROM of the Arduino. This is a special memory location in the microcontroller where data remains in memory even after the board is turned off. One important thing to note is that the EEPROM has a limited size and life span. The memory cells can be read as many times as necessary but the number of write cycles is limited to 100,000. It is advisable to pay close attention to the size of the stored data and how often you want to update it. The overall flash memory size is usually 4MB. The EEPROM of the ESP8266 has a size of 4kB.

If you want to record real-time data from a fleet of sensors to plot curves, it is best to go for an SD card module to store the data.

Code with the EEPROM library

To interface with the EEPROM of the ESP8266, we can use the EEPROM.h library, very similar to the one for Arduino with some differences. Before using the function, we have to initialize the size of the memory with begin() and the update function does not exist but the write function does something similar.

  • begin() to initialize the memory size
  • put() to write
  • get() to read
  • commit() to validate changes

Other functions of the library can be used depending on the use you have of the EEPROM.

//Libraries
#include <EEPROM.h>//https://github.com/esp8266/Arduino/blob/master/libraries/EEPROM/EEPROM.h

//Constants
#define EEPROM_SIZE 12

void setup() {
  //Init Serial USB
  Serial.begin(115200);
  Serial.println(F("Initialize System"));
  //Init EEPROM
  EEPROM.begin(EEPROM_SIZE);

  //Write data into eeprom
  int address = 0;
  int boardId = 18;
  EEPROM.put(address, boardId);
  address += sizeof(boardId); //update address value

  float param = 26.5;
  EEPROM.put(address, param);
  EEPROM.commit();

  //Read data from eeprom
  address = 0;
  int readId;
  EEPROM.get(address, readId);
  Serial.print("Read Id = ");
  Serial.println(readId);
  address += sizeof(readId); //update address value

  float readParam;
  EEPROM.get(address, readParam); //readParam=EEPROM.readFloat(address);
  Serial.print("Read param = ");
  Serial.println(readParam);

  EEPROM.end();
}

void loop() {}

Result

The read values correspond to the stored values. You can remove the writing part and run the code again to check that the values are well kept in memory.

Applications

  • Keep in memory the ssid and password of the Wifi network on an ESP8266

Sources

  • EEPROM library for ESP8266

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Понравилась статья? Поделить с друзьями:
  • Eeprom version error initialize eeprom anet a8
  • Eeprom error кондиционер samsung
  • Eeprom error turnigy
  • Eeprom error flag set
  • Eeprom does not respond or write error wp 7 pin 0