0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 14
1

Подскажите как исправить

15.11.2015, 14:18. Показов 2871. Ответов 4
Метки нет (Все метки)

Здравствуйте в этом коде при компиляции в строке 85 возникает ошибка :
In file included from sketch_nov15c.ino:4:0:
sketch_nov15c.ino:85:26: error: variable 'preset' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
sketch_nov15c.ino: In function 'void EEPROM_write(unsigned int, unsigned char)':
sketch_nov15c.ino:273:20: error: 'EEWE' was not declared in this scope
sketch_nov15c.ino:276:15: error: 'EEMWE' was not declared in this scope
sketch_nov15c.ino:277:15: error: 'EEWE' was not declared in this scope
sketch_nov15c.ino: In function 'unsigned char EEPROM_read(unsigned int)':
sketch_nov15c.ino:281:20: error: 'EEWE' was not declared in this scope
variable 'preset' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Подскажите пожалуйста почему она возникает и как исправить?
C++
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;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2015, 14:18
Ответы с готовыми решениями:

Подскажите как исправить
Здравствуйте, подскажите как исправить пожалуйста. //отобаение всех аргументов команднй строки...

Подскажите как исправить
Здравствуйте, подскажите пожалуйста как исправить эту ошибку при восстановлении БД из дампа?

Как исправить подскажите
Установил форум, но вот проблема. при написании сообщения растягивает на всю длину как автора и его...

Подскажите как исправить ошибку
Во время проведения эксперимента вылетает ошибка. Подскажите что это и как исправить. Спасибо

4
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
19.11.2015, 03:16 2
Вы читайте, всё-таки, что вам компилятор пишет...
Пишет открытым текстом, что надо сделать. На чистом английском языке.

variable 'preset' must be const in order to be put into read-only section
variable 'preset' must be const
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static const uint16_t preset[] PROGMEM= {
  9080,
  10100,
  10140,
  10180, // hr1
  10220,
  10290, // Bayern2
  10340, // ???
  10390, // * hr3
  10430,
  10490,
  10670,
  10720
};
0
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 14
04.12.2015, 19:38  [ТС] 3
С этим я тоже разобрался.Но возникает ошибка в строке №283-'EEWE' was not declared in this scope?
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
04.12.2015, 23:16 4
Добавьте в скетч. где-нибудь сверху.
C++
1
2
3
4
5
/* EEPROM Control Register */
#define    EERIE   3
#define    EEMWE   2
#define    EEWE    1
#define    EERE    0
1
0 / 0 / 0
Регистрация: 04.11.2013
Сообщений: 14
05.12.2015, 21:35  [ТС] 5
Большое спасибо помогло!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2015, 21:35
Помогаю со студенческими работами здесь

подскажите как исправить ошибки
билдер 6 ошибка : Public symbol '_File_read_mass' defined in both module C:\PRG\UNIT1.OBJ and...

Подскажите как исправить запрос
Есть две таблицы resursy и zayavki(data, kto, komu,resurs). Необходимо вывести данные всех заявок...

Как исправить опросник , подскажите
Дали опросник: opros.asp. И я не могу его исправить, не работает помогите пожалуйста! Вот...

Подскажите как исправить код
ТЗ: В матрице в строках с отрицательным элементом на главной диагонали найти наибольший элемент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru