Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Работа с еепром 24Схх Помогите разобраться

Непрочитано 08.09.2011, 13:57  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

По логике код записи и чтения байта правильный.Ох,не доверял бы я сильно симуляторам... В реальном железе может и работает. А программа i2c_read(0); выдает ACK? По стандарту после чтения последнего байта(а так как вы читаете по одному он у вас и есть последний), не надо выдавать подтверждения приема байта.Может поэтому симулятор глючит.
зы. В железе это не актуально(во всяком случае для 24сxx).По этому проще написать свою программу обмена(не сильно сложный уж протокол под i2c),чем доверять готовым библиотекам.
Реклама:

Последний раз редактировалось heady69; 08.09.2011 в 14:10.
heady69 вне форума  
Непрочитано 08.09.2011, 14:19  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

А есть у Вас наработки по протоколу i2c ?
Собственно готовые функции чтения , записи.
С ув. Артем
artyomugr вне форума  
Непрочитано 08.09.2011, 14:24  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Сообщение от ForcePoint Посмотреть сообщение
Если хотите, что-бы ошибку нашли в Вашем коде, то его и следовало-бы привести. Т.е. собственно eep_write и eep_read вместо всей этой байды с кривыми каментами в пером посте.
Простите пожалуйста.. немного позже выложу исправленый код.
artyomugr вне форума  
Непрочитано 08.09.2011, 14:32  
heady69
Прописка
 
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
heady69 на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

А под что? Из старого есть под 8051 (Keil) Си(побайтовый\постраничный выкладывал выше),ASM. PIC(asm). Под AVR нет (использую аппаратный TWI).
Здесь есть неплохой пример: http://avrlab.com/node/127

Последний раз редактировалось heady69; 08.09.2011 в 14:58.
heady69 вне форума  
Сказали "Спасибо" heady69
artyomugr (08.09.2011)
Непрочитано 08.09.2011, 16:10  
artyomugr
Вид на жительство
 
Аватар для artyomugr
 
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
artyomugr на пути к лучшему
По умолчанию Re: Работа с еепром 24Схх Помогите разобраться

Сообщение от heady69 Посмотреть сообщение
А под что? Из старого есть под 8051 (Keil) Си(побайтовый\постраничный выкладывал выше),ASM. PIC(asm). Под AVR нет (использую аппаратный TWI).
Здесь есть неплохой пример: http://avrlab.com/node/127
По ссылке отличнейший пример! Спасибо! А не маленькая задержка при условии старт (НОП) в один такт?

Вот так написан у меня код:
как и обещал, выкладываю.

[HTML]/************************************************** *************************************
+ Читаем ячейку из 24с02.
+ В параметрах указывается адрес читаемой ячейки.
+ Функция возвращает прочитаное из ячейки.
************************************************** **************************************/
unsigned char eep_read(unsigned char address) {
unsigned char data; //переменная для прочитаных данных
i2c_start(); //посылаем команду "старт" в шину i2c
i2c_write(EEPROM_BUS_ADDRESS); //посылаем в шину адрес устройства
i2c_write(address); //посылаем в шину адрес читаемой ячейки
i2c_start(); //снова посылаем "старт" в шину
i2c_write(EEPROM_BUS_ADDRESS | 1); //незнаю зачем но без этого не работает
data=i2c_read(0); //принимаем данные с лини и сохраняем в переменную
i2c_stop(); //посылаем команду "стоп"
return data; //возврощаем значение прочитаного
}

/************************************************** *************************************
+ Запись данных в ячейку 24с02.
+ В параметрах указывается адрес записываемой ячейки (adress).
+ Также указуем в параметрах данные которые надо записать в ячейку.
************************************************** **************************************/
void eep_write(unsigned char address, unsigned char data) {
i2c_start(); //посылаем команду "старт" в шину i2c
i2c_write(EEPROM_BUS_ADDRESS); //посылаем в шину адрес устройства
i2c_write(address);
//i2c_ack; //посылаем в шину адрес записываемой ячейки
i2c_write(data); //посылаем данные для записи
i2c_stop(); //посылаем команду "стоп"
} [/HTML]

А вот тут я пишу и читаю

[HTML]void epp_save() { //Сохранение данных в еепром






eep_write(0x01,temp1); // Запись данных темп в Еепром
eep_write(0x02,temp2);
eep_write(0x03,temp3);
eep_write(0x04,temp4);
eep_write(0x05,temp5);
eep_write(0x06,temp6);


eep_write(0x07,term_set_LR);
eep_write(0x08,term_set_P);
eep_write(0x09,delta_LR);
eep_write(0x0A,delta_P);
eep_write(0x0B,term_max_LR);
eep_write(0x0C,term_max_P);
eep_write(0x0D,term_max_delta_LR);
eep_write(0x0E,term_max_delta_P);

eep_write(0x0F,error_calendar_current0);

eep_write(0x10,EPP_SING);// сигнатура соответствия Еепром

eep_write(0x11,error_calendar_current1);

eep_write(0x12,error_calendar_volt_out0);
eep_write(0x13,error_calendar_volt_out1);

eep_write(0x14,error_calendar_volt_in0);
eep_write(0x15,error_calendar_volt_in1);

eep_write(0x16,error_calendar_temperature_left0);
eep_write(0x17,error_calendar_temperature_left1);

eep_write(0x18,error_calendar_temperature_right0);
eep_write(0x19,error_calendar_temperature_right1);

eep_write(0x1A,error_calendar_temperature_P0);
eep_write(0x1B,error_calendar_temperature_P1);

eep_write(0x1C,error_temperature_sensor0);
eep_write(0x1D,error_temperature_sensor1);



eep_write(0x1E,control_pass0);
eep_write(0x1F,control_pass1);
eep_write(0x20,control_pass2);
eep_write(0x21,control_pass3);
delay_ms(20);
//eep_write(0x22,control_pass0);
//eep_write(0x23,control_pass3);

}

void epp_load() { //Загрузка данных с еепром



if (eep_read(0x10)==EPP_SING) { //Если сигнатура прявельная читаем данные с еепром
temp1=eep_read(0x01); // загрузка из еепром при выходе из меню
temp2=eep_read(0x02);
temp3=eep_read(0x03);
temp4=eep_read(0x04); // управление режимами
temp5=eep_read(0x05);
temp6=eep_read(0x06);

term_set_LR=eep_read(0x07); // читаем установленную температуру
term_set_P=eep_read(0x0; // читаем установленную температуру
delta_LR=eep_read(0x09); // читаем дельту
delta_P=eep_read(0x0A); // читаем дельту
term_max_LR=eep_read(0x0B); // читаем установленную температуру
term_max_P=eep_read(0x0C); // читаем установленную температуру
term_max_delta_LR=eep_read(0x0D); // читаем дельту
term_max_delta_P=eep_read(0x0E); // читаем дельту


error_calendar_current0 = eep_read(0x0F); // читаем количество ошибок по току в первом байте
error_calendar_current1 = eep_read(0x11); // читаем количество ошибок по току во втором байте

error_calendar_volt_out0 = eep_read(0x12); // читаем количество ошибок по выходному напряжению в первом байте
error_calendar_volt_out1 = eep_read(0x13); // читаем количество ошибок по выходному напряжению во втором байте

error_calendar_volt_in0 = eep_read(0x14); // читаем количество ошибок по напряжению на входе в первом байте
error_calendar_volt_in1 = eep_read(0x15); // читаем количество ошибок по напряжению на входе во втором байте



error_calendar_temperature_left0 = eep_read(0x16);
error_calendar_temperature_left1 = eep_read(0x17);

error_calendar_temperature_right0 = eep_read(0x1;
error_calendar_temperature_right1 = eep_read(0x19);

error_calendar_temperature_P0 = eep_read(0x1A);
error_calendar_temperature_P1 = eep_read(0x1B);

error_temperature_sensor0 = eep_read(0x1C);
error_temperature_sensor1 = eep_read(0x1D);

control_pass0 = eep_read(0x1E);
control_pass1 = eep_read(0x1F);
control_pass2 = eep_read(0x20);
control_pass3 = eep_read(0x21);
//control_pass0 = eep_read(0x22);
//control_pass3 = eep_read(0x23);

}else{
temp1=1; // если сигнатура битая
temp2=1; // грузим единици.
temp3=1;
temp4=1;
temp5=1;
temp6=1;

term_set_LR=0; // читаем установленную температуру
term_set_P=0; // читаем установленную температуру
delta_LR=0; // читаем дельту
delta_P=0; // читаем дельту
term_max_LR=0; // читаем установленную температуру
term_max_P=0; // читаем установленную температуру
term_max_delta_LR=0; // читаем дельту
term_max_delta_P=0; // читаем дельту


error_calendar_current0=0; // читаем количество ошибок по току в первом байте
error_calendar_current1=0; // читаем количество ошибок по току во втором байте

error_calendar_volt_out0=0; // читаем количество ошибок по выходному напряжению в первом байте
error_calendar_volt_out1=0; // читаем количество ошибок по выходному напряжению во втором байте

error_calendar_volt_in0=0; // читаем количество ошибок по напряжению на входе в первом байте
error_calendar_volt_in1=0; // читаем количество ошибок по напряжению на входе во втором байте



error_calendar_temperature_left0=0;
error_calendar_temperature_left1=0;

error_calendar_temperature_right0=0;
error_calendar_temperature_right1=0;

error_calendar_temperature_P0=0;
error_calendar_temperature_P1=0;

error_temperature_sensor0=0;
error_temperature_sensor1=0;

control_pass0=0;
control_pass1=0;
control_pass2=0;
control_pass3=0;

}
} [/HTML]

[HTML]if (BTN_PLUS==0 && BTN_MINUS==0)
{
control_pass0 = pass0;
control_pass1 = pass1;
control_pass2 = pass2;
control_pass3 = pass3;

a=4;
b=1;
eep_write();
flags_button=1;
}

if (BTN_PLUS & BTN_MINUS & BTN_MENU)
{
flags_button=0;
}

if (BTN_PLUS==0 & a==4 & flags_button==0)
{
flags_button=1;
a=0;
}[/HTML]

Последний раз редактировалось artyomugr; 08.09.2011 в 16:17.
artyomugr вне форума  
Непрочитано 10.09.2011, 13:34  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,457
Сказал спасибо: 3,225
Сказали Спасибо 3,511 раз(а) в 2,392 сообщении(ях)
ForcePoint на пути к лучшему
Восклицание Re: Работа с еепром 24Схх Помогите разобраться

Сообщение от artyomugr Посмотреть сообщение
Вот так написан у меня код:
как и обещал, выкладываю.
Код:
...
void eep_write(unsigned char address, unsigned char data) {   
i2c_start();                           //посылаем команду "старт" в шину i2c
i2c_write(EEPROM_BUS_ADDRESS);         //посылаем в шину адрес устройства
i2c_write(address);
//i2c_ack;                    //посылаем в шину адрес записываемой ячейки
i2c_write(data);                       //посылаем данные для записи
i2c_stop();                            //посылаем команду "стоп"
}
...
Неправильно я выразился в своем пожелании видеть подробности. Нужны были-бы подробности по процедурам i2c_xxxx.
А по сути вопроса - надо обязательно получать готовность ведомой ИМС (9-й бит - !ACK) после передачи её адреса (в документации Atmel - см. раздел "Acknowledge polling"). Или, по крайней мере, - в процедуре записи. Т.е. как-то так:
Код:
void eep_write(unsigned char address, unsigned char data) {
do {
i2c_start(); //посылаем команду "старт" в шину i2c i2c_write(EEPROM_BUS_ADDRESS); //посылаем адрес устройства
} while !(ACK); i2c_write(address); //i2c_ack; //посылаем в шину адрес записываемой ячейки i2c_write(data); //посылаем данные для записи i2c_stop(); //посылаем команду "стоп" }
Соответственно, процедура i2c_write - должна возвращать признак ACK. А процедура i2c_ack, наверное, - лишняя.

Последний раз редактировалось ForcePoint; 10.09.2011 в 13:38. Причина: Добавлен последний абзац.
ForcePoint вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с микроконтроллером igor140329 Микроконтроллеры, АЦП, память и т.д 7 07.03.2011 03:27
Немецкая схемотехника. Помогите разобраться Luzkov TTL и CMOS логика 23 05.01.2011 11:13
[Решено] Помогите разобраться barbuss Proteus 2 26.10.2010 23:45
Помогите разобраться ,АЦП Тину 13, что то не так... Botan Микроконтроллеры, АЦП, память и т.д 2 14.09.2010 18:31
Помогите разобраться с транзисторами в Proteus`е EsterniTY Proteus 2 05.08.2004 00:18


Часовой пояс GMT +4, время: 21:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.