|
|
  |
Нужна помощь с eeprom.h |
|
|
|
Mar 25 2010, 18:24
|
Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211

|
Всем здравствуйте. Нужна помощь в следующем вопросе: Начинаю программировать в WinAVR для Atmega8515. Имеется простейшая программа: CODE typedef struct { char pass[8]; } password;
#define _NUM_OF_PASS (10) #define _PASS_START (_NUM_OF_PASS + sizeof(char))
char numberOfPass = 0; char numberOfChar = 0;
ISR(SIG_UART_RECV) //По прерыванию получаю по байту. { char temp; temp = UDR; //newpas.pass[numberOfChar] = temp; //UDR = numberOfChar; numberOfChar++; //Накапливаю счетчик }
int main() { USART_init(); SREG |= (1 << 7); while(1) { if (numberOfChar == 8) // Когда набрал 8 байт { numberOfChar = 0; //Обнуляю numberOfPass++; // Накапливаю другой счетчик
eeprom_write_block( &numberOfPass, _NUM_OF_PASS, sizeof(char));//Записываю его в память
char numTemp; eeprom_busy_wait(); eeprom_read_block((void*)&numTemp, (const void*)_NUM_OF_PASS, sizeof(char));//Читаю его же обратно, //для провеки UDR = numberOfPass; //И посылаю на комп второй счетчик _delay_ms(500); } } }
void USART_init() { UCSRA = 0; UCSRB |= (1 << 7) | (1 << 4) | (1 << 3); //UCSRB |= (1 << 4) | (1 << 3); UCSRC |= (1 << 7); UCSRC |= (1 << 1) | (1 << 2); UCSRC -= 128; UBRRH = 0; UBRRL = 47; }
Получаю: 1234567, на восьмой раз не плучаю ничего, потом опять 01234 и т.д. Если закомментить строку eeprom_read_block((void*)&numTemp, (const void*)_NUM_OF_PASS, sizeof(char)); то все нормально. Объясните пожалуйста, где я [CENSORED]?
Сообщение отредактировал IgorKossak - Mar 25 2010, 18:50
|
|
|
|
|
Mar 26 2010, 06:50
|
Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211

|
Цитата(Злодей @ Mar 26 2010, 04:43)  volatile char numberOfChar = 0; А поясните пожалуйста, что это значит? И как это влияет? Цитата(_Pasha @ Mar 26 2010, 07:56)  Вы [censored], полагая, что задержки по 500мс и записи в eeprom при запрещенных прерываниях очень помогают в работе прерывания УАРТа. Задержка там стоит скорее от безысхдности.  Вообще, уарту это помогает, кажтся. Хотя спорить не буду. А где я запрещаю прерывания?
Сообщение отредактировал CheGuevaravlc - Mar 26 2010, 06:51
|
|
|
|
|
Mar 26 2010, 09:46
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(CheGuevaravlc @ Mar 26 2010, 08:50)  А поясните пожалуйста, что это значит? И как это влияет? volatile
Цитата(CheGuevaravlc @ Mar 25 2010, 20:24)  Код eeprom_busy_wait(); eeprom_read_block((void*)&numTemp, (const void*)_NUM_OF_PASS, sizeof(char));//Читаю его же обратно, Первая строка лишняя. В исходниках eerd_block.S видно, что это действие выполняется перед операцией чтения, т.е. в начале eeprom_read_block(): Код 1: sbic _SFR_IO_ADDR (EECR), EEWE rjmp 1b
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 26 2010, 14:22
|
Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211

|
Цитата(Сергей Борщ @ Mar 26 2010, 12:46)  Так или иначе, не помогло. Объясните, как вообще операция может изменять переменную, не имеющую к ней никакого отношения, да еще и не каждый раз? Да, гугл я уже спрашивал.
|
|
|
|
|
Mar 26 2010, 15:42
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(CheGuevaravlc @ Mar 25 2010, 22:24)  Код #define _NUM_OF_PASS (10) ******************************** eeprom_write_block( &numberOfPass, _NUM_OF_PASS, sizeof(char));//Записываю его в память eeprom_read_block((void*)&numTemp, (const void*)_NUM_OF_PASS, sizeof(char));//Читаю его же обратно, Нашел. Просто, вероятно, никто не захотел разгадывать заднепроходные лабиринты. Каков смысл приведенных действий, лучше разберитесь сами.
|
|
|
|
|
Mar 27 2010, 06:38
|
Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211

|
Цитата(_Pasha @ Mar 26 2010, 18:42)  Каков смысл приведенных действий, лучше разберитесь сами.  Проверить, нормально ли все работает. Ответ: нет. Самый простой пример, чтобы работать с еепром. Дальше, можно добавлять до бесконечности. Но если он даже так не работает?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|