Сообщение от 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]