Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
22.03.2011, 21:10
|
|
Прохожий
Регистрация: 20.05.2009
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
Не получается правильно читать информацию из EEPROM блоками.
Программа должна считывать из EEPROM 40 блоков по 16 байт и
обрабатывать их в функции modul_1(). Если произвести чтение
в цикле while (1), то данные читаются неправильно и микроконтроллер
не работает. Не помогает отключнеие прерываний, ожидание готовности
EEPROM. Если прочитать любой блок из EEPROM до цикла, то брабатывается всё правильно.
Адрес информации в EEPROM превышает 8 бит и при обработке используются 8ми и 16 разрядные переменные.
Пожалуйста, подскажите способ решения проблемы или в чём у меня ошибка ?
#include ‹avr/interrupt.h›
volatile unsigned char EEPR_array[15];
int main(void)
{
modul = 1 ;
// чтение настроек модуля из ЕЕПРОМ
m2 = modul - 1 ;
adr_modul = m2*16;
eeprom_busy_wait();
eeprom_read_block((void*)&EEPR_array, (const void*)adr_modul, 16);
while (1)
{
// чтение настроек модуля из ЕЕПРОМ
/*
cli ();
m2 = modul - 1 ;
adr_modul = m2*16;
eeprom_busy_wait();
eeprom_read_block((void*)&EEPR_array, (const void*)adr_modul, 16);
sei ();
*/
modul_1(modul) ;
if ( modul ›= 40 ) modul = 0 ; // ограничение количества модулей 4м
modul++ ;
}
}
|
|
|
|
22.03.2011, 23:14
|
|
Вид на жительство
Регистрация: 21.10.2009
Сообщений: 343
Сказал спасибо: 180
Сказали Спасибо 64 раз(а) в 56 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
Попробуйте так
Код:
|
#include ‹avr/io.h›
#include ‹avr/eeprom.h›
uint16_t adr_modul;
volatile unsigned char EEPR_array[15];
int main(void)
{
adr_modul=0;
while (1)
{
eeprom_busy_wait();
eeprom_read_block(&EEPR_array, (uint8_t*)adr_modul, 16);
adr_modul+=16;
}
} |
В протеусе работает.
Последний раз редактировалось CodeNameHawk; 22.03.2011 в 23:20.
|
|
|
|
23.03.2011, 10:36
|
|
Прохожий
Регистрация: 20.05.2009
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
У меня есть возможность пользоваться аппаратным JTAG.
В нём пошагово и моя программа работает.
Я, конечно, попробую Ваш вариант, но, по-моему, возможно проблема в том, что данные считывавются в массив переменных а надо считывать в адрес ОЗУ. Возможно-ли привязать массив переменных к конкретному адресу ОЗУ и считывать данные из EEPROM туда ?
|
|
|
|
23.03.2011, 11:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
У Вас массив на 15 значений, а читаете Вы 16.
|
|
|
|
23.03.2011, 12:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
maw_1961, а смысл ?
Вы хотите что-то типа этого ?
union{
struct{
uint8 var1;
uint8 var2;
uint16 var3;
}str;
char cByte[4];
}un;
разнополые переменные в одном байтовом массиве.
Не помню, нужно ли выравнивать структуру по байту, посмотрите в самплах.
|
|
|
|
23.03.2011, 12:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
Сообщение от urry
|
Не помню, нужно ли выравнивать структуру по байту
|
В 8-ми битниках не нужно. Да и union тут тоже не нужен
Код:
|
typedef struct
{
uint8_t var1;
uint16_t var2;
float var3;
uint8_t var4[8];
} var_t;
var_t var;
var_t EEMEM var_eep;
...
eeprom_read_block((void*)&var, (void*)&var_eep, sizeof(var)); |
|
|
|
|
23.03.2011, 13:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
угу, согласен, юнион уже на автомате пишу
|
|
|
|
23.03.2011, 21:26
|
|
Прохожий
Регистрация: 20.05.2009
Сообщений: 6
Сказал спасибо: 2
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Проблемы с чтением блоков EEPROM MEGA128 под WinAVR
Сообщение от kison
|
У Вас массив на 15 значений, а читаете Вы 16.
|
БОЛЬШОЕ СПАСИБО !!!
Именно в этом и была шибка
( недочитал учебник....)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:04.
|
|