Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
TheMozddra
3 / 3 / 0
Регистрация: 28.10.2013
Сообщений: 36
1

Работа с EEPROM Attiny2313

29.05.2014, 21:00. Просмотров 2835. Ответов 5
Метки нет (Все метки)

Добрый вечер
Есть программа кодового замка для Attiny2313. Пользователь вводит код, этот код сверяется с тем, что сохранен в eeprom, при совпадении дверь открывается. Есть так же функция смены пароля.
В начале программы я задавала переменным, выделенным в eeprom, значение нуля. Если изначально им не присваивала какого-то значения, то программа не работала. В итоге, если использовать тот вариант кода, который у меня получился, несмотря на то, что пользователь сменил пароль на новый, после отключения питания в eeprom опять будут записаны нули, и пользователь не сможет открыть замок, используя старый код.

Пыталась задать нули до мэйна:
eeprom eeprom_kod[8]= {0,0,0,0,0,0,0,0};
Выдает ошибку.
Читала про то, что изначально в eeprom положено значение 0хFF, думала сделать условие, если если eeprom[i]==0xFF, то выставляем нули, но в этом случае программа выходит за рамки оперативной памяти.
Помогите,пожалуйста, как-нибудь выйти из ситуации
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
288
289
290
291
292
293
294
295
296
297
298
#include <tiny2313.h>       
#include <delay.h>       
                           
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18;PORTB
#endasm
#include <lcd.h>
#define ZAMOK PORTB.3
 
// инициализация энергонезависимой памяти для хранения кода 
eeprom unsigned char eeprom_kod[8];
 
// массив символов, соответствующих кнопкам на клавиатуре
flash unsigned char buttons[3][4]={{'1','4','7','*'},{'2','5','8','0'},{'3','6','9','#'}};
 
// переменные для хранения промежуточных данных
unsigned char kod[8], nkod[8];
unsigned char i,j,k,n,state;
 
 
char key_press()                    // функция опроса клавиатуры
{
while(1)
{
   while((~PIND & 0b01111000)!=0);  // ничего не делать, пока не отпустят кнопку
   for(i=0;i<3;i++)                 // перебор столбцов
   {
    PORTD=0xff & ~(0x01 << i);
    for(j=3;j<7;j++)                // пребор строк
    {
     if((PIND & (0x01 << j))==0)    // проверка нажатия на кнопу
     {
      if(buttons[i][j-3]=='*')      // дополнительная проверка для кнопки смены пароля
      {
       if((PIND & (0x01 << j))==0)  // если удерживаем кнопку смены пароля 
       {
        state=1;                    // то устанавливаем состояние 1 (смена пароля)
        return 0;                   // и выходим из функции, возвращая вместо символа ноль
       }
       else return buttons[i][j-3]; // если меньше 5 сек, то возвращаем символ
      }
      if((PIND & (0x01 << j))==0) return buttons[i][j-3]; // возвращаем символ
     }
    }
   }
}
}
 
 
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
 
// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
 
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xff;
 
// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x78;
DDRD=0x07;
 
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
 
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
 
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;
 
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x80;
 
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;
 
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
 
// LCD module initialization
lcd_init(16);
 
 
lcd_clear(); // очищаем дисплей
eeprom_kod[0]='0'  ;             // инициализируем код в eeprom
eeprom_kod[1]='0' ;
eeprom_kod[2]='0'; 
eeprom_kod[3]='0';
eeprom_kod[4]='0'  ;
eeprom_kod[5]='0' ;
eeprom_kod[6]='0'; 
eeprom_kod[7]='0';
// считываем текущий код из энергонезависимой памяти 
kod[0]=eeprom_kod[0]; 
kod[1]=eeprom_kod[1]; 
kod[2]=eeprom_kod[2]; 
kod[3]=eeprom_kod[3];
kod[4]=eeprom_kod[4]; 
kod[5]=eeprom_kod[5]; 
kod[6]=eeprom_kod[6]; 
kod[7]=eeprom_kod[7];
 
 
 
state=0;     // устанавливаем состояние 0 (ввод кода)
 
while (1)
{
 
   switch (state)
   {
    case 0:                       // режим "0" - ввод кода
     lcd_clear();
     lcd_putsf("Vvedite kod:");   // просим ввести код
     lcd_gotoxy(0,1);             // переводим курсор на начало второй строки
 
     for(n=0;n<8;n++)             // опрашиваем клавиатуру и записывам символы
     {                            // в массив nkode[]
      k=key_press();
      if(k==0)break;              // если ф-я опроса клавиатуры вернула "0", то прекращаем ввод кода
      nkod[n]=k;                  // иначе, сохраняем полученый символ в nkode[]
      lcd_putchar('*');           // и выводим на дисплей "*"
     }
     if(k==0)break;               // если ф-я опроса вернула "0", то прерываем выполнение оператора switch
                                  // в результате он будет выполнен сначала и мы перейдем к смене кода
 
     while(key_press()!='#');     // дожидаемся нажатия "#" в подтверждение ввода кода
 
     // проверяем, совпадает ли ввеленный код с сохраненным в памяти
     // если да - открываем замок, а если нет, то ничего не делаем
     // потом, в любом случае, переходим к вводу пароля
     if(nkod[0]==kod[0] && nkod[1]==kod[1] && nkod[2]==kod[2] && nkod[3]==kod[3]&& nkod[4]==kod[4]&& nkod[5]==kod[5]&& nkod[6]==kod[6]&& nkod[7]==kod[7])
     {
      lcd_clear();
      lcd_putsf("OPEN");
      ZAMOK=1;
      delay_ms(1000);
      ZAMOK=0;  
     // delay_ms(1000) ; 
     }
     else
     {
      lcd_clear();
      lcd_putsf("CLOSED");
      delay_ms(3000);
     }
 
     break;                        // выходим из оператора switch
 
    case 1:                        // режим "1" - изменение пароля
     lcd_clear();
     lcd_putsf("Izmenenie koda");
     lcd_gotoxy(0,1);
     delay_ms(1000);
 
     lcd_clear();
     lcd_putsf("Stariy kod");
     lcd_gotoxy(0,1);
 
     delay_ms(1000);
 
     for(n=0;n<8;n++)
     {
      k=key_press();
      if(k==0)break;
      nkod[n]=k;
      lcd_putchar('*');
     }
     if(k==0)break;
 
     while(key_press()!='#');
 
     if(nkod[0]!=kod[0] || nkod[1]!=kod[1] || nkod[2]!=kod[2] || nkod[3]!=kod[3]|| nkod[4]!=kod[4]|| nkod[5]!=kod[5]|| nkod[6]!=kod[6]|| nkod[7]!=kod[7])
     {
      lcd_clear();
      lcd_putsf("Kod ne verniy!");
      delay_ms(1000);
      state=0;
      break;
     }
 
     lcd_clear();
     lcd_putsf("Noviy kod:");
     lcd_gotoxy(0,1);
 
     for(n=0;n<8;n++)
     {
      k=key_press();
      if(k==0)break;
      kod[n]=k;
      lcd_putchar('*');
     }
     if(k==0)break;
 
     while(key_press()!='#');
 
     lcd_clear();
     lcd_putsf("Povtorite kod:");
     lcd_gotoxy(0,1);
 
     for(n=0;n<8;n++)
     {
      k=key_press();
      if(k==0)break;
      nkod[n]=k;
      lcd_putchar('*');
     }
     if(k==0)break;
 
     while(key_press()!='#');
 
     if(kod[0]!=nkod[0] || kod[1]!=nkod[1] || kod[2]!=nkod[2] || kod[3]!=nkod[3]|| kod[4]!=nkod[4]|| kod[5]!=nkod[5]|| kod[6]!=nkod[6]|| kod[7]!=nkod[7])
     {
      lcd_clear();
      lcd_putsf("Ne sovpadayut!");
      delay_ms(1000);
      state=0;
      break;                        // выходим из оператора switch
     }
     else
     {
      // сохраняем новый код в энергонезависимую память
      eeprom_kod[0]=nkod[0];
      eeprom_kod[1]=nkod[1];
      eeprom_kod[2]=nkod[2];
      eeprom_kod[3]=nkod[3];  
      eeprom_kod[4]=nkod[4];
      eeprom_kod[5]=nkod[5];
      eeprom_kod[6]=nkod[6];
      eeprom_kod[7]=nkod[7];
 
 
      lcd_clear();
      lcd_putsf("Kod izmenen!");
      delay_ms(1000);
      state=0;
     }
     break;                        // выходим из оператора switch
   }
};
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2014, 21:00
Ответы с готовыми решениями:

Работа с EEPROM
По заданию требуется спроектировать блок: подключение последовательного ПЗУ. То есть составить...

Подбор и работа с EEPROM
Споткнулся на этапе разработки электросхемы-в кратце задача такая, есть некоторое устройство где...

PIC. Работа с EEPROM
Подскажите пожалуйста как сделать - буду очень сильно благодарна Использую ПО - MPLAB IDE v8.87 ...

Работа с EEPROM (логика записи данных, чтение и защита)
Здравствуйте, подскажите алгоритм или код чтения и записи в EEPROM с равномерным истиранием ячеек,...

Работа с семисегментником на ATtiny2313
Нужна помощь. Используемый софт: AVR Studio 6, Proteus 7.8 Задача: По кнопке должен загораться...

5
raxp
10190 / 6573 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
29.05.2014, 21:14 2
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
void main(void){
 int nkey;
 unsigned int vrol;
 unsigned int EEDATA1;
 
 _SEI();
 
 EEDATA1 = EEPROM_read(0x00); //read EEPROM-
 EEPROM_write(0x00,123);
...
 
}
 
 
 
// EEARH, EEARL - registri adressov danih v EEPROM 
// EEDR - Register Dannih v EEPROM 
// EECR - Register kontrolya sostoyaniya EEPROM
// EERIE - Register ожидания доступности EECR
// EEMWE - Register монопольного разрешения            записи EECR
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR & (1<<EERIE));
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1<<EEMWE);
EECR |= (1<<EERIE);
}
 
unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));
EEAR = uiAddress;
EECR |= (1<<EERE);
return EEDR;
}
0
Voland_
1656 / 1045 / 98
Регистрация: 04.01.2010
Сообщений: 3,554
29.05.2014, 21:56 3
вот: (вы забыли указать тип переменной)
Цитата Сообщение от TheMozddra Посмотреть сообщение
// инициализация энергонезависимой памяти для хранения кода
eeprom unsigned char eeprom_kod[8]={0,0,0,0,0,0,0,0};
Добавлено через 44 секунды
raxp, в cvavr это все встроено.
1
raxp
10190 / 6573 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
29.05.2014, 22:20 4
...а где тут упоминание коде-визион?
0
TheMozddra
3 / 3 / 0
Регистрация: 28.10.2013
Сообщений: 36
29.05.2014, 23:55  [ТС] 5
Цитата Сообщение от Voland_ Посмотреть сообщение
(вы забыли указать тип переменной)
ой, да, спасибо
0
Voland_
1656 / 1045 / 98
Регистрация: 04.01.2010
Сообщений: 3,554
30.05.2014, 09:47 6
Цитата Сообщение от raxp Посмотреть сообщение
...а где тут упоминание коде-визион?
ну в общем, да, не упоминается . Просто когда в коде вы видите в типах переменных eeprom и flash, то это уже на 99% CVAVR. Так что я уже автоматом переключился на нужный диалект.
0
30.05.2014, 09:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2014, 09:47

Работа с портами ATtiny2313
Делаю вот что. #define F_CPU 8000000UL #include &lt;avr/io.h&gt; #include &lt;util/delay.h&gt; int...

Странная работа таймера на ATTiny2313
Добрый чего там у вас. Запускаю обычный таймер1 с предделителем 8. в прерывании переполнения...

Работа с EEPROM на Си
Добрый день! Только начал осваивать Си и возникла необходимость сохранять инфу в EEPROM. Я...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru