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, то вы увидите ошибку, как на скриншоте ниже.
Такая же ошибка будет возникать, если вы не укажите порт к которому подключена плата (это может быть любой COM-порт, кроме COM1). В обоих случаях вы получите сообщение — плата не отвечает (programmer is not responding). Для исправления ошибки надо на панели инструментов Arduino IDE в меню «Сервис» выбрать нужную плату и там же, через «Сервис» → «Последовательный порт» выбрать порт «COM7».
a function-definition is not allowed here before ‘{‘ token
Это значит, что в скетче вы забыли где-то закрыть фигурную скобку. Синтаксические ошибки IDE тоже распространены и связаны они просто с невнимательностью. Такие проблемы легко решаются, так как Arduino IDE даст вам подсказку, стараясь отметить номер строки, где обнаружена ошибка. На скриншоте видно, что строка с ошибкой подсвечена, а в нижнем левом углу приложения указан номер строки.
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 возникает при появлении в скетче случайных или лишних символов.
Например, на скриншоте выделено, что программист забыл продекларировать переменную ‘x’, а также неправильно написал функцию ‘analogRead’. Такая ошибка может возникнуть, если вы забудете поставить комментарий, написали функцию с ошибкой и т.д. Все ошибки также будут подсвечены, а при нескольких ошибках в скетче, сначала будет предложено исправить первую ошибку, расположенную выше.
exit status 1 ошибка компиляции для платы Arduino
Данная ошибка возникает, если вы подключаете в скетче библиотеку, которую не установили в папку libraries. Например, не установлена библиотека ИК приемника Ардуино: fatal error: IRremote.h: No such file or directory. Как исправить ошибку? Скачайте нужную библиотеку и распакуйте архив в папку C:Program FilesArduinolibraries. Если библиотека установлена, то попробуйте скачать и заменить библиотеку на новую.
Довольно часто у новичков выходит 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