Здравствуйте форумчане Кто может сделать под заказ библиотеку под микросхемы еепром 24LC256 для записи: 2, 4 байт чисел? Сколько это будет стоить? Компилятор:Codevisionavr v.3.12
Готовая библиотека 1-байт. Её нужно доработать, что бы можно 2, 4 байта записывать в память
Код:
#define EEPROM_BUS_ADDRESS 0xa0 // Tyt stavim adress for EEPROM
Вверху вы написали, что есть готовая библиотека её надо доработать, не о каких float там речи нет, речь только о байтах. Прошлое сообщение всерьёз восприняли, серьёзно? Там пару строчек добавить так же в функцию read и будет работать с любым количеством байт.
Добавлено after 4 minutes 7 seconds: Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? int от -32768 до 32767 long int от -2147483648 до 2147483647
Лучше так как выше написал, через указатель и количество байт, ну если очень надо, но реализация так себе, все функции по всей видимости работают на ожидании: Спойлер
Код:
/* Чтение int из памяти EEPROM */ int eeplc24_read(unsigned char address_high, unsigned char address_low) { int data; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_start(); i2c_write(EEPROM_BUS_ADDRESS | 1); data = (((int)i2c_read(0))<<8) & 0xFF00; data |= i2c_read(0) & 0xFF; i2c_stop(); return data; }
/* Запись int в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, int data) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_write((data>>8) & 0xFF); i2c_write(data & 0xFF); i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(7); }
/* Чтение long int из памяти EEPROM */ long int eeplc24_read(unsigned char address_high, unsigned char address_low) { int data; i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_start(); i2c_write(EEPROM_BUS_ADDRESS | 1); data = (((long int)i2c_read(0))<<24) & 0xFF000000; data |= (((long int)i2c_read(0))<<16) & 0xFF0000; data |= (((long int)i2c_read(0))<<8) & 0xFF00; data |= i2c_read(0) & 0xFF; i2c_stop(); return data; }
/* Запись long int в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, long int data) { i2c_start(); i2c_write(EEPROM_BUS_ADDRESS); i2c_write(address_high); i2c_write(address_low); i2c_write((data>>24) & 0xFF); i2c_write((data>>16) & 0xFF); i2c_write((data>>8) & 0xFF); i2c_write(data & 0xFF); i2c_stop(); /* 10ms delay to complete the write operation */ delay_ms(7); }
В функции eeplc24_write параметр data поидее компилятор сам приведёт к uint8, но если ругаться будет приведёте.
ELECTROS, ваши функции на запись работать могут с ошибками, причем очень неприятными для содержимого микросхем. вы забыли, что запись ведется постранично...
вот так будет работать, но медленно:
Код:
// это то, что уже есть unsigned char eeplc24_read(unsigned char address_high, unsigned char address_low); void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data);
// это функция чтения любого числа, массива и т.п. void eeplc24_read_block(void *dest, unsigned int eadr, unsigned int len){ unsigned char * ptr = dest; while(len--){ *ptr++ = eeplc24_read(eadr>>8, eadr); eadr++; } }
// это функция записи любого числа, массива и т.п. void eeplc24_write_block(void *src, unsigned int eadr, unsigned int len){ unsigned char * ptr = src; while(len--){ eeplc24_write(eadr>>8, eadr, *ptr++); eadr++; } }
// запись float по адресу 123 float data = 0.12E-3; eeplc24_write_block(&data, 123, sizeof(float));
ARV, гляну а ж даташит интересно стало. Байт записать можно а больше нельзя, странно. Пы.сы. Ведь точно, считать можно как хочешь а записать только один байт или всю страницу.
Последний раз редактировалось ELECTROS Пт май 08, 2020 09:42:54, всего редактировалось 1 раз.
// это функция чтения любого числа, массива и т.п. void eeplc24_read_block(void *dest, unsigned int eadr, unsigned int len){ unsigned char * ptr = dest; while(len--){ *ptr++ = eeplc24_read(eadr>>8, eadr); eadr++; } }
// это функция записи любого числа, массива и т.п. void eeplc24_write_block(void *src, unsigned int eadr, unsigned int len){ unsigned char * ptr = src; while(len--){ eeplc24_write(eadr>>8, eadr, *ptr++); eadr++; } }
скажите, можно ли эти функции вставить в библиотеку? скажите как правильно вызвать? что означает указатель на переменную *dest ; *src ?.
Указатель на переменную означает, внезапно, что это указатель на переменную. Букварь читать. И да, там рядом про приоритеты операций тоже написано, тоже внимательно изучите.
Я же привёл примеры того, как использовать функции! Не знаю, что вы имеете ввиду под "библиотекой", но я бы просто вынес их в отдельный сишный файл, который бы просто добавлял к нужным проектам, да и все. Можно ещё сделать заголовочный файл, в котором просто написать прототипы этих функций...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
/* запись в память EEPROM */ void eeplc24_write(unsigned char address_high, unsigned char address_low, unsigned char data);
// это функция чтения любого числа, массива и т.п. void eeplc24_read_block(void *dest, unsigned int eadr, unsigned int len){ unsigned char * ptr = dest; while(len--){ *ptr++ = eeplc24_read(eadr>>8, eadr); eadr++; } }
// это функция записи любого числа, массива и т.п. void eeplc24_write_block(void *src, unsigned int eadr, unsigned int len){ unsigned char * ptr = src; while(len--){ eeplc24_write(eadr>>8, eadr, *ptr++); eadr++; } }
#pragma used-
#pragma library 24lcxx.lib
#endif
Добавлено after 5 minutes 25 seconds: Re: Библиотека CVAVR EEPROM 24LC256 для записи: 2, 4 байт чисел? библиотека это и есть отдельный файл, который привязывается к сишному файлу 24lcXX.lib 24lcXX.h
Ну вообще то грубо говоря *.lib это закрытый *.с. Имея исходник, lib файл сделать легко, поэтому тут разговоры ни о чём на этот счёт. По мне так это нужно в одном случае - если отдаётся на сторону весь проект и не хочется светить отдельные его части.
CAT86 Давай те с начало, говорите не работает. А с теми функциями которые вначале приводили работает? Как вы используете функции пример приведите. Поясните что значит передаётся один байт? (может и не то но всё же: как бы передача и будет идти по одному байту, но по инкрементируемому адресу, столько раз сколько укажите).
ATON, я про указатели понял еще после первого своего сообщения .
Последний раз редактировалось ELECTROS Пт май 08, 2020 22:48:52, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения