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

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

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

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

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

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

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

 
Опции темы
Непрочитано 16.04.2007, 03:41  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

mdn_tec легко сдаешся
вот я сделал на асамблере https://kazus.ru/forum/topic_6656-0-asc-0.html
и почитай еще книжку http://lord-n.narod.ru/download/book...siyah.2002.rar
там много чего есть про шину i2c
заодно и книги посмотри на этом сайте http://lord-n.narod.ru/walla.html
Реклама:
CERGEI1982 вне форума  
Непрочитано 16.04.2007, 19:16  
Gemes
Частый гость
 
Регистрация: 01.04.2007
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Gemes на пути к лучшему
По умолчанию

Пример работы шины I2C с P16F84A на АСМе;
Инициилизация контролера
#define SDA PORTA,0;
#define SCL PORTA,1;
org 0x00;
BEGIN:
......
bsf STATUS,RP0;банк 1
movlw 0x03; Разряды RA0(SDA) и RA1(SCL) на вход
movwf PORTA; к шине подключаем по 1 резистору по 1к
bcf STATUS,RP0; тем самым подтягиваем;
clrf PORTA;вверх(исходное состояние)
......

START : ; команда старт
bsf STATUS,RP0;
bcf SDA;устанавливаем низкий уровень
bcf SCL;
bcf STATUS,RP0;
STOP : ;команда стоп
bsf STATUS,RP0;
bsf SCL;
nop;
bsf SDA;
bcf STATUS,RP0;

WRITE:
movlw 0x80;Счетчик переданых битов
movwf COUNTBIT;
movf EEDATE,W;в EEDATE передаваемый байт
movwf EECOPY; в EECOPY времено хранимый байт
TX:
btfsc EECOPY,7;Первый передаваемый байт старший
call SET_1;
btfss EECOPY,7;
call SET_0;
call RESETSCL;
call RESETSDA;
bcf STATUS,C;
rrf COUNTBIT,F;
btfsc STATUS,C;
goto ASC; если передано 8 битов то
rlf EECOPY,F; иначе пвторяем передачу бита
goto TX;
SET_0:
bsf STATUS,RP0;
call RESETSDA;
call SETSCL;
bcf STATUS,RP0;
return;
SET_1:
bsf STATUS,RP0;
call SETSDA;
call SETSCL;
bcf STATUS,RP0;
return;
ASC: ;
call SETSDA;
call SETSCL;
btfsc SDA; если нет потверждения отведущего
goto NoASC; повторяем
call RESETSDA;
call RESETSCL;

return; конец передачи
NoASC:
goto WRITE;

SETSCL:
bsf STATUS,RP0;
bsf SCL;
bcf STATUS,RP0;
return;
RESETSCL:
bsf STATUS,RP0;
bcf SCL;
bcf STATUS,RP0;
return;
SETSDA:
bsf STATUS,RP0;
bsf SDA;
bcf STATUS,RP0;
return;
RESETSDA:
bsf STATUS,RP0;
bcf SDA;
bcf STATUS,RP0;
return;
Сперва передаем формат ведомого
0xA0 на запись в EEPROM
0xA1 чтение из EEPROM
если в режиме записи то следом
адрес 1 или 2 байта той ячейки в которую надо писать
следом данные в зависимости от типа памяти не более 8 или 16 байтов
потом стоп

если в режим чтения то следом читаешь здесь не приведено
могу разместить рабочий вариант .Правда
коментарри писать влом
Gemes вне форума  
Непрочитано 16.04.2007, 22:40  
mdn_tec
Частый гость
 
Регистрация: 31.01.2007
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mdn_tec на пути к лучшему
По умолчанию

Спасибо за пример,
я тут немного посидел в С для AVR, написал небольшую программку(первую свою, откомпилированую на С), пользуясь приведённым ранее примером.
Потом решил её протестить в Proteus. Взял 24с02, 90s2313, отладчик I2C. С помощью программы вставил в память микросхемы набор AA,AA,AA,AA...
начал читать, а читается непонятно что.
Скажите, это так устроена Proteus, или что-то в программе?
mdn_tec вне форума  
Непрочитано 16.04.2007, 22:48  
mdn_tec
Частый гость
 
Регистрация: 31.01.2007
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mdn_tec на пути к лучшему
По умолчанию

#include ‹delay.h›
#include ‹MEGA8.H›
#asm
.equ __i2c_port=0x18
.equ __sda_bit=3
.equ __scl_bit=4
#endasm
#include ‹i2c.h›


#define EEPROM_BUS_ADDRESS 0xa0
void eeprom_write(unsigned int address, unsigned char data) {

i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address››8);
i2c_write(address & 0x00FF);
i2c_write(data);
i2c_stop();
delay_ms(5);
}


unsigned char eeprom_read(unsigned int address) {
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write(address››8);
i2c_write(address & 0x00FF);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
return data;
}







void main(void)
{
DDRD=0xff ;
DDRC=0xff ;
PORTD=eeprom_read(0x0000);
}
mdn_tec вне форума  
Непрочитано 16.04.2007, 22:56  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

В памяти 24с02 один байт адреcа, а в исходнике 2, поэтому и не работает
dimonbest вне форума  
Непрочитано 16.04.2007, 23:11  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Попробуй взять память AT24C512 и все должно получится
dimonbest вне форума  
Непрочитано 17.04.2007, 11:10  
ShuRusu
Частый гость
 
Регистрация: 27.09.2006
Сообщений: 25
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ShuRusu на пути к лучшему
По умолчанию

На сайтах www.microchip.ru и www.microchip.com есть готовые примеры работы с I2C, библиотека и описание функций распространяется бесплатно. Там же есть рекомендации по выбору подтягивающего резистора. Зачем изобретать велосипед

Кстати, для того чтобы правильно эмулировать выход с открытым коллектором (что есть правильно при работе с данной шиной) на PICах нужно работать на с регистрами порта (PORTх, GPIO) а с регистрами состояния порта (TRISх, TRISIO). В регистры (PORTх, GPIO) в соответсвующие биты ножно прописать 0. Иначе, в лучшем случае, ничего работать не будет .[/b]
ShuRusu вне форума  
Непрочитано 17.04.2007, 11:22  
mdn_tec
Частый гость
 
Регистрация: 31.01.2007
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
mdn_tec на пути к лучшему
По умолчанию

В моей программе такой модели не оазалось, но прочитать по адресу в 24с02 0x0000
AA мне удалось. А вот дальше уже не те данные. Скажите, данные в памяти
представлены как просто адрес байта (скажем 1 байт-0x01, второй 0x02 и т. д.), или
как таблица (1 байт-0x00-строка и 00-столбец, т. е. 1 б.-0x0000 2 б.-0x0001). Просто даные я создаю через программатор (вернее программу для него), поэтому уже совсем запутался-там таблица.
mdn_tec вне форума  
Непрочитано 17.04.2007, 11:32  
dimonbest
Гражданин KAZUS.RU
 
Аватар для dimonbest
 
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
dimonbest на пути к лучшему
По умолчанию

Вот пример работы именно с этой памятью:
Код:
Example how to access an Atmel 24C02 256 byte I2C EEPROM:


/* 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 ‹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;

/* 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);

while (1); /* loop forever */
}
Данные линейные, не таблица
dimonbest вне форума  
Непрочитано 17.04.2007, 15:56  
Gemes
Частый гость
 
Регистрация: 01.04.2007
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Gemes на пути к лучшему
По умолчанию

mdn_tec у тебя наверно после операции чтения первый байт 0xAA,а следущие за ним 0xFF?
Тогда тебе надо лучше читать HELP CODE VISION.
Скорее всего при чтение EEPROM ты не потверждаешь принятия байта!
у тебя = data=i2c_read(0);
а надо data=i2c_read(1);
у функции unsigned char i2c_read(unsigned char ack)
есть параметр (unsigned char ack)
0 прием без потверждения принятия байта
1 прием с потверждением принятия байта
Gemes вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mega 8 + TWI (I2C) Slave Помогите. west1111 Микроконтроллеры, АЦП, память и т.д 46 10.07.2013 01:40
?-быстродействие I2C giran Микроконтроллеры, АЦП, память и т.д 1 15.05.2007 15:14
Помогите разобраться с внешней памятью по I2C graham Микроконтроллеры, АЦП, память и т.д 3 16.12.2005 17:01
I2C chipic128 Микроконтроллеры, АЦП, память и т.д 4 23.02.2005 02:19
I2C zevs Микроконтроллеры, АЦП, память и т.д 0 11.01.2005 16:11


Часовой пояс GMT +4, время: 05:25.


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