реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Нужна помощь с eeprom.h
CheGuevaravlc
сообщение Mar 25 2010, 18:24
Сообщение #1





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Злодей
сообщение Mar 26 2010, 01:43
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



volatile char numberOfChar = 0;
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 26 2010, 04:56
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(CheGuevaravlc @ Mar 25 2010, 22:24) *

Вы [censored], полагая, что задержки по 500мс и записи в eeprom при запрещенных прерываниях очень помогают в работе прерывания УАРТа. Скажу по секрету, что так никто не делает
Go to the top of the page
 
+Quote Post
Злодей
сообщение Mar 26 2010, 05:18
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



А чем плоха задержка в 500мс, она что, запрещает прерывания?
Go to the top of the page
 
+Quote Post
CheGuevaravlc
сообщение Mar 26 2010, 06:50
Сообщение #5





Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211



Цитата(Злодей @ Mar 26 2010, 04:43) *
volatile char numberOfChar = 0;

А поясните пожалуйста, что это значит? И как это влияет?

Цитата(_Pasha @ Mar 26 2010, 07:56) *
Вы [censored], полагая, что задержки по 500мс и записи в eeprom при запрещенных прерываниях очень помогают в работе прерывания УАРТа.

Задержка там стоит скорее от безысхдности. smile.gif Вообще, уарту это помогает, кажтся. Хотя спорить не буду. А где я запрещаю прерывания?

Сообщение отредактировал CheGuevaravlc - Mar 26 2010, 06:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 26 2010, 09:46
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
CheGuevaravlc
сообщение Mar 26 2010, 14:22
Сообщение #7





Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211



Цитата(Сергей Борщ @ Mar 26 2010, 12:46) *

Так или иначе, не помогло.

Объясните, как вообще операция может изменять переменную, не имеющую к ней никакого отношения, да еще и не каждый раз?
Да, гугл я уже спрашивал.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 26 2010, 15:42
Сообщение #8


;
******

Группа: Участник
Сообщений: 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));//Читаю его же обратно,

Нашел. Просто, вероятно, никто не захотел разгадывать заднепроходные лабиринты. Каков смысл приведенных действий, лучше разберитесь сами. smile.gif
Go to the top of the page
 
+Quote Post
CheGuevaravlc
сообщение Mar 27 2010, 06:38
Сообщение #9





Группа: Участник
Сообщений: 4
Регистрация: 25-03-10
Пользователь №: 56 211



Цитата(_Pasha @ Mar 26 2010, 18:42) *
Каков смысл приведенных действий, лучше разберитесь сами. smile.gif


Проверить, нормально ли все работает. Ответ: нет. Самый простой пример, чтобы работать с еепром. Дальше, можно добавлять до бесконечности. Но если он даже так не работает?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 27 2010, 08:02
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(CheGuevaravlc @ Mar 27 2010, 09:38) *
Но если он даже так не работает?

Курим мануал по avr-libc.
И смотрим, какие параметры переданы в функциях, и удивляемся, какую чушь написали.
Все.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016