Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.04.2007, 19:16
|
|
Частый гость
Регистрация: 01.04.2007
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Пример работы шины 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 байтов
потом стоп
если в режим чтения то следом читаешь здесь не приведено
могу разместить рабочий вариант .Правда
коментарри писать влом
|
|
|
|
16.04.2007, 22:40
|
|
Частый гость
Регистрация: 31.01.2007
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Спасибо за пример,
я тут немного посидел в С для AVR, написал небольшую программку(первую свою, откомпилированую на С), пользуясь приведённым ранее примером.
Потом решил её протестить в Proteus. Взял 24с02, 90s2313, отладчик I2C. С помощью программы вставил в память микросхемы набор AA,AA,AA,AA...
начал читать, а читается непонятно что.
Скажите, это так устроена Proteus, или что-то в программе?
|
|
|
|
16.04.2007, 22:48
|
|
Частый гость
Регистрация: 31.01.2007
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
#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);
}
|
|
|
|
16.04.2007, 22:56
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
В памяти 24с02 один байт адреcа, а в исходнике 2, поэтому и не работает
|
|
|
|
16.04.2007, 23:11
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Попробуй взять память AT24C512 и все должно получится
|
|
|
|
17.04.2007, 11:10
|
|
Частый гость
Регистрация: 27.09.2006
Сообщений: 25
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
На сайтах www.microchip.ru и www.microchip.com есть готовые примеры работы с I2C, библиотека и описание функций распространяется бесплатно. Там же есть рекомендации по выбору подтягивающего резистора. Зачем изобретать велосипед
Кстати, для того чтобы правильно эмулировать выход с открытым коллектором (что есть правильно при работе с данной шиной) на PICах нужно работать на с регистрами порта (PORTх, GPIO) а с регистрами состояния порта (TRISх, TRISIO). В регистры (PORTх, GPIO) в соответсвующие биты ножно прописать 0. Иначе, в лучшем случае, ничего работать не будет ![Смешно](images/smilies/icon_lol.gif) .[/b]
|
|
|
|
17.04.2007, 11:22
|
|
Частый гость
Регистрация: 31.01.2007
Сообщений: 15
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
В моей программе такой модели не оазалось, но прочитать по адресу в 24с02 0x0000
AA мне удалось. А вот дальше уже не те данные. Скажите, данные в памяти
представлены как просто адрес байта (скажем 1 байт-0x01, второй 0x02 и т. д.), или
как таблица (1 байт-0x00-строка и 00-столбец, т. е. 1 б.-0x0000 2 б.-0x0001). Просто даные я создаю через программатор (вернее программу для него), поэтому уже совсем запутался-там таблица.
|
|
|
|
17.04.2007, 11:32
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Вот пример работы именно с этой памятью:
Код:
|
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 */
} |
Данные линейные, не таблица
|
|
|
|
17.04.2007, 15:56
|
|
Частый гость
Регистрация: 01.04.2007
Сообщений: 10
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 прием с потверждением принятия байта
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|