roboforum.ru

Технический форум по робототехнике.
Текущее время: 21 май 2025, 15:38

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 28 дек 2009, 15:05 
Не в сети
Аватара пользователя

Зарегистрирован: 07 сен 2009, 20:06
Сообщения: 333
прог. языки: c, c#
ФИО: Евгений
Добрый день!
Ане подкинете примерчик работы с 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
СообщениеДобавлено: 28 дек 2009, 16:12 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 28 дек 2009, 16:50 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 28 дек 2009, 23:34 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
osc писал(а):
Только что додумался поискать в гугле


Еще help есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 08 апр 2010, 14:04 
Не в сети
Аватара пользователя

Зарегистрирован: 11 июл 2008, 22:43
Сообщения: 134
Откуда: Воронежск
прог. языки: С, Delphi, Asm
Пробую запустить в 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);         
          };
      };
}

_________________
GIRUGAMESH!


Последний раз редактировалось Vooon 08 апр 2010, 23:07, всего редактировалось 1 раз.
[code=cpp] !!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 09 апр 2010, 11:14 
Не в сети
Аватара пользователя

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

_________________
GIRUGAMESH!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 09 апр 2010, 13:24 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2009, 13:37
Сообщения: 750
Откуда: Porto Franco "Odessa"
прицепи свой проект протеуса

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 09 апр 2010, 13:47 
Не в сети
Аватара пользователя

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


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

_________________
GIRUGAMESH!
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 09 апр 2010, 22:58 
Не в сети
Аватара пользователя

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

_________________
die Wahrheit ist irgendwo da draußen


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 09 апр 2010, 23:36 
Не в сети
Аватара пользователя

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

_________________
GIRUGAMESH!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 02 сен 2010, 13:09 
Не в сети

Зарегистрирован: 24 янв 2010, 00:09
Сообщения: 18
Откуда: саратов
Цитата:
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
24cXX.JPG [ 82.35 КиБ | Просмотров: 3112 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с EEPROM типа 24CXXX
СообщениеДобавлено: 02 сен 2010, 14:12 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
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ß.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 4 часа


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

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


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO