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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,953
Сказал спасибо: 2,994
Сказали Спасибо 3,174 раз(а) в 2,154 сообщении(ях)
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, время: 20:00.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot