roboforum.ru

Технический форум по робототехнике.

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

Работа с 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

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

Michael_K » 28 дек 2009, 16:12

это типа дефайнов для ассемблера

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

osc » 28 дек 2009, 16:50

Спасиб, чуток прояснилось

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

avr123.nm.ru » 28 дек 2009, 23:34

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


Еще help есть.

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] !!!

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

TrashVigor » 09 апр 2010, 11:14

Может у кого есть рабочий пример в PROTEUS? Плиз оч нужно!!!

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

Romikgy » 09 апр 2010, 13:24

прицепи свой проект протеуса

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

TrashVigor » 09 апр 2010, 13:47

Вот
Вложения
eeprom.zip
(18.95 КиБ) Скачиваний: 0

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

Romikgy » 09 апр 2010, 22:58

все оказалалось до банального просто , еепромка не успевает давать корректный ответ на 16 Мгц
снизь частоту до 12 и всебудет работать или надо расчитать задержки

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

TrashVigor » 09 апр 2010, 23:36

Спасибо! Действительно бонально просто! :)

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

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

Grem » 02 сен 2010, 14:12

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

в чем проблема? Создавать и редактировать страницы может каждый представившийся.


Rambler\'s Top100 Mail.ru counter