реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Ошибки при записи во внешнюю eeprom, Копирует записанные байты по всей eeprom
Xenom0rph
сообщение Nov 27 2008, 12:40
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Такая проблема подключена у меня к тини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 байтов, потом происходит непонятно что и он опять начинает писать с первой ячейки затирая всю информацию.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 27 2008, 14:18
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Код
(unsigned char)address>>8
Это всегда будет ноль rolleyes.gif
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Nov 27 2008, 15:36
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(SysRq @ Nov 27 2008, 17:18) *
Код
(unsigned char)address>>8
Это всегда будет ноль rolleyes.gif

Да кстати, компилятор, тоже мне это говорил только я на это не обращал внимание, пример кода я взял, с этого форума, было написанно что рабочий, тогда не подскажете как правильно??? что то я другие способы пробовал, какие нашел, так он вообще ни чего не пишет
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 27 2008, 16:15
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(Xenom0rph @ Nov 27 2008, 18:36) *
тогда не подскажете как правильно???

Код
(unsigned char)(address>>8)
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 27 2008, 16:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Xenom0rph @ Nov 27 2008, 20:36) *
тогда не подскажете как правильно???
У вас переменная address при передаче ее в функции eeprom_write и eeprom_read имеет тип unsigned int. Если в функции i2c_write передеваемый ей параметр имеет тип unsigned char, то приводить аргумент в принципе не обязательно, компилятор сам должен привести значение переменной к этому типу до передачи ее в функцию. Если же вы все-таки сомневаетесь и хотите перестраховаться (ничего зазорного в этом нет!), то напишите так
Код
i2c_write ((unsigned char)(address>>8));
Go to the top of the page
 
+Quote Post
Xenom0rph
сообщение Nov 27 2008, 16:46
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 85
Регистрация: 2-10-08
Пользователь №: 40 646



Цитата(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 огромное спасибо который раз меня выручаешь!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 27 2008, 22:53
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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);


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016