Работа с EEPROM типа 24CXXX

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Работа с EEPROM типа 24CXXX

Сообщение osc » 28 дек 2009, 15:05

Добрый день!
Ане подкинете примерчик работы с eeprom типа 24СХХХ в Code Vision Avr ?
В интернете искал, честно, на си не нашел, нашел только на ассемблере и то случайно...

Добавлено спустя 4 минуты 26 секунд:
Только что додумался поискать в гугле вводя английские запросы, кое что нашел :roll:
Код: Выделить всё
* the I2C bus is connected to PORTB */

/* the SDA signal is bit 3*/

/* the SCL signal is bit 4 */

#asm

.equ __i2c_port=0x18

.equ __sda_bit=3

.equ __scl_bit=4

#endasm

/* now you can include the I2C Functions */

#include <mega16.h>
#include <i2c.h>

/* function declaration for delay_ms */
#include <delay.h>

#define EEPROM_BUS_ADDRESS 0xa0

/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}

/* write a byte to the EEPROM */
void eeprom_write(unsigned char address, unsigned char data) {

i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();

/* 10ms delay to complete the write operation */
delay_ms(10);
}


void main(void) {

unsigned char i;

DDRD = 0xff;
PORTD = 0x00;

delay_ms(1000);

/* initialize the I2C bus */
i2c_init();

/* write the byte 55h at address AAh */
eeprom_write(0xaa,0x55);

/* read the byte from address AAh */
i=eeprom_read(0xaa);
PORTD = i;

while (1); /* loop forever */
}


Добавлено спустя 14 минут 24 секунды:
А можете пояснить что значат эти строки:
Код: Выделить всё
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: Работа с EEPROM типа 24CXXX

Сообщение Michael_K » 28 дек 2009, 16:12

это типа дефайнов для ассемблера
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Работа с EEPROM типа 24CXXX

Сообщение osc » 28 дек 2009, 16:50

Спасиб, чуток прояснилось
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: Работа с EEPROM типа 24CXXX

Сообщение avr123.nm.ru » 28 дек 2009, 23:34

osc писал(а): Только что додумался поискать в гугле


Еще help есть.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Работа с EEPROM типа 24CXXX

Сообщение TrashVigor » 08 апр 2010, 14:04

Пробую запустить в PROTEUS EEPROM at24c512 запись идет, а вот не читает то что записал, где ошибка?

Код: Выделить всё
#include <mega32.h>
#include <delay.h>
// I2C Bus functions
#asm
   .equ __i2c_port=0x1B ;PORTA
   .equ __sda_bit=0
   .equ __scl_bit=1
#endasm
#include <i2c.h>

// Declare your global variables here
#define EEPROM_BUS_ADDRESS 0xA0

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

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

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0b00010000;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization
i2c_init();
eep_write(0x00,0x01,0x8F); 
                       
                       
while (1)
      {
      // Place your code here
       delay_ms(300);
          if(eep_read(0x00,0x01)==0x8F){     
             
               PORTB.4=1;               
               delay_ms(1000);         
          };
      };
}
Последний раз редактировалось Vooon 08 апр 2010, 23:07, всего редактировалось 1 раз.
Причина: [code=cpp] !!!
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm

Re: Работа с EEPROM типа 24CXXX

Сообщение TrashVigor » 09 апр 2010, 11:14

Может у кого есть рабочий пример в PROTEUS? Плиз оч нужно!!!
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm

Re: Работа с EEPROM типа 24CXXX

Сообщение Romikgy » 09 апр 2010, 13:24

прицепи свой проект протеуса
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Работа с EEPROM типа 24CXXX

Сообщение TrashVigor » 09 апр 2010, 13:47

Вот
Вложения
eeprom.zip
(18.95 КиБ) Скачиваний: 0
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm

Re: Работа с EEPROM типа 24CXXX

Сообщение Romikgy » 09 апр 2010, 22:58

все оказалалось до банального просто , еепромка не успевает давать корректный ответ на 16 Мгц
снизь частоту до 12 и всебудет работать или надо расчитать задержки
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Работа с EEPROM типа 24CXXX

Сообщение TrashVigor » 09 апр 2010, 23:36

Спасибо! Действительно бонально просто! :)
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm

Re: Работа с EEPROM типа 24CXXX

Сообщение skorpionm » 02 сен 2010, 13:09

i2c_write(EEPROM_BUS_ADDRESS | 1); //незнаю зачем но без этого не работает

из дадашита смотри вложенный файло
видно что если послать сразу послать А1 то будет читать ее с начала.

сначало идет посыл адреса A0 потому устанавливается адрес посылает A1. То есть переводит ееромку в режим чтения.

по даташиту адрес ееромок 1010(Е2)(Е1)(Е0)(R/W). R/W как раз и показывает чоты хочешь с ней делать 0- писать 1 -читать.
(Е2)(Е1)(Е0) это выводы на самой ееромке если они все подключены к массе то (Е2)(Е1)(Е0) все равны 0 и следовательно адрес этой ееромки будет 10100000 или A0, для записи а для перевода в режим чтения 10100001 или А1.
если допустим подключить какой нить из (Е2)(Е1)(Е0) на + питания. допустим Е0 то адрес ееромки станет НЕ А0, а 10100010 тоесть А2 следовательно для перевода ее в режим чтения нужно послать 10100011 или А3. и так далее
вариации с (Е2)(Е1)(Е0) ведет к тому что на шину можно повесить до 8 штук ееромок с разными адресами :) сам только что разобрался

вот только не пойму не как пока зам посылать 2 раза адресс ячейки?


и вообще мне кажется нужно добавить в вики РАБОТА С ЕЕРОМ все доскональна расписано и понятно
Вложения
24cXX.JPG
skorpionm
 
Сообщения: 18
Зарегистрирован: 24 янв 2010, 00:09
Откуда: саратов

Re: Работа с EEPROM типа 24CXXX

Сообщение Grem » 02 сен 2010, 14:12

skorpionm писал(а):вообще мне кажется нужно добавить в вики РАБОТА С ЕЕРОМ все доскональна расписано и понятно

в чем проблема? Создавать и редактировать страницы может каждый представившийся.
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28