Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибки при записи во внешнюю eeprom
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Xenom0rph
Такая проблема подключена у меня к тини2313 eeprom 24c256, мне требуется писать туда массивы по 50 байт.

Вот так проходит настройка I2С
Код
[/*SETUP PORTB I2C (PB4 - SDA; PB3 - SCL)*/
#asm
   .equ __i2c_port=0x18;PORTB
   .equ __sda_bit=4
   .equ __scl_bit=3
#endasm            

#include <tiny2313.h>
#include <delay.h>
#include <i2c.h>    
#define EEPROM_BUS_ADDRESS 0xa0x


Так пишет
Код
void eeprom_write(unsigned int address, unsigned char data)
{
unsigned char sSREG;
sSREG = SREG;
#asm("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>8);
i2c_write((unsigned char)address);
i2c_write(data);
i2c_stop();    
SREG=sSREG;
delay_ms(11);
}


Так читает:
Код
unsigned char eeprom_read(unsigned int address)
{
unsigned char data;
unsigned char sSREG;
sSREG=SREG;
#asm("cli")
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS);
i2c_write((unsigned char)address>>8);
i2c_write((unsigned char)address);
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS | 1);
data=i2c_read(0);
i2c_stop();
SREG = sSREG;
#asm("sei")
return data;
}


в цикле я записываю так eeprom_write(n, mass[i])

Так вот, дает он мне записать только 200 байтов, потом происходит непонятно что и он опять начинает писать с первой ячейки затирая всю информацию.
SysRq
Код
(unsigned char)address>>8
Это всегда будет ноль rolleyes.gif
Xenom0rph
Цитата(SysRq @ Nov 27 2008, 17:18) *
Код
(unsigned char)address>>8
Это всегда будет ноль rolleyes.gif

Да кстати, компилятор, тоже мне это говорил только я на это не обращал внимание, пример кода я взял, с этого форума, было написанно что рабочий, тогда не подскажете как правильно??? что то я другие способы пробовал, какие нашел, так он вообще ни чего не пишет
SysRq
Цитата(Xenom0rph @ Nov 27 2008, 18:36) *
тогда не подскажете как правильно???

Код
(unsigned char)(address>>8)
rezident
Цитата(Xenom0rph @ Nov 27 2008, 20:36) *
тогда не подскажете как правильно???
У вас переменная address при передаче ее в функции eeprom_write и eeprom_read имеет тип unsigned int. Если в функции i2c_write передеваемый ей параметр имеет тип unsigned char, то приводить аргумент в принципе не обязательно, компилятор сам должен привести значение переменной к этому типу до передачи ее в функцию. Если же вы все-таки сомневаетесь и хотите перестраховаться (ничего зазорного в этом нет!), то напишите так
Код
i2c_write ((unsigned char)(address>>8));
Xenom0rph
Цитата(rezident @ Nov 27 2008, 19:18) *
У вас переменная address при передаче ее в функции eeprom_write и eeprom_read имеет тип unsigned int. Если в функции i2c_write передеваемый ей параметр имеет тип unsigned char, то приводить аргумент в принципе не обязательно, компилятор сам должен привести значение переменной к этому типу до передачи ее в функцию. Если же вы все-таки сомневаетесь и хотите перестраховаться (ничего зазорного в этом нет!), то напишите так
Код
i2c_write ((unsigned char)(address>>8));


Что то вы меня совсем запутали
Код
i2c_write ((unsigned char)(address>>8));

Вот так вот не работает(у меня так и было)
Код
i2c_write (address>>8);

А вот так вот работает !!!
2SysRq огромное спасибо который раз меня выручаешь!
Сергей Борщ
Цитата(Xenom0rph @ Nov 27 2008, 18:46) *
Код
i2c_write ((unsigned char)(address>>8));
Вот так вот не работает(у меня так и было)

Сравнивайте внимательнее, у вас к unsigned char приводился address перед сдвигом, а не результат сдвига:
Цитата(Xenom0rph @ Nov 27 2008, 14:40) *
Код
i2c_write((unsigned char)address>>8);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.